Skip to content

Commit 080782d

Browse files
committed
chore(cubesql): dataRange filter isn't being push down to time dimension in case of other filters are used
Generalized case support Fixes #6312
1 parent a4edfae commit 080782d

File tree

4 files changed

+86
-8
lines changed

4 files changed

+86
-8
lines changed

packages/cubejs-backend-native/Cargo.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/cubesql/cubesql/src/compile/mod.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3165,6 +3165,83 @@ ORDER BY \"COUNT(count)\" DESC"
31653165
);
31663166
}
31673167

3168+
#[tokio::test]
3169+
async fn superset_pg_time_filter_with_generalized_filters() {
3170+
init_logger();
3171+
3172+
let query_plan = convert_select_to_query_plan(
3173+
"SELECT DATE_TRUNC('week', \"order_date\") AS __timestamp,
3174+
count(count) AS \"COUNT(count)\"
3175+
FROM public.\"KibanaSampleDataEcommerce\"
3176+
WHERE \"customer_gender\" = 'female'\
3177+
AND \"order_date\" >= TO_TIMESTAMP('2021-05-15 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US')
3178+
AND \"customer_gender\" LIKE '%fem%'
3179+
AND \"customer_gender\" LIKE '%fe%'
3180+
AND \"order_date\" < TO_TIMESTAMP('2022-05-15 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US')
3181+
AND \"customer_gender\" LIKE '%f%'
3182+
GROUP BY DATE_TRUNC('week', \"order_date\")
3183+
ORDER BY \"COUNT(count)\" DESC"
3184+
.to_string(),
3185+
DatabaseProtocol::PostgreSQL,
3186+
)
3187+
.await;
3188+
3189+
let logical_plan = query_plan.as_logical_plan();
3190+
assert_eq!(
3191+
logical_plan.find_cube_scan().request,
3192+
V1LoadRequestQuery {
3193+
measures: Some(vec!["KibanaSampleDataEcommerce.count".to_string()]),
3194+
segments: Some(vec![]),
3195+
dimensions: Some(vec![]),
3196+
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
3197+
dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
3198+
granularity: Some("week".to_string()),
3199+
date_range: Some(json!(vec![
3200+
"2021-05-15T00:00:00.000Z".to_string(),
3201+
"2022-05-14T23:59:59.999Z".to_string()
3202+
]))
3203+
}]),
3204+
order: Some(vec![vec![
3205+
"KibanaSampleDataEcommerce.count".to_string(),
3206+
"desc".to_string()
3207+
]]),
3208+
limit: None,
3209+
offset: None,
3210+
filters: Some(vec![
3211+
V1LoadRequestQueryFilterItem {
3212+
member: Some("KibanaSampleDataEcommerce.customer_gender".to_string()),
3213+
operator: Some("equals".to_string()),
3214+
values: Some(vec!["female".to_string()]),
3215+
or: None,
3216+
and: None
3217+
},
3218+
V1LoadRequestQueryFilterItem {
3219+
member: Some("KibanaSampleDataEcommerce.customer_gender".to_string()),
3220+
operator: Some("contains".to_string()),
3221+
values: Some(vec!["fem".to_string()]),
3222+
or: None,
3223+
and: None
3224+
},
3225+
V1LoadRequestQueryFilterItem {
3226+
member: Some("KibanaSampleDataEcommerce.customer_gender".to_string()),
3227+
operator: Some("contains".to_string()),
3228+
values: Some(vec!["fe".to_string()]),
3229+
or: None,
3230+
and: None
3231+
},
3232+
V1LoadRequestQueryFilterItem {
3233+
member: Some("KibanaSampleDataEcommerce.customer_gender".to_string()),
3234+
operator: Some("contains".to_string()),
3235+
values: Some(vec!["f".to_string()]),
3236+
or: None,
3237+
and: None
3238+
}
3239+
]),
3240+
ungrouped: None,
3241+
}
3242+
);
3243+
}
3244+
31683245
#[tokio::test]
31693246
async fn power_bi_dimension_only() {
31703247
init_logger();

rust/cubesql/cubesql/src/compile/rewrite/analysis.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,8 @@ impl LogicalPlanAnalysis {
258258
) -> Option<Vec<(String, String)>> {
259259
let filter_operators = |id| egraph.index(id).data.filter_operators.clone();
260260
match enode {
261-
LogicalPlanLanguage::FilterOp(params) => {
261+
LogicalPlanLanguage::FilterOp(params) => filter_operators(params[0]),
262+
LogicalPlanLanguage::FilterOpFilters(params) => {
262263
let mut map = Vec::new();
263264
for id in params.iter() {
264265
map.extend(filter_operators(*id)?.into_iter());

rust/cubesql/cubesql/src/compile/rewrite/rewriter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ impl Rewriter {
352352
.iter()
353353
.enumerate()
354354
.map(|(i, n)| format!("{}: {:?}", i, n))
355-
.join(",")
355+
.join(", ")
356356
);
357357
let converter =
358358
LanguageToLogicalPlanConverter::new(best, cube_context.clone(), auth_context);

0 commit comments

Comments
 (0)