Skip to content

Commit 15faa24

Browse files
committed
chore(cubesql): Re-resolve CubeScan aliases
1 parent 8beecb5 commit 15faa24

File tree

2 files changed

+121
-12
lines changed

2 files changed

+121
-12
lines changed

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,7 @@ impl RewriteRules for FilterRules {
21132113
"?time_dimension_date_range",
21142114
),
21152115
),
2116-
rewrite(
2116+
transforming_rewrite(
21172117
"in-date-range-to-time-dimension-swap-to-members",
21182118
cube_scan(
21192119
"?source_table_name",
@@ -2141,10 +2141,11 @@ impl RewriteRules for FilterRules {
21412141
"?order",
21422142
"?limit",
21432143
"?offset",
2144-
"?aliases",
2144+
"?aliases_none",
21452145
"CubeScanSplit:false",
21462146
"?can_pushdown_join",
21472147
),
2148+
self.transform_cube_scan_aliases_none("?aliases_none"),
21482149
),
21492150
transforming_rewrite(
21502151
"time-dimension-date-range-replacer-push-down-left",
@@ -2284,6 +2285,10 @@ impl FilterRules {
22842285
for cube_aliases in
22852286
var_iter!(egraph[subst[cube_aliases_var]], CubeScanAliases).cloned()
22862287
{
2288+
if cube_aliases.is_none() {
2289+
continue;
2290+
}
2291+
22872292
if let Some(_referenced_expr) =
22882293
&egraph.index(subst[exp_var]).data.referenced_expr
22892294
{
@@ -3811,6 +3816,20 @@ impl FilterRules {
38113816
false
38123817
}
38133818
}
3819+
3820+
fn transform_cube_scan_aliases_none(
3821+
&self,
3822+
aliases_none_var: &'static str,
3823+
) -> impl Fn(&mut EGraph<LogicalPlanLanguage, LogicalPlanAnalysis>, &mut Subst) -> bool {
3824+
let aliases_none_var = var!(aliases_none_var);
3825+
move |egraph, subst| {
3826+
subst.insert(
3827+
aliases_none_var,
3828+
egraph.add(LogicalPlanLanguage::CubeScanAliases(CubeScanAliases(None))),
3829+
);
3830+
true
3831+
}
3832+
}
38143833
}
38153834

38163835
fn filter_flatten_rewrite_left(

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

Lines changed: 100 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)