@@ -497,14 +497,15 @@ impl RewriteRules for MemberRules {
497497 "?orders" ,
498498 "?limit" ,
499499 "?offset" ,
500- "?aliases " ,
500+ "?aliases_none " ,
501501 "?split" ,
502502 "?can_pushdown_join" ,
503503 ) ,
504504 self . push_down_projection_to_empty_scan(
505505 "?alias" ,
506506 "?alias_to_cube" ,
507507 "?aliases" ,
508+ Some ( "?aliases_none" ) ,
508509 "?new_alias_to_cube" ,
509510 "?member_replacer_alias_to_cube" ,
510511 "?member_replacer_aliases" ,
@@ -581,19 +582,48 @@ impl RewriteRules for MemberRules {
581582 "?orders" ,
582583 "?limit" ,
583584 "?offset" ,
584- "?cube_aliases " ,
585+ "?aliases_none " ,
585586 "CubeScanSplit:false" ,
586587 "?can_pushdown_join" ,
587588 ) ,
588589 self . push_down_projection_to_empty_scan(
589590 "?alias" ,
590591 "?alias_to_cube" ,
591592 "?cube_aliases" ,
593+ Some ( "?aliases_none" ) ,
592594 "?new_alias_to_cube" ,
593595 "?member_replacer_alias_to_cube" ,
594596 "?member_replacer_aliases" ,
595597 ) ,
596598 ) ,
599+ // TODO: this rule could benefit from more specific searcher but this would require
600+ // extending CubeScanAliases or introducing a placeholder node
601+ transforming_rewrite(
602+ "cube-scan-resolve-aliases" ,
603+ cube_scan(
604+ "?alias_to_cube" ,
605+ "?members" ,
606+ "?filters" ,
607+ "?orders" ,
608+ "?limit" ,
609+ "?offset" ,
610+ "?aliases" ,
611+ "?split" ,
612+ "?can_pushdown_join" ,
613+ ) ,
614+ cube_scan(
615+ "?alias_to_cube" ,
616+ "?members" ,
617+ "?filters" ,
618+ "?orders" ,
619+ "?limit" ,
620+ "?offset" ,
621+ "?new_aliases" ,
622+ "?split" ,
623+ "?can_pushdown_join" ,
624+ ) ,
625+ self . cube_scan_resolve_aliases( "?members" , "?aliases" , "?new_aliases" ) ,
626+ ) ,
597627 transforming_rewrite(
598628 "limit-push-down" ,
599629 limit(
@@ -1326,12 +1356,9 @@ impl MemberRules {
13261356 . find ( |( cn, _) | c == cn)
13271357 . is_some ( )
13281358 } ) {
1329- let cube_aliases =
1330- egraph. add ( LogicalPlanLanguage :: CubeScanAliases (
1331- CubeScanAliases ( Some ( column_name_to_member_to_aliases (
1332- column_name_to_member_name,
1333- ) ) ) ,
1334- ) ) ;
1359+ let cube_aliases = egraph. add (
1360+ LogicalPlanLanguage :: CubeScanAliases ( CubeScanAliases ( None ) ) ,
1361+ ) ;
13351362 subst. insert ( cube_aliases_var, cube_aliases) ;
13361363
13371364 let replaced_alias_to_cube =
@@ -1367,6 +1394,41 @@ impl MemberRules {
13671394 }
13681395 }
13691396
1397+ fn cube_scan_resolve_aliases (
1398+ & self ,
1399+ members_var : & ' static str ,
1400+ aliases_var : & ' static str ,
1401+ new_aliases_var : & ' static str ,
1402+ ) -> impl Fn ( & mut EGraph < LogicalPlanLanguage , LogicalPlanAnalysis > , & mut Subst ) -> bool {
1403+ let members_var = var ! ( members_var) ;
1404+ let aliases_var = var ! ( aliases_var) ;
1405+ let new_aliases_var = var ! ( new_aliases_var) ;
1406+ move |egraph, subst| {
1407+ for aliases in var_iter ! ( egraph[ subst[ aliases_var] ] , CubeScanAliases ) {
1408+ if aliases. is_some ( ) {
1409+ continue ;
1410+ }
1411+
1412+ if let Some ( member_name_to_expr) = egraph
1413+ . index ( subst[ members_var] )
1414+ . data
1415+ . member_name_to_expr
1416+ . clone ( )
1417+ {
1418+ let column_name_to_member_name = column_name_to_member_vec ( member_name_to_expr) ;
1419+ subst. insert (
1420+ new_aliases_var,
1421+ egraph. add ( LogicalPlanLanguage :: CubeScanAliases ( CubeScanAliases ( Some (
1422+ column_name_to_member_to_aliases ( column_name_to_member_name) ,
1423+ ) ) ) ) ,
1424+ ) ;
1425+ return true ;
1426+ }
1427+ }
1428+ false
1429+ }
1430+ }
1431+
13701432 fn replace_alias (
13711433 alias_to_cube : & Vec < ( String , String ) > ,
13721434 projection_alias : & Option < String > ,
@@ -1455,6 +1517,10 @@ impl MemberRules {
14551517 for cube_aliases in
14561518 var_iter ! ( egraph[ subst[ cube_aliases_var] ] , CubeScanAliases ) . cloned ( )
14571519 {
1520+ if cube_aliases. is_none ( ) {
1521+ continue ;
1522+ }
1523+
14581524 let member_replacer_alias_to_cube = egraph. add (
14591525 LogicalPlanLanguage :: MemberReplacerAliasToCube ( MemberReplacerAliasToCube (
14601526 Self :: member_replacer_alias_to_cube ( & alias_to_cube, & None ) ,
@@ -1484,13 +1550,15 @@ impl MemberRules {
14841550 alias_var : & ' static str ,
14851551 alias_to_cube_var : & ' static str ,
14861552 cube_aliases_var : & ' static str ,
1553+ cube_aliases_none_var : Option < & ' static str > ,
14871554 new_alias_to_cube_var : & ' static str ,
14881555 member_replacer_alias_to_cube_var : & ' static str ,
14891556 member_replacer_aliases_var : & ' static str ,
14901557 ) -> impl Fn ( & mut EGraph < LogicalPlanLanguage , LogicalPlanAnalysis > , & mut Subst ) -> bool {
14911558 let alias_var = var ! ( alias_var) ;
14921559 let alias_to_cube_var = var ! ( alias_to_cube_var) ;
14931560 let cube_aliases_var = var ! ( cube_aliases_var) ;
1561+ let cube_aliases_none_var = cube_aliases_none_var. map ( |v| var ! ( v) ) ;
14941562 let new_alias_to_cube_var = var ! ( new_alias_to_cube_var) ;
14951563 let member_replacer_alias_to_cube_var = var ! ( member_replacer_alias_to_cube_var) ;
14961564 let member_replacer_aliases_var = var ! ( member_replacer_aliases_var) ;
@@ -1536,6 +1604,12 @@ impl MemberRules {
15361604 ) ) ;
15371605 subst. insert ( member_replacer_aliases_var, member_replacer_aliases) ;
15381606
1607+ if let Some ( cube_aliases_none_var) = cube_aliases_none_var {
1608+ let cube_aliases_none = egraph
1609+ . add ( LogicalPlanLanguage :: CubeScanAliases ( CubeScanAliases ( None ) ) ) ;
1610+ subst. insert ( cube_aliases_none_var, cube_aliases_none) ;
1611+ }
1612+
15391613 return true ;
15401614 }
15411615 }
@@ -2735,10 +2809,18 @@ impl MemberRules {
27352809 for left_aliases in
27362810 var_iter ! ( egraph[ subst[ left_aliases_var] ] , CubeScanAliases ) . cloned ( )
27372811 {
2812+ if left_aliases. is_none ( ) {
2813+ continue ;
2814+ }
2815+
27382816 for right_aliases in
27392817 var_iter ! ( egraph[ subst[ right_aliases_var] ] , CubeScanAliases )
27402818 . cloned ( )
27412819 {
2820+ if right_aliases. is_none ( ) {
2821+ continue ;
2822+ }
2823+
27422824 subst. insert (
27432825 joined_alias_to_cube_var,
27442826 egraph. add ( LogicalPlanLanguage :: CubeScanAliasToCube (
@@ -2841,11 +2923,19 @@ impl MemberRules {
28412923 move |egraph, subst| {
28422924 for left_aliases in var_iter ! ( egraph[ subst[ left_aliases_var] ] , CubeScanAliases ) . cloned ( )
28432925 {
2844- let left_aliases = left_aliases. unwrap_or ( vec ! [ ] ) ;
2926+ if left_aliases. is_none ( ) {
2927+ continue ;
2928+ }
2929+
2930+ let left_aliases = left_aliases. unwrap ( ) ;
28452931 for right_aliases in
28462932 var_iter ! ( egraph[ subst[ right_aliases_var] ] , CubeScanAliases ) . cloned ( )
28472933 {
2848- let right_aliases = right_aliases. unwrap_or ( vec ! [ ] ) ;
2934+ if right_aliases. is_none ( ) {
2935+ continue ;
2936+ }
2937+
2938+ let right_aliases = right_aliases. unwrap ( ) ;
28492939 for left_join_on in var_iter ! ( egraph[ subst[ left_on_var] ] , JoinLeftOn ) {
28502940 for join_on in left_join_on. iter ( ) {
28512941 let mut column_name = join_on. name . clone ( ) ;
0 commit comments