Skip to content

Commit e51edfd

Browse files
committed
feat(cubesql): Flatten WrappedSelect with filters
Some queries in tests reduced to a single CubeScan with member expressions, so tests have changed
1 parent eb5d8e9 commit e51edfd

File tree

4 files changed

+444
-91
lines changed

4 files changed

+444
-91
lines changed

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

Lines changed: 166 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -7248,49 +7248,88 @@ ORDER BY
72487248
displayable(physical_plan.as_ref()).indent()
72497249
);
72507250

7251+
fn trivial_member_expr(cube: &str, member: &str, alias: &str) -> String {
7252+
json!({
7253+
"cube_name": cube,
7254+
"alias": alias,
7255+
"cube_params": [cube],
7256+
"expr": format!("${{{cube}.{member}}}"),
7257+
"grouping_set": null,
7258+
})
7259+
.to_string()
7260+
}
7261+
72517262
assert_eq!(
7252-
query_plan.as_logical_plan().find_cube_scan().request,
7263+
query_plan
7264+
.as_logical_plan()
7265+
.find_cube_scan_wrapper()
7266+
.request
7267+
.unwrap(),
72537268
V1LoadRequestQuery {
72547269
measures: Some(vec![
7255-
"WideCube.measure1".to_string(),
7256-
"WideCube.measure2".to_string(),
7257-
"WideCube.measure3".to_string(),
7258-
"WideCube.measure4".to_string(),
7270+
json!({
7271+
"cube_name": "WideCube",
7272+
"alias": "max_source_measu",
7273+
"cube_params": ["WideCube"],
7274+
"expr": "${WideCube.measure1}",
7275+
"grouping_set": null,
7276+
})
7277+
.to_string(),
7278+
json!({
7279+
"cube_name": "WideCube",
7280+
"alias": "max_source_measu_1",
7281+
"cube_params": ["WideCube"],
7282+
"expr": "${WideCube.measure2}",
7283+
"grouping_set": null,
7284+
})
7285+
.to_string(),
7286+
json!({
7287+
"cube_name": "WideCube",
7288+
"alias": "sum_source_measu",
7289+
"cube_params": ["WideCube"],
7290+
"expr": "${WideCube.measure3}",
7291+
"grouping_set": null,
7292+
})
7293+
.to_string(),
7294+
json!({
7295+
"cube_name": "WideCube",
7296+
"alias": "max_source_measu_2",
7297+
"cube_params": ["WideCube"],
7298+
"expr": "${WideCube.measure4}",
7299+
"grouping_set": null,
7300+
})
7301+
.to_string(),
72597302
]),
72607303
dimensions: Some(vec![
7261-
"WideCube.dim1".to_string(),
7262-
"WideCube.dim2".to_string(),
7263-
"WideCube.dim3".to_string(),
7264-
"WideCube.dim4".to_string(),
7304+
trivial_member_expr("WideCube", "dim2", "dim2"),
7305+
trivial_member_expr("WideCube", "dim3", "dim3"),
7306+
trivial_member_expr("WideCube", "dim4", "dim4"),
7307+
json!({
7308+
"cube_name": "WideCube",
7309+
"alias": "pivot_grouping",
7310+
"cube_params": ["WideCube"],
7311+
"expr": "0",
7312+
"grouping_set": null,
7313+
})
7314+
.to_string()
72657315
]),
72667316
segments: Some(vec![]),
7267-
order: Some(vec![]),
7317+
order: Some(vec![
7318+
vec!["dim2".to_string(), "asc".to_string(),],
7319+
vec!["dim3".to_string(), "asc".to_string(),],
7320+
vec!["dim4".to_string(), "asc".to_string(),],
7321+
vec!["pivot_grouping".to_string(), "asc".to_string(),],
7322+
]),
72687323
filters: Some(vec![V1LoadRequestQueryFilterItem {
72697324
member: Some("WideCube.dim1".to_string()),
72707325
operator: Some("equals".to_string()),
72717326
values: Some(vec!["foo".to_string()]),
72727327
or: None,
72737328
and: None,
7274-
}]),
7275-
ungrouped: Some(true),
7329+
},]),
72767330
..Default::default()
72777331
}
72787332
);
7279-
assert!(!query_plan
7280-
.as_logical_plan()
7281-
.find_cube_scan_wrapper()
7282-
.wrapped_sql
7283-
.unwrap()
7284-
.sql
7285-
.contains("ungrouped"));
7286-
7287-
assert!(query_plan
7288-
.as_logical_plan()
7289-
.find_cube_scan_wrapper()
7290-
.wrapped_sql
7291-
.unwrap()
7292-
.sql
7293-
.contains("[\"dim2\",\"asc\"]"));
72947333
}
72957334

72967335
#[tokio::test]
@@ -11614,15 +11653,39 @@ ORDER BY "source"."str0" ASC
1161411653
.await
1161511654
.as_logical_plan();
1161611655

11617-
let sql = logical_plan
11618-
.find_cube_scan_wrapper()
11619-
.wrapped_sql
11620-
.unwrap()
11621-
.sql;
11622-
11623-
assert!(sql.contains("LOWER("));
11624-
assert!(sql.contains("GROUP BY "));
11625-
assert!(sql.contains("ORDER BY "));
11656+
assert_eq!(
11657+
logical_plan
11658+
.find_cube_scan_wrapper()
11659+
.request
11660+
.unwrap(),
11661+
V1LoadRequestQuery {
11662+
measures: Some(vec![]),
11663+
dimensions: Some(vec![
11664+
json!({
11665+
"cube_name": "KibanaSampleDataEcommerce",
11666+
"alias": "ta_1_order_date_",
11667+
"cube_params": ["KibanaSampleDataEcommerce", "Logs"],
11668+
"expr": "((${KibanaSampleDataEcommerce.order_date} = DATE('1994-05-01')) OR (${KibanaSampleDataEcommerce.order_date} = DATE('1996-05-03')))",
11669+
"grouping_set": null,
11670+
}).to_string(),
11671+
]),
11672+
segments: Some(vec![
11673+
json!({
11674+
"cube_name": "KibanaSampleDataEcommerce",
11675+
"alias": "lower_ta_2_conte",
11676+
"cube_params": ["KibanaSampleDataEcommerce", "Logs"],
11677+
"expr": "(LOWER(${Logs.content}) = $0$)",
11678+
"grouping_set": null,
11679+
}).to_string(),
11680+
]),
11681+
time_dimensions: None,
11682+
order: Some(vec![]),
11683+
limit: None,
11684+
offset: None,
11685+
filters: None,
11686+
ungrouped: None,
11687+
}
11688+
);
1162611689
}
1162711690

1162811691
#[tokio::test]
@@ -11876,20 +11939,46 @@ ORDER BY "source"."str0" ASC
1187611939
);
1187711940

1187811941
assert_eq!(
11879-
query_plan.as_logical_plan().find_cube_scan().request,
11942+
query_plan
11943+
.as_logical_plan()
11944+
.find_cube_scan_wrapper()
11945+
.request
11946+
.unwrap(),
1188011947
V1LoadRequestQuery {
1188111948
measures: Some(vec![]),
11882-
dimensions: Some(vec![]),
11883-
segments: Some(vec![]),
11949+
dimensions: Some(vec![
11950+
json!({
11951+
"cube_name": "KibanaSampleDataEcommerce",
11952+
"alias": "customer_gender",
11953+
"cube_params": ["KibanaSampleDataEcommerce"],
11954+
"expr": "${KibanaSampleDataEcommerce.customer_gender}",
11955+
"grouping_set": null,
11956+
}).to_string(),
11957+
json!({
11958+
"cube_name": "KibanaSampleDataEcommerce",
11959+
"alias": "cast_dateadd_utf",
11960+
"cube_params": ["KibanaSampleDataEcommerce"],
11961+
"expr": "CAST(DATE_ADD(${KibanaSampleDataEcommerce.order_date}, INTERVAL '2 DAY') AS DATE)",
11962+
"grouping_set": null,
11963+
}).to_string(),
11964+
json!({
11965+
"cube_name": "KibanaSampleDataEcommerce",
11966+
"alias": "dateadd_utf8__se",
11967+
"cube_params": ["KibanaSampleDataEcommerce"],
11968+
"expr": "DATE_ADD(${KibanaSampleDataEcommerce.order_date}, INTERVAL '2000000 MILLISECOND')",
11969+
"grouping_set": null,
11970+
}).to_string(),
11971+
]),
11972+
segments: Some(vec![
11973+
json!({
11974+
"cube_name": "KibanaSampleDataEcommerce",
11975+
"alias": "dateadd_utf8__da",
11976+
"cube_params": ["KibanaSampleDataEcommerce"],
11977+
"expr": "(DATE_ADD(${KibanaSampleDataEcommerce.order_date}, INTERVAL '2 DAY') < DATE('2014-06-02'))",
11978+
"grouping_set": null,
11979+
}).to_string(),
11980+
]),
1188411981
order: Some(vec![]),
11885-
filters: Some(vec![V1LoadRequestQueryFilterItem {
11886-
member: Some("KibanaSampleDataEcommerce.order_date".to_string(),),
11887-
operator: Some("beforeDate".to_string(),),
11888-
values: Some(vec!["2014-05-31T00:00:00.000Z".to_string()]),
11889-
or: None,
11890-
and: None,
11891-
}]),
11892-
ungrouped: Some(true),
1189311982
..Default::default()
1189411983
}
1189511984
)
@@ -12674,53 +12763,39 @@ ORDER BY "source"."str0" ASC
1267412763
.await
1267512764
.as_logical_plan();
1267612765

12677-
let end_date = chrono::Utc::now().date_naive() - chrono::Duration::days(1);
12678-
let start_date = end_date - chrono::Duration::days(29);
12766+
let end_date = chrono::Utc::now().date_naive();
12767+
let start_date = end_date - chrono::Duration::days(30);
1267912768
assert_eq!(
12680-
logical_plan.find_cube_scan().request,
12769+
logical_plan.find_cube_scan_wrapper().request.unwrap(),
1268112770
V1LoadRequestQuery {
12682-
measures: Some(vec![]),
12683-
dimensions: Some(vec![]),
12684-
segments: Some(vec![]),
12685-
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
12686-
dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
12687-
granularity: None,
12688-
date_range: Some(json!(vec![
12689-
format!("{}T00:00:00.000Z", start_date),
12690-
format!("{}T23:59:59.999Z", end_date),
12691-
]))
12692-
}]),
12771+
measures: Some(vec![
12772+
json!({
12773+
"cube_name": "KibanaSampleDataEcommerce",
12774+
"alias": "avg_kibanasample",
12775+
"cube_params": ["KibanaSampleDataEcommerce"],
12776+
"expr": "${KibanaSampleDataEcommerce.avgPrice}",
12777+
"grouping_set": null,
12778+
}).to_string(),
12779+
]),
12780+
dimensions: Some(vec![
12781+
json!({
12782+
"cube_name": "KibanaSampleDataEcommerce",
12783+
"alias": "cast_kibanasampl",
12784+
"cube_params": ["KibanaSampleDataEcommerce"],
12785+
"expr": "CAST(${KibanaSampleDataEcommerce.order_date} AS DATE)",
12786+
"grouping_set": null,
12787+
}).to_string(),
12788+
]),
12789+
segments: Some(vec![
12790+
json!({
12791+
"cube_name": "KibanaSampleDataEcommerce",
12792+
"alias": "kibanasampledata",
12793+
"cube_params": ["KibanaSampleDataEcommerce"],
12794+
"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$)))"),
12795+
"grouping_set": null,
12796+
}).to_string(),
12797+
]),
1269312798
order: Some(vec![]),
12694-
filters: Some(vec![V1LoadRequestQueryFilterItem {
12695-
member: None,
12696-
operator: None,
12697-
values: None,
12698-
or: Some(vec![
12699-
json!(V1LoadRequestQueryFilterItem {
12700-
member: Some("KibanaSampleDataEcommerce.notes".to_string()),
12701-
operator: Some("equals".to_string()),
12702-
values: Some(vec!["note1".to_string()]),
12703-
or: None,
12704-
and: None,
12705-
}),
12706-
json!(V1LoadRequestQueryFilterItem {
12707-
member: Some("KibanaSampleDataEcommerce.notes".to_string()),
12708-
operator: Some("equals".to_string()),
12709-
values: Some(vec!["note2".to_string()]),
12710-
or: None,
12711-
and: None,
12712-
}),
12713-
json!(V1LoadRequestQueryFilterItem {
12714-
member: Some("KibanaSampleDataEcommerce.notes".to_string()),
12715-
operator: Some("equals".to_string()),
12716-
values: Some(vec!["note3".to_string()]),
12717-
or: None,
12718-
and: None,
12719-
}),
12720-
]),
12721-
and: None
12722-
}]),
12723-
ungrouped: Some(true),
1272412799
..Default::default()
1272512800
}
1272612801
)

0 commit comments

Comments
 (0)