|
| 1 | +use cubeclient::models::V1LoadRequestQuery; |
1 | 2 | use datafusion::physical_plan::displayable; |
2 | 3 | use pretty_assertions::assert_eq; |
3 | 4 | use serde_json::json; |
@@ -1258,3 +1259,127 @@ async fn test_wrapper_filter_flatten() { |
1258 | 1259 | } |
1259 | 1260 | ); |
1260 | 1261 | } |
| 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