Skip to content

Commit 922ac49

Browse files
committed
[WIP] Calculate proper ungroupedness for trivial wrapper pullup
1 parent 7def23b commit 922ac49

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs

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

Comments
 (0)