Skip to content

Commit 4a4b67f

Browse files
authored
fix(tesseract): Filter by multi-stage measure (cube-js#10579)
1 parent ee788f4 commit 4a4b67f

5 files changed

Lines changed: 72 additions & 24 deletions

File tree

packages/cubejs-schema-compiler/test/integration/postgres/multi-stage.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,25 @@ views:
232232
},
233233
],
234234
{ joinGraph, cubeEvaluator, compiler }));
235+
it('multi stage measure filter', async () => dbRunner.runQueryTest({
236+
dimensions: ['orders.status'],
237+
timeDimensions: [
238+
{
239+
dimension: 'orders.date',
240+
granularity: 'year'
241+
}
242+
],
243+
filters: [
244+
{ member: 'orders.cagr_1_y', operator: 'gt', values: ['1.5'] }
245+
],
246+
timezone: 'UTC'
247+
}, [
248+
{
249+
orders__date_year: '2023-01-01T00:00:00.000Z',
250+
orders__status: 'completed',
251+
},
252+
],
253+
{ joinGraph, cubeEvaluator, compiler }));
235254
} else {
236255
// This test is working only in tesseract
237256
test.skip('multi stage over sub query', () => { expect(1).toBe(1); });

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/multi_stage_query_planner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl MultiStageQueryPlanner {
4949
> {
5050
let multi_stage_members = self
5151
.query_properties
52-
.all_members(false)
52+
.all_used_symbols()?
5353
.into_iter()
5454
.filter_map(|memb| -> Option<Result<_, CubeError>> {
5555
match has_multi_stage_members(&memb, false) {

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

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -659,20 +659,28 @@ impl QueryProperties {
659659
if exclude_time_dimensions {
660660
dimensions.chain(measures).collect_vec()
661661
} else {
662-
let time_dimensions = self.time_dimensions.iter().map(|d| {
663-
/* if let Ok(td) = d.as_time_dimension() {
664-
td.base_symbol().clone()
665-
} else { */
666-
d.clone()
667-
//}
668-
});
662+
let time_dimensions = self.time_dimensions.iter().map(|d| d.clone());
669663
dimensions
670664
.chain(time_dimensions)
671665
.chain(measures)
672666
.collect_vec()
673667
}
674668
}
675669

670+
pub fn all_used_symbols(&self) -> Result<Vec<Rc<MemberSymbol>>, CubeError> {
671+
let mut members = vec![];
672+
members.extend(self.time_dimensions.iter().cloned());
673+
members.extend(self.dimensions.iter().cloned());
674+
self.fill_all_filter_symbols(&mut members);
675+
members.extend(self.all_used_measures()?);
676+
677+
let res = members
678+
.into_iter()
679+
.unique_by(|m| m.full_name())
680+
.collect_vec();
681+
Ok(res)
682+
}
683+
676684
pub fn get_member_symbols(
677685
&self,
678686
include_time_dimensions: bool,
@@ -708,22 +716,6 @@ impl QueryProperties {
708716
}
709717
}
710718

711-
/* pub fn group_by(&self) -> Vec<Expr> {
712-
if self.ungrouped {
713-
vec![]
714-
} else {
715-
self.dimensions
716-
.iter()
717-
.map(|f| Expr::Member(MemberExpression::new(f.clone())))
718-
.chain(
719-
self.time_dimensions
720-
.iter()
721-
.map(|f| Expr::Member(MemberExpression::new(f.clone()))),
722-
)
723-
.collect()
724-
}
725-
} */
726-
727719
pub fn default_order(
728720
dimensions: &Vec<Rc<MemberSymbol>>,
729721
time_dimensions: &Vec<Rc<MemberSymbol>>,

rust/cubesqlplanner/cubesqlplanner/src/tests/integration/multi_stage/filters.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,28 @@ async fn test_filter_on_multi_stage_measure() {
173173
insta::assert_snapshot!(result);
174174
}
175175
}
176+
177+
#[tokio::test(flavor = "multi_thread")]
178+
async fn test_filter_on_only_multi_stage_measure() {
179+
let ctx = create_context();
180+
181+
let query = indoc! {r#"
182+
dimensions:
183+
- orders.status
184+
- orders.category
185+
filters:
186+
- member: orders.amount_reduce_category
187+
operator: gt
188+
values:
189+
- "200"
190+
order:
191+
- id: orders.status
192+
- id: orders.category
193+
"#};
194+
195+
ctx.build_sql(query).unwrap();
196+
197+
if let Some(result) = ctx.try_execute_pg(query, SEED).await {
198+
insta::assert_snapshot!(result);
199+
}
200+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
source: cubesqlplanner/src/tests/integration/multi_stage/filters.rs
3+
expression: result
4+
---
5+
orders__status | orders__category
6+
---------------+-----------------
7+
completed | books
8+
completed | clothing
9+
completed | electronics
10+
pending | books
11+
pending | clothing
12+
pending | electronics

0 commit comments

Comments
 (0)