Skip to content

Commit 7df76e1

Browse files
committed
[WIP] fix(cubesql): Use pushdown-pullup scheme for FilterSimplifyReplacer
This should avoid unexpected unifications of simplified expression in unrelated context. For example, same expression can be present in filter and projection, but due to over-unification in filters it can receive different representation in projection, and break aliases later, during extraction
1 parent b14edb7 commit 7df76e1

File tree

5 files changed

+418
-144
lines changed

5 files changed

+418
-144
lines changed

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

Lines changed: 58 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12902,38 +12902,68 @@ ORDER BY "source"."str0" ASC
1290212902
.await
1290312903
.as_logical_plan();
1290412904

12905-
let end_date = chrono::Utc::now().date_naive();
12905+
let end_date = chrono::Utc::now();
1290612906
let start_date = end_date - chrono::Duration::days(30);
12907+
let start_date = start_date.with_time(chrono::NaiveTime::default()).unwrap();
12908+
let end_date = end_date.with_time(chrono::NaiveTime::default()).unwrap();
12909+
let end_date = end_date - chrono::Duration::milliseconds(1);
1290712910
assert_eq!(
1290812911
logical_plan.find_cube_scan_wrapped_sql().request,
1290912912
V1LoadRequestQuery {
12910-
measures: Some(vec![
12911-
json!({
12912-
"cube_name": "KibanaSampleDataEcommerce",
12913-
"alias": "avg_kibanasample",
12914-
"cube_params": ["KibanaSampleDataEcommerce"],
12915-
"expr": "${KibanaSampleDataEcommerce.avgPrice}",
12916-
"grouping_set": null,
12917-
}).to_string(),
12918-
]),
12919-
dimensions: Some(vec![
12920-
json!({
12921-
"cube_name": "KibanaSampleDataEcommerce",
12922-
"alias": "cast_kibanasampl",
12923-
"cube_params": ["KibanaSampleDataEcommerce"],
12924-
"expr": "CAST(${KibanaSampleDataEcommerce.order_date} AS DATE)",
12925-
"grouping_set": null,
12926-
}).to_string(),
12927-
]),
12928-
segments: Some(vec![
12929-
json!({
12930-
"cube_name": "KibanaSampleDataEcommerce",
12931-
"alias": "kibanasampledata",
12932-
"cube_params": ["KibanaSampleDataEcommerce"],
12933-
"expr": format!("(((${{KibanaSampleDataEcommerce.order_date}} >= DATE('{start_date}')) AND (${{KibanaSampleDataEcommerce.order_date}} < DATE('{end_date}'))) AND (((${{KibanaSampleDataEcommerce.notes}} = $0$) OR (${{KibanaSampleDataEcommerce.notes}} = $1$)) OR (${{KibanaSampleDataEcommerce.notes}} = $2$)))"),
12934-
"grouping_set": null,
12935-
}).to_string(),
12936-
]),
12913+
measures: Some(vec![json!({
12914+
"cube_name": "KibanaSampleDataEcommerce",
12915+
"alias": "avg_kibanasample",
12916+
"cube_params": ["KibanaSampleDataEcommerce"],
12917+
"expr": "${KibanaSampleDataEcommerce.avgPrice}",
12918+
"grouping_set": null,
12919+
})
12920+
.to_string(),]),
12921+
dimensions: Some(vec![json!({
12922+
"cube_name": "KibanaSampleDataEcommerce",
12923+
"alias": "cast_kibanasampl",
12924+
"cube_params": ["KibanaSampleDataEcommerce"],
12925+
"expr": "CAST(${KibanaSampleDataEcommerce.order_date} AS DATE)",
12926+
"grouping_set": null,
12927+
})
12928+
.to_string(),]),
12929+
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
12930+
dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
12931+
granularity: None,
12932+
date_range: Some(json!(vec![
12933+
start_date.to_rfc3339_opts(chrono::SecondsFormat::Millis, true),
12934+
end_date.to_rfc3339_opts(chrono::SecondsFormat::Millis, true),
12935+
]))
12936+
}]),
12937+
segments: Some(vec![]),
12938+
filters: Some(vec![V1LoadRequestQueryFilterItem {
12939+
member: None,
12940+
operator: None,
12941+
values: None,
12942+
or: Some(vec![
12943+
json!(V1LoadRequestQueryFilterItem {
12944+
member: Some("KibanaSampleDataEcommerce.notes".to_string()),
12945+
operator: Some("equals".to_string()),
12946+
values: Some(vec!["note1".to_string()]),
12947+
or: None,
12948+
and: None,
12949+
}),
12950+
json!(V1LoadRequestQueryFilterItem {
12951+
member: Some("KibanaSampleDataEcommerce.notes".to_string()),
12952+
operator: Some("equals".to_string()),
12953+
values: Some(vec!["note2".to_string()]),
12954+
or: None,
12955+
and: None,
12956+
}),
12957+
json!(V1LoadRequestQueryFilterItem {
12958+
member: Some("KibanaSampleDataEcommerce.notes".to_string()),
12959+
operator: Some("equals".to_string()),
12960+
values: Some(vec!["note3".to_string()]),
12961+
or: None,
12962+
and: None,
12963+
}),
12964+
]),
12965+
and: None,
12966+
}]),
1293712967
order: Some(vec![]),
1293812968
..Default::default()
1293912969
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ impl BestCubePlan {
104104
LogicalPlanLanguage::OrderReplacer(_) => 1,
105105
LogicalPlanLanguage::MemberReplacer(_) => 1,
106106
LogicalPlanLanguage::FilterReplacer(_) => 1,
107+
LogicalPlanLanguage::FilterSimplifyPushDownReplacer(_) => 1,
108+
LogicalPlanLanguage::FilterSimplifyPullUpReplacer(_) => 1,
107109
LogicalPlanLanguage::TimeDimensionDateRangeReplacer(_) => 1,
108110
LogicalPlanLanguage::InnerAggregateSplitReplacer(_) => 1,
109111
LogicalPlanLanguage::OuterProjectionSplitReplacer(_) => 1,

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,10 @@ crate::plan_to_language! {
405405
members: Vec<LogicalPlan>,
406406
aliases: Vec<(String, String)>,
407407
},
408-
FilterSimplifyReplacer {
408+
FilterSimplifyPushDownReplacer {
409+
filters: Vec<LogicalPlan>,
410+
},
411+
FilterSimplifyPullUpReplacer {
409412
filters: Vec<LogicalPlan>,
410413
},
411414
OrderReplacer {
@@ -1901,8 +1904,12 @@ fn filter_replacer(
19011904
)
19021905
}
19031906

1904-
fn filter_simplify_replacer(members: impl Display) -> String {
1905-
format!("(FilterSimplifyReplacer {})", members)
1907+
fn filter_simplify_push_down_replacer(members: impl Display) -> String {
1908+
format!("(FilterSimplifyPushDownReplacer {})", members)
1909+
}
1910+
1911+
fn filter_simplify_pull_up_replacer(members: impl Display) -> String {
1912+
format!("(FilterSimplifyPullUpReplacer {})", members)
19061913
}
19071914

19081915
fn inner_aggregate_split_replacer(members: impl Display, alias_to_cube: impl Display) -> String {

0 commit comments

Comments
 (0)