Skip to content

Commit 51e9424

Browse files
committed
test(cubesql): Tests for aggregation over limited CubeScan
1 parent 5fd13d1 commit 51e9424

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

rust/cubesql/cubesql/src/compile/test/test_wrapper.rs

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cubeclient::models::V1LoadRequestQuery;
12
use datafusion::physical_plan::displayable;
23
use pretty_assertions::assert_eq;
34
use serde_json::json;
@@ -1080,3 +1081,127 @@ async fn test_wrapper_filter_flatten() {
10801081
}
10811082
);
10821083
}
1084+
1085+
/// Regular aggregation over CubeScan(limit=n, ungrouped=true) is NOT pushed to CubeScan
1086+
#[tokio::test]
1087+
async fn wrapper_agg_over_limit() {
1088+
if !Rewriter::sql_push_down_enabled() {
1089+
return;
1090+
}
1091+
init_testing_logger();
1092+
1093+
let query_plan = convert_select_to_query_plan(
1094+
// language=PostgreSQL
1095+
r#"
1096+
SELECT
1097+
customer_gender
1098+
FROM (
1099+
SELECT
1100+
customer_gender
1101+
FROM
1102+
KibanaSampleDataEcommerce
1103+
LIMIT 5
1104+
) scan
1105+
GROUP BY
1106+
1
1107+
"#
1108+
.to_string(),
1109+
DatabaseProtocol::PostgreSQL,
1110+
)
1111+
.await;
1112+
1113+
let physical_plan = query_plan.as_physical_plan().await.unwrap();
1114+
println!(
1115+
"Physical plan: {}",
1116+
displayable(physical_plan.as_ref()).indent()
1117+
);
1118+
1119+
let logical_plan = query_plan.as_logical_plan();
1120+
assert_eq!(
1121+
logical_plan.find_cube_scan().request,
1122+
V1LoadRequestQuery {
1123+
measures: Some(vec![]),
1124+
dimensions: Some(vec![]),
1125+
segments: Some(vec![]),
1126+
order: Some(vec![]),
1127+
limit: Some(5),
1128+
ungrouped: Some(true),
1129+
..Default::default()
1130+
}
1131+
);
1132+
1133+
assert!(logical_plan
1134+
.find_cube_scan_wrapper()
1135+
.wrapped_sql
1136+
.unwrap()
1137+
.sql
1138+
.contains("\"limit\": 5"));
1139+
assert!(query_plan
1140+
.as_logical_plan()
1141+
.find_cube_scan_wrapper()
1142+
.wrapped_sql
1143+
.unwrap()
1144+
.sql
1145+
.contains("\"ungrouped\": true"));
1146+
}
1147+
1148+
/// Aggregation(dimension) over CubeScan(limit=n, ungrouped=true) is NOT pushed to CubeScan
1149+
#[tokio::test]
1150+
async fn wrapper_agg_dimension_over_limit() {
1151+
if !Rewriter::sql_push_down_enabled() {
1152+
return;
1153+
}
1154+
init_testing_logger();
1155+
1156+
let query_plan = convert_select_to_query_plan(
1157+
// language=PostgreSQL
1158+
r#"
1159+
SELECT
1160+
MAX(customer_gender)
1161+
FROM (
1162+
SELECT
1163+
customer_gender
1164+
FROM
1165+
KibanaSampleDataEcommerce
1166+
LIMIT 5
1167+
) scan
1168+
"#
1169+
.to_string(),
1170+
DatabaseProtocol::PostgreSQL,
1171+
)
1172+
.await;
1173+
1174+
let physical_plan = query_plan.as_physical_plan().await.unwrap();
1175+
println!(
1176+
"Physical plan: {}",
1177+
displayable(physical_plan.as_ref()).indent()
1178+
);
1179+
1180+
let logical_plan = query_plan.as_logical_plan();
1181+
assert_eq!(
1182+
logical_plan.find_cube_scan().request,
1183+
V1LoadRequestQuery {
1184+
measures: Some(vec![]),
1185+
dimensions: Some(vec![]),
1186+
segments: Some(vec![]),
1187+
order: Some(vec![]),
1188+
limit: Some(5),
1189+
ungrouped: Some(true),
1190+
..Default::default()
1191+
}
1192+
);
1193+
1194+
assert!(logical_plan
1195+
.find_cube_scan_wrapper()
1196+
.wrapped_sql
1197+
.unwrap()
1198+
.sql
1199+
.contains("\"limit\": 5"));
1200+
assert!(query_plan
1201+
.as_logical_plan()
1202+
.find_cube_scan_wrapper()
1203+
.wrapped_sql
1204+
.unwrap()
1205+
.sql
1206+
.contains("\"ungrouped\": true"));
1207+
}

0 commit comments

Comments
 (0)