Skip to content

Commit 2efb5ec

Browse files
KSDaemonwaralexrom
andauthored
feat(tesseract): Support order by measure not included in the select list (#10218)
* tesseract standalone order by * update make_order_by() to include members without positions * fix make_order_by() for measures --------- Co-authored-by: Aleksandr Romanenko <alex.romanenko@cube.dev>
1 parent 2d6e923 commit 2efb5ec

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/builder.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,25 @@ impl PhysicalPlanBuilder {
232232
) -> Result<Vec<OrderBy>, CubeError> {
233233
let mut result = Vec::new();
234234
for o in order_by.iter() {
235-
for position in logical_schema.find_member_positions(&o.name()) {
235+
let positions = logical_schema.find_member_positions(&o.name());
236+
237+
// TODO: Check for `is_measure` is temporary here until
238+
// correct processing of order by dimension that is not included in the
239+
// selection list will be implemented
240+
if positions.is_empty() && o.member_symbol().is_measure() {
236241
result.push(OrderBy::new(
237242
Expr::Member(MemberExpression::new(o.member_symbol())),
238-
position + 1,
243+
0,
239244
o.desc(),
240245
));
246+
} else {
247+
for position in positions {
248+
result.push(OrderBy::new(
249+
Expr::Member(MemberExpression::new(o.member_symbol())),
250+
position + 1,
251+
o.desc(),
252+
));
253+
}
241254
}
242255
}
243256
Ok(result)

rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ impl QueryProperties {
523523
self.query_tools.clone(),
524524
&self.measures,
525525
&self.dimensions,
526+
&self.extract_dimensions_from_order(),
526527
&self.time_dimensions,
527528
&self.time_dimensions_filters,
528529
&self.dimensions_filters,
@@ -541,6 +542,7 @@ impl QueryProperties {
541542
self.query_tools.clone(),
542543
measures,
543544
&self.dimensions,
545+
&self.extract_dimensions_from_order(),
544546
&self.time_dimensions,
545547
&self.time_dimensions_filters,
546548
&self.dimensions_filters,
@@ -553,11 +555,25 @@ impl QueryProperties {
553555
self.total_query
554556
}
555557

558+
fn extract_dimensions_from_order(&self) -> Vec<Rc<MemberSymbol>> {
559+
self.order_by
560+
.iter()
561+
.filter_map(|order| {
562+
if order.member_evaluator.as_dimension().is_ok() {
563+
Some(order.member_evaluator.clone())
564+
} else {
565+
None
566+
}
567+
})
568+
.collect()
569+
}
570+
556571
pub fn compute_join_multi_fact_groups(
557572
query_join_hints: Rc<Vec<JoinHintItem>>,
558573
query_tools: Rc<QueryTools>,
559574
measures: &Vec<Rc<MemberSymbol>>,
560575
dimensions: &Vec<Rc<MemberSymbol>>,
576+
order_dimensions: &Vec<Rc<MemberSymbol>>,
561577
time_dimensions: &Vec<Rc<MemberSymbol>>,
562578
time_dimensions_filters: &Vec<FilterItem>,
563579
dimensions_filters: &Vec<FilterItem>,
@@ -567,6 +583,9 @@ impl QueryProperties {
567583
let dimensions_join_hints = query_tools
568584
.cached_data_mut()
569585
.join_hints_for_member_symbol_vec(&dimensions)?;
586+
let order_dimensions_join_hints = query_tools
587+
.cached_data_mut()
588+
.join_hints_for_member_symbol_vec(&order_dimensions)?;
570589
let time_dimensions_join_hints = query_tools
571590
.cached_data_mut()
572591
.join_hints_for_member_symbol_vec(&time_dimensions)?;
@@ -586,6 +605,7 @@ impl QueryProperties {
586605
let mut dimension_and_filter_join_hints_concat = vec![query_join_hints];
587606

588607
dimension_and_filter_join_hints_concat.extend(dimensions_join_hints.into_iter());
608+
dimension_and_filter_join_hints_concat.extend(order_dimensions_join_hints.into_iter());
589609
dimension_and_filter_join_hints_concat.extend(time_dimensions_join_hints.into_iter());
590610
dimension_and_filter_join_hints_concat
591611
.extend(time_dimensions_filters_join_hints.into_iter());
@@ -936,6 +956,16 @@ impl QueryProperties {
936956
for item in self.measures_filters.iter() {
937957
self.fill_missed_measures_from_filter(item, &mut measures)?;
938958
}
959+
for item in self.order_by.iter() {
960+
if let Ok(measure) = item.member_evaluator.as_measure() {
961+
if !measures
962+
.iter()
963+
.any(|m| m.full_name() == measure.full_name())
964+
{
965+
measures.push(item.member_evaluator.clone());
966+
}
967+
}
968+
}
939969
Ok(measures)
940970
}
941971

0 commit comments

Comments
 (0)