1- use cubeclient:: models:: V1LoadRequestQuery ;
2- use datafusion:: physical_plan:: displayable;
1+ use cubeclient:: models:: { V1LoadRequestQuery , V1LoadRequestQueryTimeDimension } ;
2+ use datafusion:: { physical_plan:: displayable, scalar :: ScalarValue } ;
33use pretty_assertions:: assert_eq;
44use regex:: Regex ;
55use serde_json:: json;
66use std:: sync:: Arc ;
77
88use crate :: {
99 compile:: {
10+ engine:: df:: scan:: MemberField ,
1011 rewrite:: rewriter:: Rewriter ,
1112 test:: {
1213 convert_select_to_query_plan, convert_select_to_query_plan_customized,
@@ -1167,6 +1168,12 @@ cube_scan_subq AS (
11671168 SELECT
11681169 logs_alias.content logs_content,
11691170 DATE_TRUNC('month', kibana_alias.last_mod) last_mod_month,
1171+ kibana_alias.__user AS cube_user,
1172+ 1 AS literal,
1173+ -- Columns without aliases should also work
1174+ DATE_TRUNC('month', kibana_alias.order_date),
1175+ kibana_alias.__cubeJoinField,
1176+ 2,
11701177 CASE
11711178 WHEN sum(kibana_alias."sumPrice") IS NOT NULL
11721179 THEN sum(kibana_alias."sumPrice")
@@ -1175,9 +1182,7 @@ cube_scan_subq AS (
11751182 FROM KibanaSampleDataEcommerce kibana_alias
11761183 JOIN Logs logs_alias
11771184 ON kibana_alias.__cubeJoinField = logs_alias.__cubeJoinField
1178- GROUP BY
1179- logs_content,
1180- last_mod_month
1185+ GROUP BY 1,2,3,4,5,6,7
11811186),
11821187filter_subq AS (
11831188 SELECT
@@ -1187,7 +1192,12 @@ filter_subq AS (
11871192 logs_content_filter
11881193)
11891194SELECT
1190- logs_content
1195+ -- Should use SELECT * here to reference columns without aliases.
1196+ -- But it's broken ATM in DF, initial plan contains `Projection: ... #__subquery-0.logs_content_filter` on top, but it should not be there
1197+ -- TODO fix it
1198+ logs_content,
1199+ cube_user,
1200+ literal
11911201FROM cube_scan_subq
11921202WHERE
11931203 -- This subquery filter should trigger wrapping of whole query
@@ -1216,6 +1226,43 @@ WHERE
12161226 . unwrap ( )
12171227 . sql ;
12181228
1229+ assert_eq ! (
1230+ logical_plan. find_cube_scan( ) . request,
1231+ V1LoadRequestQuery {
1232+ measures: Some ( vec![ "KibanaSampleDataEcommerce.sumPrice" . to_string( ) , ] ) ,
1233+ dimensions: Some ( vec![ "Logs.content" . to_string( ) , ] ) ,
1234+ time_dimensions: Some ( vec![
1235+ V1LoadRequestQueryTimeDimension {
1236+ dimension: "KibanaSampleDataEcommerce.last_mod" . to_string( ) ,
1237+ granularity: Some ( "month" . to_string( ) ) ,
1238+ date_range: None ,
1239+ } ,
1240+ V1LoadRequestQueryTimeDimension {
1241+ dimension: "KibanaSampleDataEcommerce.order_date" . to_string( ) ,
1242+ granularity: Some ( "month" . to_string( ) ) ,
1243+ date_range: None ,
1244+ } ,
1245+ ] ) ,
1246+ segments: Some ( vec![ ] ) ,
1247+ order: Some ( vec![ ] ) ,
1248+ ..Default :: default ( )
1249+ }
1250+ ) ;
1251+
1252+ assert_eq ! (
1253+ logical_plan. find_cube_scan( ) . member_fields,
1254+ vec![
1255+ MemberField :: Member ( "Logs.content" . to_string( ) ) ,
1256+ MemberField :: Member ( "KibanaSampleDataEcommerce.last_mod.month" . to_string( ) ) ,
1257+ MemberField :: Literal ( ScalarValue :: Utf8 ( None ) ) ,
1258+ MemberField :: Literal ( ScalarValue :: Int64 ( Some ( 1 ) ) ) ,
1259+ MemberField :: Member ( "KibanaSampleDataEcommerce.order_date.month" . to_string( ) ) ,
1260+ MemberField :: Literal ( ScalarValue :: Utf8 ( None ) ) ,
1261+ MemberField :: Literal ( ScalarValue :: Int64 ( Some ( 2 ) ) ) ,
1262+ MemberField :: Member ( "KibanaSampleDataEcommerce.sumPrice" . to_string( ) ) ,
1263+ ] ,
1264+ ) ;
1265+
12191266 // Check that all aliases from different tables have same qualifier, and that names are simple and short
12201267 // logs_content => logs_alias.content
12211268 // last_mod_month => DATE_TRUNC('month', kibana_alias.last_mod),
@@ -1228,6 +1275,10 @@ WHERE
12281275 let sum_price_re = Regex :: new ( r#"CASE WHEN "logs_alias"."[a-zA-Z0-9_]{1,16}" IS NOT NULL THEN "logs_alias"."[a-zA-Z0-9_]{1,16}" ELSE 0 END "sum_price""# )
12291276 . unwrap ( ) ;
12301277 assert ! ( sum_price_re. is_match( & sql) ) ;
1278+ let cube_user_re = Regex :: new ( r#""logs_alias"."[a-zA-Z0-9_]{1,16}" "cube_user""# ) . unwrap ( ) ;
1279+ assert ! ( cube_user_re. is_match( & sql) ) ;
1280+ let literal_re = Regex :: new ( r#""logs_alias"."[a-zA-Z0-9_]{1,16}" "literal""# ) . unwrap ( ) ;
1281+ assert ! ( literal_re. is_match( & sql) ) ;
12311282}
12321283
12331284/// Test that WrappedSelect(... limit=Some(0) ...) will render it correctly
0 commit comments