@@ -5,7 +5,7 @@ use crate::{
55 rules:: wrapper:: WrapperRules ,
66 transforming_rewrite, wrapped_select, wrapped_select_having_expr_empty_tail,
77 wrapped_select_joins_empty_tail, wrapper_pullup_replacer, LogicalPlanLanguage ,
8- WrappedSelectSelectType , WrappedSelectType ,
8+ WrappedSelectSelectType , WrappedSelectType , WrapperPullupReplacerUngrouped ,
99 } ,
1010 var, var_iter, var_list_iter,
1111} ;
@@ -109,13 +109,20 @@ impl WrapperRules {
109109 ) ,
110110 "?alias_to_cube" ,
111111 // TODO in fact ungrouped flag is being used not only to indicate that underlying query is ungrouped however to indicate that WrappedSelect won't push down Cube members. Do we need separate flags?
112- "WrapperPullupReplacerUngrouped:false" ,
112+ // TODO this can be completely incorrect
113+ // "WrapperPullupReplacerUngrouped:false",
114+ "?out_ungrouped" ,
113115 "?in_projection" ,
114116 "?cube_members" ,
115117 ) ,
116118 "CubeScanWrapperFinalized:false" ,
117119 ) ,
118- self . transform_pull_up_wrapper_select( "?cube_scan_input" ) ,
120+ self . transform_pull_up_wrapper_select(
121+ "?cube_scan_input" ,
122+ "?select_type" ,
123+ "?ungrouped" ,
124+ "?out_ungrouped" ,
125+ ) ,
119126 ) ,
120127 transforming_rewrite(
121128 "wrapper-pull-up-to-cube-scan-non-trivial-wrapped-select" ,
@@ -270,13 +277,45 @@ impl WrapperRules {
270277 fn transform_pull_up_wrapper_select (
271278 & self ,
272279 cube_scan_input_var : & ' static str ,
280+ select_type_var : & ' static str ,
281+ ungrouped_var : & ' static str ,
282+ out_ungrouped_var : & ' static str ,
273283 ) -> impl Fn ( & mut CubeEGraph , & mut Subst ) -> bool {
274284 let cube_scan_input_var = var ! ( cube_scan_input_var) ;
285+ let select_type_var = var ! ( select_type_var) ;
286+ let ungrouped_var = var ! ( ungrouped_var) ;
287+ let out_ungrouped_var = var ! ( out_ungrouped_var) ;
275288 move |egraph, subst| {
276289 for _ in var_list_iter ! ( egraph[ subst[ cube_scan_input_var] ] , WrappedSelect ) . cloned ( ) {
277290 return false ;
278291 }
279- true
292+
293+ for select_type in
294+ var_iter ! ( egraph[ subst[ select_type_var] ] , WrappedSelectSelectType ) . cloned ( )
295+ {
296+ for ungrouped in
297+ var_iter ! ( egraph[ subst[ ungrouped_var] ] , WrapperPullupReplacerUngrouped ) . cloned ( )
298+ {
299+ if select_type == WrappedSelectType :: Aggregate {
300+ subst. insert (
301+ out_ungrouped_var,
302+ egraph. add ( LogicalPlanLanguage :: WrapperPullupReplacerUngrouped (
303+ WrapperPullupReplacerUngrouped ( false ) ,
304+ ) ) ,
305+ ) ;
306+ } else {
307+ subst. insert (
308+ out_ungrouped_var,
309+ egraph. add ( LogicalPlanLanguage :: WrapperPullupReplacerUngrouped (
310+ WrapperPullupReplacerUngrouped ( ungrouped) ,
311+ ) ) ,
312+ ) ;
313+ }
314+ return true ;
315+ }
316+ }
317+
318+ false
280319 }
281320 }
282321
0 commit comments