File tree Expand file tree Collapse file tree 2 files changed +62
-0
lines changed
rust/cubesql/cubesql/src/compile Expand file tree Collapse file tree 2 files changed +62
-0
lines changed Original file line number Diff line number Diff line change @@ -362,6 +362,22 @@ impl RewriteRules for FilterRules {
362362 change_user_member( "?user" ) ,
363363 self . transform_change_user_eq( "?column" , "?literal" , "?user" ) ,
364364 ) ,
365+ transforming_rewrite(
366+ "user-is-not-null-filter" ,
367+ filter_replacer(
368+ is_not_null_expr( column_expr( "?column" ) ) ,
369+ "?alias_to_cube" ,
370+ "?members" ,
371+ "?filter_aliases" ,
372+ ) ,
373+ filter_replacer(
374+ literal_bool( true ) ,
375+ "?alias_to_cube" ,
376+ "?members" ,
377+ "?filter_aliases" ,
378+ ) ,
379+ self . transform_user_is_not_null( "?column" ) ,
380+ ) ,
365381 transforming_rewrite(
366382 "join-field-filter-eq" ,
367383 filter_replacer(
@@ -3338,6 +3354,22 @@ impl FilterRules {
33383354 }
33393355 }
33403356
3357+ fn transform_user_is_not_null (
3358+ & self ,
3359+ column_var : & ' static str ,
3360+ ) -> impl Fn ( & mut EGraph < LogicalPlanLanguage , LogicalPlanAnalysis > , & mut Subst ) -> bool {
3361+ let column_var = var ! ( column_var) ;
3362+
3363+ move |egraph, subst| {
3364+ for column in var_iter ! ( egraph[ subst[ column_var] ] , ColumnExprColumn ) . cloned ( ) {
3365+ if column. name . eq_ignore_ascii_case ( "__user" ) {
3366+ return true ;
3367+ }
3368+ }
3369+ false
3370+ }
3371+ }
3372+
33413373 // Transform ?expr IN (?literal) to ?expr = ?literal
33423374 fn transform_filter_in_to_equal (
33433375 & self ,
Original file line number Diff line number Diff line change @@ -110,6 +110,36 @@ async fn test_change_user_via_in_filter_thoughtspot() {
110110 assert_eq ! ( cube_scan. request, expected_request) ;
111111}
112112
113+ #[ tokio:: test]
114+ async fn test_change_user_via_filter_powerbi ( ) {
115+ init_testing_logger ( ) ;
116+
117+ let query_plan = convert_select_to_query_plan (
118+ "SELECT COUNT(*) as cnt FROM KibanaSampleDataEcommerce WHERE NOT __user IS NULL AND __user = 'gopher'" . to_string ( ) ,
119+ DatabaseProtocol :: PostgreSQL ,
120+ )
121+ . await ;
122+
123+ let cube_scan = query_plan. as_logical_plan ( ) . find_cube_scan ( ) ;
124+
125+ assert_eq ! ( cube_scan. options. change_user, Some ( "gopher" . to_string( ) ) ) ;
126+
127+ assert_eq ! (
128+ cube_scan. request,
129+ V1LoadRequestQuery {
130+ measures: Some ( vec![ "KibanaSampleDataEcommerce.count" . to_string( ) , ] ) ,
131+ segments: Some ( vec![ ] ) ,
132+ dimensions: Some ( vec![ ] ) ,
133+ time_dimensions: None ,
134+ order: Some ( vec![ ] ) ,
135+ limit: None ,
136+ offset: None ,
137+ filters: None ,
138+ ungrouped: None ,
139+ }
140+ )
141+ }
142+
113143#[ tokio:: test]
114144async fn test_change_user_via_filter_and ( ) {
115145 let query_plan = convert_select_to_query_plan (
You can’t perform that action at this time.
0 commit comments