Skip to content

Commit bb91f3c

Browse files
committed
test(cubesql): Tests for aggregation over limited CubeScan
1 parent e9fdf95 commit bb91f3c

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;
@@ -1258,3 +1259,127 @@ async fn test_wrapper_filter_flatten() {
12581259
}
12591260
);
12601261
}
1262+
1263+
/// Regular aggregation over CubeScan(limit=n, ungrouped=true) is NOT pushed to CubeScan
1264+
#[tokio::test]
1265+
async fn wrapper_agg_over_limit() {
1266+
if !Rewriter::sql_push_down_enabled() {
1267+
return;
1268+
}
1269+
init_testing_logger();
1270+
1271+
let query_plan = convert_select_to_query_plan(
1272+
// language=PostgreSQL
1273+
r#"
1274+
SELECT
1275+
customer_gender
1276+
FROM (
1277+
SELECT
1278+
customer_gender
1279+
FROM
1280+
KibanaSampleDataEcommerce
1281+
LIMIT 5
1282+
) scan
1283+
GROUP BY
1284+
1
1285+
"#
1286+
.to_string(),
1287+
DatabaseProtocol::PostgreSQL,
1288+
)
1289+
.await;
1290+
1291+
let physical_plan = query_plan.as_physical_plan().await.unwrap();
1292+
println!(
1293+
"Physical plan: {}",
1294+
displayable(physical_plan.as_ref()).indent()
1295+
);
1296+
1297+
let logical_plan = query_plan.as_logical_plan();
1298+
assert_eq!(
1299+
logical_plan.find_cube_scan().request,
1300+
V1LoadRequestQuery {
1301+
measures: Some(vec![]),
1302+
dimensions: Some(vec![]),
1303+
segments: Some(vec![]),
1304+
order: Some(vec![]),
1305+
limit: Some(5),
1306+
ungrouped: Some(true),
1307+
..Default::default()
1308+
}
1309+
);
1310+
1311+
assert!(logical_plan
1312+
.find_cube_scan_wrapper()
1313+
.wrapped_sql
1314+
.unwrap()
1315+
.sql
1316+
.contains("\"limit\": 5"));
1317+
assert!(query_plan
1318+
.as_logical_plan()
1319+
.find_cube_scan_wrapper()
1320+
.wrapped_sql
1321+
.unwrap()
1322+
.sql
1323+
.contains("\"ungrouped\": true"));
1324+
}
1325+
1326+
/// Aggregation(dimension) over CubeScan(limit=n, ungrouped=true) is NOT pushed to CubeScan
1327+
#[tokio::test]
1328+
async fn wrapper_agg_dimension_over_limit() {
1329+
if !Rewriter::sql_push_down_enabled() {
1330+
return;
1331+
}
1332+
init_testing_logger();
1333+
1334+
let query_plan = convert_select_to_query_plan(
1335+
// language=PostgreSQL
1336+
r#"
1337+
SELECT
1338+
MAX(customer_gender)
1339+
FROM (
1340+
SELECT
1341+
customer_gender
1342+
FROM
1343+
KibanaSampleDataEcommerce
1344+
LIMIT 5
1345+
) scan
1346+
"#
1347+
.to_string(),
1348+
DatabaseProtocol::PostgreSQL,
1349+
)
1350+
.await;
1351+
1352+
let physical_plan = query_plan.as_physical_plan().await.unwrap();
1353+
println!(
1354+
"Physical plan: {}",
1355+
displayable(physical_plan.as_ref()).indent()
1356+
);
1357+
1358+
let logical_plan = query_plan.as_logical_plan();
1359+
assert_eq!(
1360+
logical_plan.find_cube_scan().request,
1361+
V1LoadRequestQuery {
1362+
measures: Some(vec![]),
1363+
dimensions: Some(vec![]),
1364+
segments: Some(vec![]),
1365+
order: Some(vec![]),
1366+
limit: Some(5),
1367+
ungrouped: Some(true),
1368+
..Default::default()
1369+
}
1370+
);
1371+
1372+
assert!(logical_plan
1373+
.find_cube_scan_wrapper()
1374+
.wrapped_sql
1375+
.unwrap()
1376+
.sql
1377+
.contains("\"limit\": 5"));
1378+
assert!(query_plan
1379+
.as_logical_plan()
1380+
.find_cube_scan_wrapper()
1381+
.wrapped_sql
1382+
.unwrap()
1383+
.sql
1384+
.contains("\"ungrouped\": true"));
1385+
}

0 commit comments

Comments
 (0)