diff --git a/rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/builder.rs b/rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/builder.rs index cfa31f1f7fa4e..8cf9e2e587fcb 100644 --- a/rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/builder.rs +++ b/rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/builder.rs @@ -232,12 +232,25 @@ impl PhysicalPlanBuilder { ) -> Result, CubeError> { let mut result = Vec::new(); for o in order_by.iter() { - for position in logical_schema.find_member_positions(&o.name()) { + let positions = logical_schema.find_member_positions(&o.name()); + + // TODO: Check for `is_measure` is temporary here until + // correct processing of order by dimension that is not included in the + // selection list will be implemented + if positions.is_empty() && o.member_symbol().is_measure() { result.push(OrderBy::new( Expr::Member(MemberExpression::new(o.member_symbol())), - position + 1, + 0, o.desc(), )); + } else { + for position in positions { + result.push(OrderBy::new( + Expr::Member(MemberExpression::new(o.member_symbol())), + position + 1, + o.desc(), + )); + } } } Ok(result) diff --git a/rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs b/rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs index bba7d3a94043b..4cce336f39d50 100644 --- a/rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs +++ b/rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs @@ -523,6 +523,7 @@ impl QueryProperties { self.query_tools.clone(), &self.measures, &self.dimensions, + &self.extract_dimensions_from_order(), &self.time_dimensions, &self.time_dimensions_filters, &self.dimensions_filters, @@ -541,6 +542,7 @@ impl QueryProperties { self.query_tools.clone(), measures, &self.dimensions, + &self.extract_dimensions_from_order(), &self.time_dimensions, &self.time_dimensions_filters, &self.dimensions_filters, @@ -553,11 +555,25 @@ impl QueryProperties { self.total_query } + fn extract_dimensions_from_order(&self) -> Vec> { + self.order_by + .iter() + .filter_map(|order| { + if order.member_evaluator.as_dimension().is_ok() { + Some(order.member_evaluator.clone()) + } else { + None + } + }) + .collect() + } + pub fn compute_join_multi_fact_groups( query_join_hints: Rc>, query_tools: Rc, measures: &Vec>, dimensions: &Vec>, + order_dimensions: &Vec>, time_dimensions: &Vec>, time_dimensions_filters: &Vec, dimensions_filters: &Vec, @@ -567,6 +583,9 @@ impl QueryProperties { let dimensions_join_hints = query_tools .cached_data_mut() .join_hints_for_member_symbol_vec(&dimensions)?; + let order_dimensions_join_hints = query_tools + .cached_data_mut() + .join_hints_for_member_symbol_vec(&order_dimensions)?; let time_dimensions_join_hints = query_tools .cached_data_mut() .join_hints_for_member_symbol_vec(&time_dimensions)?; @@ -586,6 +605,7 @@ impl QueryProperties { let mut dimension_and_filter_join_hints_concat = vec![query_join_hints]; dimension_and_filter_join_hints_concat.extend(dimensions_join_hints.into_iter()); + dimension_and_filter_join_hints_concat.extend(order_dimensions_join_hints.into_iter()); dimension_and_filter_join_hints_concat.extend(time_dimensions_join_hints.into_iter()); dimension_and_filter_join_hints_concat .extend(time_dimensions_filters_join_hints.into_iter()); @@ -936,6 +956,16 @@ impl QueryProperties { for item in self.measures_filters.iter() { self.fill_missed_measures_from_filter(item, &mut measures)?; } + for item in self.order_by.iter() { + if let Ok(measure) = item.member_evaluator.as_measure() { + if !measures + .iter() + .any(|m| m.full_name() == measure.full_name()) + { + measures.push(item.member_evaluator.clone()); + } + } + } Ok(measures) }