Skip to content

Commit 78cc524

Browse files
committed
test(cubesql): Tests for aggregation over limited CubeScan
1 parent 8fb14f0 commit 78cc524

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed

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

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
use cubeclient::models::V1LoadRequestQuery;
12
use datafusion::physical_plan::displayable;
3+
use pretty_assertions::assert_eq;
24
use std::sync::Arc;
35

46
use crate::{
@@ -1001,3 +1003,127 @@ async fn test_wrapper_limit_zero() {
10011003

10021004
let _physical_plan = query_plan.as_physical_plan().await.unwrap();
10031005
}
1006+
1007+
/// Regular aggregation over CubeScan(limit=n, ungrouped=true) is NOT pushed to CubeScan
1008+
#[tokio::test]
1009+
async fn wrapper_agg_over_limit() {
1010+
if !Rewriter::sql_push_down_enabled() {
1011+
return;
1012+
}
1013+
init_testing_logger();
1014+
1015+
let query_plan = convert_select_to_query_plan(
1016+
// language=PostgreSQL
1017+
r#"
1018+
SELECT
1019+
customer_gender
1020+
FROM (
1021+
SELECT
1022+
customer_gender
1023+
FROM
1024+
KibanaSampleDataEcommerce
1025+
LIMIT 5
1026+
) scan
1027+
GROUP BY
1028+
1
1029+
"#
1030+
.to_string(),
1031+
DatabaseProtocol::PostgreSQL,
1032+
)
1033+
.await;
1034+
1035+
let physical_plan = query_plan.as_physical_plan().await.unwrap();
1036+
println!(
1037+
"Physical plan: {}",
1038+
displayable(physical_plan.as_ref()).indent()
1039+
);
1040+
1041+
let logical_plan = query_plan.as_logical_plan();
1042+
assert_eq!(
1043+
logical_plan.find_cube_scan().request,
1044+
V1LoadRequestQuery {
1045+
measures: Some(vec![]),
1046+
dimensions: Some(vec![]),
1047+
segments: Some(vec![]),
1048+
order: Some(vec![]),
1049+
limit: Some(5),
1050+
ungrouped: Some(true),
1051+
..Default::default()
1052+
}
1053+
);
1054+
1055+
assert!(logical_plan
1056+
.find_cube_scan_wrapper()
1057+
.wrapped_sql
1058+
.unwrap()
1059+
.sql
1060+
.contains("\"limit\":5"));
1061+
assert!(query_plan
1062+
.as_logical_plan()
1063+
.find_cube_scan_wrapper()
1064+
.wrapped_sql
1065+
.unwrap()
1066+
.sql
1067+
.contains("\"ungrouped\":true"));
1068+
}
1069+
1070+
/// Aggregation(dimension) over CubeScan(limit=n, ungrouped=true) is NOT pushed to CubeScan
1071+
#[tokio::test]
1072+
async fn wrapper_agg_dimension_over_limit() {
1073+
if !Rewriter::sql_push_down_enabled() {
1074+
return;
1075+
}
1076+
init_testing_logger();
1077+
1078+
let query_plan = convert_select_to_query_plan(
1079+
// language=PostgreSQL
1080+
r#"
1081+
SELECT
1082+
MAX(customer_gender)
1083+
FROM (
1084+
SELECT
1085+
customer_gender
1086+
FROM
1087+
KibanaSampleDataEcommerce
1088+
LIMIT 5
1089+
) scan
1090+
"#
1091+
.to_string(),
1092+
DatabaseProtocol::PostgreSQL,
1093+
)
1094+
.await;
1095+
1096+
let physical_plan = query_plan.as_physical_plan().await.unwrap();
1097+
println!(
1098+
"Physical plan: {}",
1099+
displayable(physical_plan.as_ref()).indent()
1100+
);
1101+
1102+
let logical_plan = query_plan.as_logical_plan();
1103+
assert_eq!(
1104+
logical_plan.find_cube_scan().request,
1105+
V1LoadRequestQuery {
1106+
measures: Some(vec![]),
1107+
dimensions: Some(vec![]),
1108+
segments: Some(vec![]),
1109+
order: Some(vec![]),
1110+
limit: Some(5),
1111+
ungrouped: Some(true),
1112+
..Default::default()
1113+
}
1114+
);
1115+
1116+
assert!(logical_plan
1117+
.find_cube_scan_wrapper()
1118+
.wrapped_sql
1119+
.unwrap()
1120+
.sql
1121+
.contains("\"limit\":5"));
1122+
assert!(query_plan
1123+
.as_logical_plan()
1124+
.find_cube_scan_wrapper()
1125+
.wrapped_sql
1126+
.unwrap()
1127+
.sql
1128+
.contains("\"ungrouped\":true"));
1129+
}

0 commit comments

Comments
 (0)