|
| 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; |
@@ -1080,3 +1081,127 @@ async fn test_wrapper_filter_flatten() { |
1080 | 1081 | } |
1081 | 1082 | ); |
1082 | 1083 | } |
| 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