Skip to content

Commit 0ef06e4

Browse files
committed
refactor(cubesql): Extract cube join condition check for rewrites to function
1 parent 7def23b commit 0ef06e4

File tree

1 file changed

+87
-71
lines changed
  • rust/cubesql/cubesql/src/compile/rewrite/rules

1 file changed

+87
-71
lines changed

rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs

Lines changed: 87 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
29272943
mod tests {
29282944
use super::*;

0 commit comments

Comments
 (0)