@@ -2675,77 +2675,14 @@ impl MemberRules {
26752675 let left_aliases_var = var ! ( left_aliases_var) ;
26762676 let right_aliases_var = var ! ( right_aliases_var) ;
26772677 move |egraph, subst| {
2678- if egraph
2679- . index ( subst[ left_aliases_var] )
2680- . data
2681- . member_name_to_expr
2682- . is_some ( )
2683- {
2684- if egraph
2685- . index ( subst[ right_aliases_var] )
2686- . data
2687- . member_name_to_expr
2688- . is_some ( )
2689- {
2690- let left_join_ons: Vec < Vec < _ > > =
2691- var_iter ! ( egraph[ subst[ left_on_var] ] , JoinLeftOn )
2692- . map ( |elem| elem. iter ( ) . cloned ( ) . collect ( ) )
2693- . collect ( ) ;
2694- for left_join_on in left_join_ons {
2695- for join_on in left_join_on {
2696- let member_names_to_expr_left = & mut egraph
2697- . index_mut ( subst[ left_aliases_var] )
2698- . data
2699- . member_name_to_expr
2700- . as_mut ( )
2701- . unwrap ( ) ;
2702-
2703- // TODO: Avoid the join_on.*.clone() calls (should be trivial).
2704- let mut column_name = join_on. name . clone ( ) ;
2705- if let Some ( name) = find_column_by_alias (
2706- & column_name,
2707- member_names_to_expr_left,
2708- & join_on. relation . clone ( ) . unwrap_or_default ( ) ,
2709- ) {
2710- column_name = name. split ( "." ) . last ( ) . unwrap ( ) . to_string ( ) ;
2711- }
2712-
2713- if column_name == "__cubeJoinField" {
2714- let right_join_ons: Vec < Vec < _ > > =
2715- var_iter ! ( egraph[ subst[ right_on_var] ] , JoinRightOn )
2716- . map ( |elem| elem. iter ( ) . cloned ( ) . collect ( ) )
2717- . collect ( ) ;
2718- for right_join_on in right_join_ons {
2719- for join_on in right_join_on. iter ( ) {
2720- let member_names_to_expr_right = & mut egraph
2721- . index_mut ( subst[ right_aliases_var] )
2722- . data
2723- . member_name_to_expr
2724- . as_mut ( )
2725- . unwrap ( ) ;
2726-
2727- let mut column_name = join_on. name . clone ( ) ;
2728- if let Some ( name) = find_column_by_alias (
2729- & column_name,
2730- member_names_to_expr_right,
2731- & join_on. relation . clone ( ) . unwrap_or_default ( ) ,
2732- ) {
2733- column_name =
2734- name. split ( "." ) . last ( ) . unwrap ( ) . to_string ( ) ;
2735- }
2736-
2737- if column_name == "__cubeJoinField" {
2738- return true ;
2739- }
2740- }
2741- }
2742- }
2743- }
2744- }
2745- }
2746- }
2747-
2748- false
2678+ is_proper_cube_join_condition (
2679+ egraph,
2680+ subst,
2681+ left_aliases_var,
2682+ left_on_var,
2683+ right_aliases_var,
2684+ right_on_var,
2685+ )
27492686 }
27502687 }
27512688
@@ -2923,6 +2860,85 @@ fn find_column_by_alias(
29232860 None
29242861}
29252862
2863+ fn is_proper_cube_join_condition (
2864+ egraph : & mut CubeEGraph ,
2865+ subst : & Subst ,
2866+ left_cube_members_var : Var ,
2867+ left_on_var : Var ,
2868+ right_cube_members_var : Var ,
2869+ right_on_var : Var ,
2870+ ) -> bool {
2871+ if egraph
2872+ . index ( subst[ left_cube_members_var] )
2873+ . data
2874+ . member_name_to_expr
2875+ . is_some ( )
2876+ {
2877+ if egraph
2878+ . index ( subst[ right_cube_members_var] )
2879+ . data
2880+ . member_name_to_expr
2881+ . is_some ( )
2882+ {
2883+ let left_join_ons: Vec < Vec < _ > > = var_iter ! ( egraph[ subst[ left_on_var] ] , JoinLeftOn )
2884+ . map ( |elem| elem. iter ( ) . cloned ( ) . collect ( ) )
2885+ . collect ( ) ;
2886+ for left_join_on in left_join_ons {
2887+ for join_on in left_join_on {
2888+ let member_names_to_expr_left = & mut egraph
2889+ . index_mut ( subst[ left_cube_members_var] )
2890+ . data
2891+ . member_name_to_expr
2892+ . as_mut ( )
2893+ . unwrap ( ) ;
2894+
2895+ // TODO: Avoid the join_on.*.clone() calls (should be trivial).
2896+ let mut column_name = join_on. name . clone ( ) ;
2897+ if let Some ( name) = find_column_by_alias (
2898+ & column_name,
2899+ member_names_to_expr_left,
2900+ & join_on. relation . clone ( ) . unwrap_or_default ( ) ,
2901+ ) {
2902+ column_name = name. split ( "." ) . last ( ) . unwrap ( ) . to_string ( ) ;
2903+ }
2904+
2905+ if column_name == "__cubeJoinField" {
2906+ let right_join_ons: Vec < Vec < _ > > =
2907+ var_iter ! ( egraph[ subst[ right_on_var] ] , JoinRightOn )
2908+ . map ( |elem| elem. iter ( ) . cloned ( ) . collect ( ) )
2909+ . collect ( ) ;
2910+ for right_join_on in right_join_ons {
2911+ for join_on in right_join_on. iter ( ) {
2912+ let member_names_to_expr_right = & mut egraph
2913+ . index_mut ( subst[ right_cube_members_var] )
2914+ . data
2915+ . member_name_to_expr
2916+ . as_mut ( )
2917+ . unwrap ( ) ;
2918+
2919+ let mut column_name = join_on. name . clone ( ) ;
2920+ if let Some ( name) = find_column_by_alias (
2921+ & column_name,
2922+ member_names_to_expr_right,
2923+ & join_on. relation . clone ( ) . unwrap_or_default ( ) ,
2924+ ) {
2925+ column_name = name. split ( "." ) . last ( ) . unwrap ( ) . to_string ( ) ;
2926+ }
2927+
2928+ if column_name == "__cubeJoinField" {
2929+ return true ;
2930+ }
2931+ }
2932+ }
2933+ }
2934+ }
2935+ }
2936+ }
2937+ }
2938+
2939+ false
2940+ }
2941+
29262942#[ cfg( test) ]
29272943mod tests {
29282944 use super :: * ;
0 commit comments