From a8c0a74f38fc8f41735cf63ccd4ecc7301172807 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Tue, 29 Oct 2024 19:01:03 +0200 Subject: [PATCH 1/9] refactor(cubesql): Make var_iter and var_list_iter more hygienic --- rust/cubesql/cubesql/src/compile/rewrite/mod.rs | 6 ++++-- .../src/compile/rewrite/rules/wrapper/aggregate_function.rs | 3 +-- .../src/compile/rewrite/rules/wrapper/binary_expr.rs | 2 +- .../cubesql/src/compile/rewrite/rules/wrapper/case.rs | 2 +- .../cubesql/src/compile/rewrite/rules/wrapper/extract.rs | 3 +-- .../src/compile/rewrite/rules/wrapper/in_list_expr.rs | 2 +- .../src/compile/rewrite/rules/wrapper/is_null_expr.rs | 2 +- .../cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs | 3 +-- .../src/compile/rewrite/rules/wrapper/negative_expr.rs | 2 +- .../cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs | 2 +- .../src/compile/rewrite/rules/wrapper/scalar_function.rs | 2 +- .../src/compile/rewrite/rules/wrapper/udf_function.rs | 2 +- .../src/compile/rewrite/rules/wrapper/window_function.rs | 3 +-- .../src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs | 4 ++-- 14 files changed, 18 insertions(+), 20 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs index 2f2445a52d640..eeb0d864d8751 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs @@ -500,7 +500,9 @@ crate::plan_to_language! { macro_rules! var_iter { ($eclass:expr, $field_variant:ident) => {{ $eclass.nodes.iter().filter_map(|node| match node { - LogicalPlanLanguage::$field_variant($field_variant(v)) => Some(v), + $crate::compile::rewrite::LogicalPlanLanguage::$field_variant($field_variant(v)) => { + Some(v) + } _ => None, }) }}; @@ -510,7 +512,7 @@ macro_rules! var_iter { macro_rules! var_list_iter { ($eclass:expr, $field_variant:ident) => {{ $eclass.nodes.iter().filter_map(|node| match node { - LogicalPlanLanguage::$field_variant(v) => Some(v), + $crate::compile::rewrite::LogicalPlanLanguage::$field_variant(v) => Some(v), _ => None, }) }}; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs index b398f77221d94..35c4deeef968d 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs @@ -4,8 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - AggregateFunctionExprDistinct, AggregateFunctionExprFun, LogicalPlanLanguage, - WrapperPullupReplacerAliasToCube, + AggregateFunctionExprDistinct, AggregateFunctionExprFun, WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs index d39c897fa76aa..f1c007ea6af3f 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs index 4ffa6de10d6dc..fe2b9e19f4e06 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs index c1d3072cd13f1..1ae5903a0fc5d 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs @@ -3,8 +3,7 @@ use crate::{ literal_expr, rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, - transforming_rewrite, wrapper_pullup_replacer, LogicalPlanLanguage, - WrapperPullupReplacerAliasToCube, + transforming_rewrite, wrapper_pullup_replacer, WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs index 01a9c42957789..71a5ee71fcd11 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs index 6c84953ddc211..14dfc04ef0dc9 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs index 41b38376b8f2f..544accf3f0db8 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs @@ -4,8 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LikeExprEscapeChar, LikeExprLikeType, LikeType, LogicalPlanLanguage, - WrapperPullupReplacerAliasToCube, + LikeExprEscapeChar, LikeExprLikeType, LikeType, WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs index 20ef82810d1ce..5a040964fa3c9 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs index 79d1b114fcb90..2866c89c5448c 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs index b6cd4883c8c54..731eab66934ed 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, scalar_fun_expr_args_empty_tail, scalar_fun_expr_args_legacy, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListPattern, ListType, - LogicalPlanLanguage, ScalarFunctionExprFun, WrapperPullupReplacerAliasToCube, + ScalarFunctionExprFun, WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs index 25bd9f7aa4e48..7a8413d43396a 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, udf_expr_var_arg, udf_fun_expr_args, udf_fun_expr_args_empty_tail, - wrapper_pullup_replacer, wrapper_pushdown_replacer, LogicalPlanLanguage, ScalarUDFExprFun, + wrapper_pullup_replacer, wrapper_pushdown_replacer, ScalarUDFExprFun, WrapperPullupReplacerAliasToCube, }, var, var_iter, diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs index de89203ff4321..31c6b61373a67 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs @@ -4,8 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, window_fun_expr_var_arg, wrapper_pullup_replacer, - wrapper_pushdown_replacer, LogicalPlanLanguage, WindowFunctionExprFun, - WrapperPullupReplacerAliasToCube, + wrapper_pushdown_replacer, WindowFunctionExprFun, WrapperPullupReplacerAliasToCube, }, var, var_iter, }; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs index cb59a308fc48f..24e28c4f9b9d1 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs @@ -4,8 +4,8 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapped_select, wrapped_select_having_expr_empty_tail, - wrapped_select_joins_empty_tail, wrapper_pullup_replacer, LogicalPlanLanguage, - WrappedSelectSelectType, WrappedSelectType, + wrapped_select_joins_empty_tail, wrapper_pullup_replacer, WrappedSelectSelectType, + WrappedSelectType, }, var, var_iter, var_list_iter, }; From 74e80593c27860e825ae6ccc759cc4e0ce964f18 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Thu, 24 Oct 2024 15:02:31 +0300 Subject: [PATCH 2/9] refactor(cubesql): Rename ungrouped field of WrappedSelectNode to push_to_cube This name seems more appropriate, because actual WrappedSelect can represent grouped query when this field is set to true --- .../cubesql/src/compile/engine/df/scan.rs | 16 ++++++--- .../cubesql/src/compile/engine/df/wrapper.rs | 4 +-- .../cubesql/src/compile/rewrite/converter.rs | 9 ++--- .../cubesql/src/compile/rewrite/mod.rs | 6 ++-- .../rewrite/rules/wrapper/aggregate.rs | 30 ++++++++-------- .../compile/rewrite/rules/wrapper/distinct.rs | 4 +-- .../compile/rewrite/rules/wrapper/filter.rs | 34 +++++++++++-------- .../compile/rewrite/rules/wrapper/limit.rs | 4 +-- .../compile/rewrite/rules/wrapper/order.rs | 4 +-- .../rewrite/rules/wrapper/projection.rs | 32 ++++++++--------- .../compile/rewrite/rules/wrapper/window.rs | 4 +-- .../rewrite/rules/wrapper/wrapper_pull_up.rs | 12 +++---- 12 files changed, 86 insertions(+), 73 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/engine/df/scan.rs b/rust/cubesql/cubesql/src/compile/engine/df/scan.rs index 63c7bc3e7a9d5..9f8c4aabe4e59 100644 --- a/rust/cubesql/cubesql/src/compile/engine/df/scan.rs +++ b/rust/cubesql/cubesql/src/compile/engine/df/scan.rs @@ -162,7 +162,15 @@ pub struct WrappedSelectNode { pub order_expr: Vec, pub alias: Option, pub distinct: bool, - pub ungrouped: bool, + + /// States if this node actually a query to Cube or not. + /// When `false` this node will generate SQL on its own, using its fields and templates. + /// When `true` this node will generate SQL with load query to JS side of Cube. + /// It expects to be flattened: `from` is expected to be ungrouped CubeScan. + /// There's no point in doing this for grouped CubeScan, we can just use load query from that CubeScan and SQL API generation on top. + /// Load query generated for this case can be grouped when this node is an aggregation. + /// Most fields will be rendered as a member expressions in generated load query. + pub push_to_cube: bool, } impl WrappedSelectNode { @@ -183,7 +191,7 @@ impl WrappedSelectNode { order_expr: Vec, alias: Option, distinct: bool, - ungrouped: bool, + push_to_cube: bool, ) -> Self { Self { schema, @@ -202,7 +210,7 @@ impl WrappedSelectNode { order_expr, alias, distinct, - ungrouped, + push_to_cube, } } } @@ -344,7 +352,7 @@ impl UserDefinedLogicalNode for WrappedSelectNode { order_expr, alias, self.distinct, - self.ungrouped, + self.push_to_cube, )) } } diff --git a/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs b/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs index e1e6bfb632e6a..109728f0df430 100644 --- a/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs +++ b/rust/cubesql/cubesql/src/compile/engine/df/wrapper.rs @@ -518,11 +518,11 @@ impl CubeScanWrapperNode { order_expr, alias, distinct, - ungrouped, + push_to_cube, }) = wrapped_select_node { // TODO support joins - let ungrouped_scan_node = if ungrouped { + let ungrouped_scan_node = if push_to_cube { if let LogicalPlan::Extension(Extension { node }) = from.as_ref() { if let Some(cube_scan_node) = node.as_any().downcast_ref::() diff --git a/rust/cubesql/cubesql/src/compile/rewrite/converter.rs b/rust/cubesql/cubesql/src/compile/rewrite/converter.rs index e97dc4e7dbea4..d1944d123c908 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/converter.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/converter.rs @@ -28,8 +28,8 @@ use crate::{ TimeDimensionGranularity, TimeDimensionName, TryCastExprDataType, UnionAlias, WindowFunctionExprFun, WindowFunctionExprWindowFrame, WrappedSelectAlias, WrappedSelectDistinct, WrappedSelectJoinJoinType, WrappedSelectLimit, - WrappedSelectOffset, WrappedSelectSelectType, WrappedSelectType, - WrappedSelectUngrouped, + WrappedSelectOffset, WrappedSelectPushToCube, WrappedSelectSelectType, + WrappedSelectType, }, CubeContext, }, @@ -2146,7 +2146,8 @@ impl LanguageToLogicalPlanConverter { match_expr_list_node!(node_by_id, to_expr, params[12], WrappedSelectOrderExpr); let alias = match_data_node!(node_by_id, params[13], WrappedSelectAlias); let distinct = match_data_node!(node_by_id, params[14], WrappedSelectDistinct); - let ungrouped = match_data_node!(node_by_id, params[15], WrappedSelectUngrouped); + let push_to_cube = + match_data_node!(node_by_id, params[15], WrappedSelectPushToCube); let filter_expr = normalize_cols( replace_qualified_col_with_flat_name_if_missing( @@ -2312,7 +2313,7 @@ impl LanguageToLogicalPlanConverter { order_expr_rebased, alias, distinct, - ungrouped, + push_to_cube, )), }) } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs index eeb0d864d8751..11d6b7f9d548e 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs @@ -283,7 +283,7 @@ crate::plan_to_language! { order_expr: Vec, alias: Option, distinct: bool, - ungrouped: bool, + push_to_cube: bool, ungrouped_scan: bool, }, WrappedSelectJoin { @@ -1386,7 +1386,7 @@ fn wrapped_select( order_expr: impl Display, alias: impl Display, distinct: impl Display, - ungrouped: impl Display, + push_to_cube: impl Display, ungrouped_scan: impl Display, ) -> String { format!( @@ -1406,7 +1406,7 @@ fn wrapped_select( order_expr, alias, distinct, - ungrouped, + push_to_cube, ungrouped_scan ) } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs index dea6d2b1a9564..3a78ecf1b5848 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs @@ -11,7 +11,7 @@ use crate::{ wrapped_select_projection_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, AggregateFunctionExprDistinct, AggregateFunctionExprFun, AliasExprAlias, ColumnExprColumn, - ListType, LogicalPlanLanguage, WrappedSelectUngrouped, WrapperPullupReplacerAliasToCube, + ListType, LogicalPlanLanguage, WrappedSelectPushToCube, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, }, transport::V1CubeMetaMeasureExt, @@ -106,7 +106,7 @@ impl WrapperRules { ), "WrappedSelectAlias:None", "WrappedSelectDistinct:false", - "?select_ungrouped", + "?select_push_to_cube", "WrappedSelectUngroupedScan:false", ), "CubeScanWrapperFinalized:false", @@ -115,7 +115,7 @@ impl WrapperRules { "?group_expr", "?aggr_expr", "?ungrouped", - "?select_ungrouped", + "?select_push_to_cube", ), ), transforming_rewrite( @@ -331,7 +331,7 @@ impl WrapperRules { ), "WrappedSelectAlias:None", "WrappedSelectDistinct:false", - "?select_ungrouped", + "?select_push_to_cube", "WrappedSelectUngroupedScan:false", ), "CubeScanWrapperFinalized:false", @@ -341,7 +341,7 @@ impl WrapperRules { "?group_expr", "?aggr_expr", "?ungrouped", - "?select_ungrouped", + "?select_push_to_cube", ), )]); } @@ -351,12 +351,12 @@ impl WrapperRules { group_expr_var: &'static str, aggr_expr_var: &'static str, ungrouped_var: &'static str, - select_ungrouped_var: &'static str, + select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); let ungrouped_var = var!(ungrouped_var); - let select_ungrouped_var = var!(select_ungrouped_var); + let select_push_to_cube_var = var!(select_push_to_cube_var); move |egraph, subst| { Self::transform_aggregate_impl( egraph, @@ -364,7 +364,7 @@ impl WrapperRules { group_expr_var, aggr_expr_var, ungrouped_var, - select_ungrouped_var, + select_push_to_cube_var, ) } } @@ -375,13 +375,13 @@ impl WrapperRules { group_expr_var: &'static str, aggr_expr_var: &'static str, ungrouped_var: &'static str, - select_ungrouped_var: &'static str, + select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); let ungrouped_var = var!(ungrouped_var); - let select_ungrouped_var = var!(select_ungrouped_var); + let select_push_to_cube_var = var!(select_push_to_cube_var); let meta = self.meta_context.clone(); move |egraph, subst| { if Self::transform_check_subquery_allowed( @@ -396,7 +396,7 @@ impl WrapperRules { group_expr_var, aggr_expr_var, ungrouped_var, - select_ungrouped_var, + select_push_to_cube_var, ) } else { false @@ -410,7 +410,7 @@ impl WrapperRules { group_expr_var: Var, aggr_expr_var: Var, ungrouped_var: Var, - select_ungrouped_var: Var, + select_push_to_cube_var: Var, ) -> bool { if egraph[subst[group_expr_var]].data.referenced_expr.is_none() { return false; @@ -422,9 +422,9 @@ impl WrapperRules { var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() { subst.insert( - select_ungrouped_var, - egraph.add(LogicalPlanLanguage::WrappedSelectUngrouped( - WrappedSelectUngrouped(ungrouped), + select_push_to_cube_var, + egraph.add(LogicalPlanLanguage::WrappedSelectPushToCube( + WrappedSelectPushToCube(ungrouped), )), ); return true; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs index 2dc8707697014..16f3d1f16c734 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs @@ -25,7 +25,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "?select_distinct", - "WrappedSelectUngrouped:false", + "WrappedSelectPushToCube:false", "?select_ungrouped_scan", ), "?alias_to_cube", @@ -53,7 +53,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "WrappedSelectDistinct:true", - "WrappedSelectUngrouped:false", + "WrappedSelectPushToCube:false", "?select_ungrouped_scan", ), "?alias_to_cube", diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs index 2af376fadfdcc..ee887a101563b 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs @@ -9,7 +9,7 @@ use crate::{ wrapped_select_joins_empty_tail, wrapped_select_order_expr_empty_tail, wrapped_select_projection_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, - LogicalPlanLanguage, WrappedSelectUngrouped, WrappedSelectUngroupedScan, + LogicalPlanLanguage, WrappedSelectPushToCube, WrappedSelectUngroupedScan, WrapperPullupReplacerUngrouped, }, var, var_iter, @@ -201,12 +201,16 @@ impl WrapperRules { ), "WrappedSelectAlias:None", "WrappedSelectDistinct:false", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", ), - self.transform_filter("?ungrouped", "?select_ungrouped", "?select_ungrouped_scan"), + self.transform_filter( + "?ungrouped", + "?select_push_to_cube", + "?select_ungrouped_scan", + ), )]); Self::list_pushdown_pullup_rules( @@ -311,7 +315,7 @@ impl WrapperRules { ), "WrappedSelectAlias:None", "WrappedSelectDistinct:false", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", @@ -319,7 +323,7 @@ impl WrapperRules { self.transform_filter_subquery( "?alias_to_cube", "?ungrouped", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), )]); @@ -328,18 +332,18 @@ impl WrapperRules { fn transform_filter( &self, ungrouped_var: &'static str, - select_ungrouped_var: &'static str, + select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let ungrouped_var = var!(ungrouped_var); - let select_ungrouped_var = var!(select_ungrouped_var); + let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); move |egraph, subst| { Self::transform_filter_impl( egraph, subst, ungrouped_var, - select_ungrouped_var, + select_push_to_cube_var, select_ungrouped_scan_var, ) } @@ -349,12 +353,12 @@ impl WrapperRules { &self, alias_to_cube_var: &'static str, ungrouped_var: &'static str, - select_ungrouped_var: &'static str, + select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let ungrouped_var = var!(ungrouped_var); - let select_ungrouped_var = var!(select_ungrouped_var); + let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); let meta = self.meta_context.clone(); move |egraph, subst| { @@ -368,7 +372,7 @@ impl WrapperRules { egraph, subst, ungrouped_var, - select_ungrouped_var, + select_push_to_cube_var, select_ungrouped_scan_var, ) } else { @@ -381,16 +385,16 @@ impl WrapperRules { egraph: &mut CubeEGraph, subst: &mut Subst, ungrouped_var: Var, - select_ungrouped_var: Var, + select_push_to_cube_var: Var, select_ungrouped_scan_var: Var, ) -> bool { for ungrouped in var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() { subst.insert( - select_ungrouped_var, - egraph.add(LogicalPlanLanguage::WrappedSelectUngrouped( - WrappedSelectUngrouped(ungrouped), + select_push_to_cube_var, + egraph.add(LogicalPlanLanguage::WrappedSelectPushToCube( + WrappedSelectPushToCube(ungrouped), )), ); diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs index b4404bc9232ed..aaeba19fe9779 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs @@ -35,7 +35,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "?alias_to_cube", @@ -64,7 +64,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "?alias_to_cube", diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs index 35b58940d28d3..390fe761dc1b6 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs @@ -28,7 +28,7 @@ impl WrapperRules { wrapped_select_order_expr_empty_tail(), "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "?alias_to_cube", @@ -104,7 +104,7 @@ impl WrapperRules { ), "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs index 42aaee98d8498..b3544bd494c43 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs @@ -8,8 +8,8 @@ use crate::{ wrapped_select_having_expr_empty_tail, wrapped_select_joins_empty_tail, wrapped_select_order_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, - ListType, LogicalPlanLanguage, ProjectionAlias, WrappedSelectAlias, WrappedSelectUngrouped, - WrappedSelectUngroupedScan, WrapperPullupReplacerUngrouped, + ListType, LogicalPlanLanguage, ProjectionAlias, WrappedSelectAlias, + WrappedSelectPushToCube, WrappedSelectUngroupedScan, WrapperPullupReplacerUngrouped, }, var, var_iter, }; @@ -99,7 +99,7 @@ impl WrapperRules { ), "?select_alias", "WrappedSelectDistinct:false", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", @@ -109,7 +109,7 @@ impl WrapperRules { "?projection_alias", "?ungrouped", "?select_alias", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), )]); @@ -218,7 +218,7 @@ impl WrapperRules { ), "?select_alias", "WrappedSelectDistinct:false", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", @@ -229,7 +229,7 @@ impl WrapperRules { "?projection_alias", "?ungrouped", "?select_alias", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), )]); @@ -240,14 +240,14 @@ impl WrapperRules { projection_alias_var: &'static str, ungrouped_var: &'static str, select_alias_var: &'static str, - select_ungrouped_var: &'static str, + select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let expr_var = var!(expr_var); let projection_alias_var = var!(projection_alias_var); let ungrouped_var = var!(ungrouped_var); let select_alias_var = var!(select_alias_var); - let select_ungrouped_var = var!(select_ungrouped_var); + let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); move |egraph, subst| { Self::transform_projection_impl( @@ -257,7 +257,7 @@ impl WrapperRules { projection_alias_var, ungrouped_var, select_alias_var, - select_ungrouped_var, + select_push_to_cube_var, select_ungrouped_scan_var, ) } @@ -270,7 +270,7 @@ impl WrapperRules { projection_alias_var: &'static str, ungrouped_var: &'static str, select_alias_var: &'static str, - select_ungrouped_var: &'static str, + select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); @@ -278,7 +278,7 @@ impl WrapperRules { let projection_alias_var = var!(projection_alias_var); let ungrouped_var = var!(ungrouped_var); let select_alias_var = var!(select_alias_var); - let select_ungrouped_var = var!(select_ungrouped_var); + let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); let meta = self.meta_context.clone(); move |egraph, subst| { @@ -295,7 +295,7 @@ impl WrapperRules { projection_alias_var, ungrouped_var, select_alias_var, - select_ungrouped_var, + select_push_to_cube_var, select_ungrouped_scan_var, ) } else { @@ -311,7 +311,7 @@ impl WrapperRules { projection_alias_var: Var, ungrouped_var: Var, select_alias_var: Var, - select_ungrouped_var: Var, + select_push_to_cube_var: Var, select_ungrouped_scan_var: Var, ) -> bool { if let Some(_) = &egraph[subst[expr_var]].data.referenced_expr { @@ -322,9 +322,9 @@ impl WrapperRules { var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() { subst.insert( - select_ungrouped_var, - egraph.add(LogicalPlanLanguage::WrappedSelectUngrouped( - WrappedSelectUngrouped(ungrouped), + select_push_to_cube_var, + egraph.add(LogicalPlanLanguage::WrappedSelectPushToCube( + WrappedSelectPushToCube(ungrouped), )), ); subst.insert( diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs index 9ca83c4807dea..4e9d5c0cd59f7 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs @@ -27,7 +27,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "?alias_to_cube", @@ -104,7 +104,7 @@ impl WrapperRules { ), "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs index 24e28c4f9b9d1..e9c0a64f0c3a4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs @@ -81,7 +81,7 @@ impl WrapperRules { ), "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", @@ -104,7 +104,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "?alias_to_cube", @@ -174,7 +174,7 @@ impl WrapperRules { "?inner_order_expr", "?inner_alias", "?inner_distinct", - "?inner_ungrouped", + "?inner_push_to_cube", "?inner_ungrouped_scan", ), "?alias_to_cube", @@ -202,7 +202,7 @@ impl WrapperRules { ), "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", @@ -232,7 +232,7 @@ impl WrapperRules { "?inner_order_expr", "?inner_alias", "?inner_distinct", - "?inner_ungrouped", + "?inner_push_to_cube", "?inner_ungrouped_scan", ), wrapped_select_joins_empty_tail(), @@ -243,7 +243,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "?select_distinct", - "?select_ungrouped", + "?select_push_to_cube", "?select_ungrouped_scan", ), "?alias_to_cube", From 70d938c6841f819247d4355f353380735e543e58 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Tue, 29 Oct 2024 17:41:21 +0200 Subject: [PATCH 3/9] fix(cubesql): Avoid mixing flags from pushdown and pullup replacers --- .../cubesql/src/compile/rewrite/mod.rs | 21 +++++ .../rewrite/rules/wrapper/aggregate.rs | 36 ++++++-- .../compile/rewrite/rules/wrapper/column.rs | 6 +- .../compile/rewrite/rules/wrapper/filter.rs | 30 +++++-- .../rewrite/rules/wrapper/in_list_expr.rs | 23 ++++- .../rewrite/rules/wrapper/in_subquery_expr.rs | 40 +++++++-- .../compile/rewrite/rules/wrapper/literal.rs | 54 ++++++++++-- .../src/compile/rewrite/rules/wrapper/mod.rs | 88 +++++++++++++++++-- .../compile/rewrite/rules/wrapper/order.rs | 42 +++++++-- .../rewrite/rules/wrapper/projection.rs | 29 +++++- .../rewrite/rules/wrapper/scalar_function.rs | 33 ++++++- .../compile/rewrite/rules/wrapper/subquery.rs | 25 +++++- .../rewrite/rules/wrapper/udf_function.rs | 32 ++++++- .../compile/rewrite/rules/wrapper/window.rs | 42 +++++++-- 14 files changed, 436 insertions(+), 65 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs index 11d6b7f9d548e..d6d2a770ce1b4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs @@ -525,6 +525,27 @@ macro_rules! var { }; } +#[macro_export] +macro_rules! copy_flag { + ($egraph:expr, $subst:expr, $in_var:expr, $in_kind:ident, $out_var:expr, $out_kind:ident) => {{ + let mut found = false; + for in_value in $crate::var_iter!($egraph[$subst[$in_var]], $in_kind) { + // Typechecking for $in_kind, only booleans are supported for now + let in_value: bool = *in_value; + $subst.insert( + $out_var, + $egraph.add($crate::compile::rewrite::LogicalPlanLanguage::$out_kind( + $out_kind(in_value), + )), + ); + found = true; + // This is safe, because we expect only enode with one child, with boolena inside, and expect that they would never unify + break; + } + found + }}; +} + pub struct WithColumnRelation(Option); impl ExprRewriter for WithColumnRelation { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs index 3a78ecf1b5848..b62fb2ba6ebc2 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs @@ -12,8 +12,9 @@ use crate::{ wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, AggregateFunctionExprDistinct, AggregateFunctionExprFun, AliasExprAlias, ColumnExprColumn, ListType, LogicalPlanLanguage, WrappedSelectPushToCube, WrapperPullupReplacerAliasToCube, - WrapperPullupReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, }, + copy_flag, transport::V1CubeMetaMeasureExt, var, var_iter, }; @@ -61,14 +62,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?group_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pushdown_replacer( "?aggr_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -115,6 +116,7 @@ impl WrapperRules { "?group_expr", "?aggr_expr", "?ungrouped", + "?pushdown_ungrouped", "?select_push_to_cube", ), ), @@ -176,7 +178,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?aggr_expr", "?alias_to_cube", - "WrapperPullupReplacerUngrouped:true", + "WrapperPushdownReplacerUngrouped:true", "?in_projection", "?cube_members", ), @@ -279,21 +281,21 @@ impl WrapperRules { wrapper_pushdown_replacer( "?subqueries", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pushdown_replacer( "?group_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pushdown_replacer( "?aggr_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -341,6 +343,7 @@ impl WrapperRules { "?group_expr", "?aggr_expr", "?ungrouped", + "?pushdown_ungrouped", "?select_push_to_cube", ), )]); @@ -351,11 +354,13 @@ impl WrapperRules { group_expr_var: &'static str, aggr_expr_var: &'static str, ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); let select_push_to_cube_var = var!(select_push_to_cube_var); move |egraph, subst| { Self::transform_aggregate_impl( @@ -364,6 +369,7 @@ impl WrapperRules { group_expr_var, aggr_expr_var, ungrouped_var, + pushdown_ungrouped_var, select_push_to_cube_var, ) } @@ -375,12 +381,14 @@ impl WrapperRules { group_expr_var: &'static str, aggr_expr_var: &'static str, ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let meta = self.meta_context.clone(); move |egraph, subst| { @@ -396,6 +404,7 @@ impl WrapperRules { group_expr_var, aggr_expr_var, ungrouped_var, + pushdown_ungrouped_var, select_push_to_cube_var, ) } else { @@ -410,6 +419,7 @@ impl WrapperRules { group_expr_var: Var, aggr_expr_var: Var, ungrouped_var: Var, + pushdown_ungrouped_var: Var, select_push_to_cube_var: Var, ) -> bool { if egraph[subst[group_expr_var]].data.referenced_expr.is_none() { @@ -418,6 +428,18 @@ impl WrapperRules { if egraph[subst[aggr_expr_var]].data.referenced_expr.is_none() { return false; } + + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPullupReplacerUngrouped, + pushdown_ungrouped_var, + WrapperPushdownReplacerUngrouped + ) { + return false; + } + for ungrouped in var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs index 822cf1e9fc510..b234c6f2f202a 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs @@ -19,7 +19,7 @@ impl WrapperRules { wrapper_pushdown_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPullupReplacerUngrouped:false", + "WrapperPushdownReplacerUngrouped:false", "?in_projection", "?cube_members", ), @@ -38,7 +38,7 @@ impl WrapperRules { wrapper_pushdown_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPullupReplacerUngrouped:true", + "WrapperPushdownReplacerUngrouped:true", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -57,7 +57,7 @@ impl WrapperRules { wrapper_pushdown_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPullupReplacerUngrouped:true", + "WrapperPushdownReplacerUngrouped:true", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs index ee887a101563b..309b30a091395 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs @@ -10,9 +10,9 @@ use crate::{ wrapped_select_projection_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, LogicalPlanLanguage, WrappedSelectPushToCube, WrappedSelectUngroupedScan, - WrapperPullupReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, }, - var, var_iter, + copy_flag, var, var_iter, }; use egg::{Subst, Var}; @@ -177,7 +177,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?filter_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "?in_projection", "?cube_members", ), @@ -208,6 +208,7 @@ impl WrapperRules { ), self.transform_filter( "?ungrouped", + "?pushdown_ungrouped", "?select_push_to_cube", "?select_ungrouped_scan", ), @@ -254,7 +255,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?subqueries", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "?in_projection", "?cube_members", ), @@ -291,7 +292,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?filter_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "?in_projection", "?cube_members", ), @@ -323,6 +324,7 @@ impl WrapperRules { self.transform_filter_subquery( "?alias_to_cube", "?ungrouped", + "?pushdown_ungrouped", "?select_push_to_cube", "?select_ungrouped_scan", ), @@ -332,10 +334,12 @@ impl WrapperRules { fn transform_filter( &self, ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); move |egraph, subst| { @@ -343,6 +347,7 @@ impl WrapperRules { egraph, subst, ungrouped_var, + pushdown_ungrouped_var, select_push_to_cube_var, select_ungrouped_scan_var, ) @@ -353,11 +358,13 @@ impl WrapperRules { &self, alias_to_cube_var: &'static str, ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); let meta = self.meta_context.clone(); @@ -372,6 +379,7 @@ impl WrapperRules { egraph, subst, ungrouped_var, + pushdown_ungrouped_var, select_push_to_cube_var, select_ungrouped_scan_var, ) @@ -385,9 +393,21 @@ impl WrapperRules { egraph: &mut CubeEGraph, subst: &mut Subst, ungrouped_var: Var, + pushdown_ungrouped_var: Var, select_push_to_cube_var: Var, select_ungrouped_scan_var: Var, ) -> bool { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPullupReplacerUngrouped, + pushdown_ungrouped_var, + WrapperPushdownReplacerUngrouped + ) { + return false; + } + for ungrouped in var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs index 71a5ee71fcd11..b14c5569f14f1 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs @@ -4,9 +4,10 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + WrapperPushdownReplacerUngrouped, }, - var, var_iter, + copy_flag, var, var_iter, }; use egg::Subst; @@ -33,13 +34,13 @@ impl WrapperRules { wrapper_pullup_replacer( "?list", "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), "?negated", ), - self.transform_in_list_only_consts("?list"), + self.transform_in_list_only_consts("?list", "?ungrouped", "?pullup_ungrouped"), ), rewrite( "wrapper-in-list-push-down", @@ -132,9 +133,23 @@ impl WrapperRules { fn transform_in_list_only_consts( &self, list_var: &'static str, + ungrouped_var: &'static str, + pullup_ungrouped_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let list_var = var!(list_var); + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph: &mut CubeEGraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } return egraph[subst[list_var]].data.constant_in_list.is_some(); } } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs index 5c577c4706d3b..93578f87a4c82 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs @@ -1,12 +1,19 @@ -use crate::compile::rewrite::{ - insubquery_expr, rewrite, rewriter::CubeRewrite, rules::wrapper::WrapperRules, - wrapper_pullup_replacer, wrapper_pushdown_replacer, +use crate::{ + compile::rewrite::{ + insubquery_expr, rewrite, + rewriter::{CubeEGraph, CubeRewrite}, + rules::wrapper::WrapperRules, + transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + }, + copy_flag, var, }; +use egg::Subst; impl WrapperRules { pub fn in_subquery_expr_rules(&self, rules: &mut Vec) { rules.extend(vec![ - rewrite( + transforming_rewrite( "wrapper-in-subquery-push-down", wrapper_pushdown_replacer( insubquery_expr("?expr", "?subquery", "?negated"), @@ -26,12 +33,13 @@ impl WrapperRules { wrapper_pullup_replacer( "?subquery", "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), "?negated", ), + self.transform_in_subquery_pushdown("?ungrouped", "?pullup_ungrouped"), ), rewrite( "wrapper-in-subquery-pull-up", @@ -62,4 +70,26 @@ impl WrapperRules { ), ]); } + + fn transform_in_subquery_pushdown( + &self, + ungrouped_var: &'static str, + pullup_ungrouped_var: &'static str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); + move |egraph: &mut CubeEGraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + true + } + } } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs index 4f2d7531e3ac0..e698ed0893673 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs @@ -2,9 +2,10 @@ use crate::{ compile::rewrite::{ literal_expr, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, LiteralExprValue, LogicalPlanLanguage, - WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + WrapperPushdownReplacerUngrouped, }, - var, var_iter, + copy_flag, var, var_iter, }; use crate::compile::rewrite::{ @@ -29,11 +30,16 @@ impl WrapperRules { wrapper_pullup_replacer( literal_expr("?value"), "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), - self.transform_literal("?alias_to_cube", "?value"), + self.transform_literal( + "?alias_to_cube", + "?value", + "?ungrouped", + "?pullup_ungrouped", + ), ), transforming_rewrite( "wrapper-push-down-interval-literal", @@ -47,11 +53,17 @@ impl WrapperRules { wrapper_pullup_replacer( "?new_value", "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), - self.transform_interval_literal("?alias_to_cube", "?value", "?new_value"), + self.transform_interval_literal( + "?alias_to_cube", + "?value", + "?new_value", + "?ungrouped", + "?pullup_ungrouped", + ), ), ]); } @@ -60,11 +72,26 @@ impl WrapperRules { &self, alias_to_cube_var: &str, value_var: &str, + ungrouped_var: &str, + pullup_ungrouped_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let value_var = var!(value_var); + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); let meta = self.meta_context.clone(); move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + for alias_to_cube in var_iter!( egraph[subst[alias_to_cube_var]], WrapperPullupReplacerAliasToCube @@ -100,12 +127,27 @@ impl WrapperRules { alias_to_cube_var: &str, value_var: &str, new_value_var: &str, + ungrouped_var: &str, + pullup_ungrouped_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let value_var = var!(value_var); let new_value_var = var!(new_value_var); + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); let meta = self.meta_context.clone(); move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + for alias_to_cube in var_iter!( egraph[subst[alias_to_cube_var]], WrapperPullupReplacerAliasToCube diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs index 65966c4b9ae14..c5841da8b9f53 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs @@ -29,17 +29,21 @@ mod wrapper_pull_up; use crate::{ compile::rewrite::{ - fun_expr, rewrite, - rewriter::{CubeRewrite, RewriteRules}, + fun_expr, + rewriter::{CubeEGraph, CubeRewrite, RewriteRules}, rules::{ replacer_flat_pull_up_node, replacer_flat_push_down_node, replacer_pull_up_node, replacer_push_down_node, }, - wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, + transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, }, config::ConfigObj, + copy_flag, transport::MetaContext, + var, }; +use egg::Subst; use std::{fmt::Display, sync::Arc}; pub struct WrapperRules { @@ -135,7 +139,7 @@ impl WrapperRules { }, )); - rules.extend(vec![rewrite( + rules.extend(vec![transforming_rewrite( &format!("{}-tail", rule_name), wrapper_pushdown_replacer( list_node, @@ -147,13 +151,35 @@ impl WrapperRules { wrapper_pullup_replacer( substitute_list_node, "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), + Self::transform_list_tail("?ungrouped", "?pullup_ungrouped"), )]); } + fn transform_list_tail( + ungrouped_var: &str, + pullup_ungrouped_var: &str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); + move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + true + } + } + fn flat_list_pushdown_pullup_rules( rules: &mut Vec, rule_name: &str, @@ -196,7 +222,7 @@ impl WrapperRules { ], )); - rules.extend(vec![rewrite( + rules.extend(vec![transforming_rewrite( &format!("{}-tail", rule_name), wrapper_pushdown_replacer( list_type.empty_list(), @@ -208,13 +234,35 @@ impl WrapperRules { wrapper_pullup_replacer( substitute_list_type.empty_list(), "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), + Self::transform_flat_list_tail("?ungrouped", "?pullup_ungrouped"), )]); } + fn transform_flat_list_tail( + ungrouped_var: &str, + pullup_ungrouped_var: &str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); + move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + true + } + } + fn expr_list_pushdown_pullup_rules( rules: &mut Vec, rule_name: &str, @@ -250,7 +298,7 @@ impl WrapperRules { }, )); - rules.extend(vec![rewrite( + rules.extend(vec![transforming_rewrite( rule_name, wrapper_pushdown_replacer( list_node, @@ -262,10 +310,32 @@ impl WrapperRules { wrapper_pullup_replacer( list_node, "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), + Self::transform_expr_list_tail("?ungrouped", "?pullup_ungrouped"), )]); } + + fn transform_expr_list_tail( + ungrouped_var: &str, + pullup_ungrouped_var: &str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); + move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + true + } + } } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs index 390fe761dc1b6..9b90ceaecfdfc 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs @@ -1,12 +1,19 @@ -use crate::compile::rewrite::{ - cube_scan_wrapper, rewrite, rewriter::CubeRewrite, rules::wrapper::WrapperRules, sort, - wrapped_select, wrapped_select_order_expr_empty_tail, wrapper_pullup_replacer, - wrapper_pushdown_replacer, +use crate::{ + compile::rewrite::{ + cube_scan_wrapper, + rewriter::{CubeEGraph, CubeRewrite}, + rules::wrapper::WrapperRules, + sort, transforming_rewrite, wrapped_select, wrapped_select_order_expr_empty_tail, + wrapper_pullup_replacer, wrapper_pushdown_replacer, WrapperPullupReplacerUngrouped, + WrapperPushdownReplacerUngrouped, + }, + copy_flag, var, }; +use egg::Subst; impl WrapperRules { pub fn order_rules(&self, rules: &mut Vec) { - rules.extend(vec![rewrite( + rules.extend(vec![transforming_rewrite( "wrapper-push-down-order-to-cube-scan", sort( "?order_expr", @@ -98,7 +105,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?order_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "?in_projection", "?cube_members", ), @@ -109,6 +116,7 @@ impl WrapperRules { ), "CubeScanWrapperFinalized:false", ), + self.transform_order("?ungrouped", "?pushdown_ungrouped"), )]); Self::list_pushdown_pullup_rules( @@ -118,4 +126,26 @@ impl WrapperRules { "WrappedSelectOrderExpr", ); } + + fn transform_order( + &self, + ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPullupReplacerUngrouped, + pushdown_ungrouped_var, + WrapperPushdownReplacerUngrouped + ) { + return false; + } + true + } + } } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs index b3544bd494c43..977af58060969 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs @@ -10,8 +10,9 @@ use crate::{ wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, LogicalPlanLanguage, ProjectionAlias, WrappedSelectAlias, WrappedSelectPushToCube, WrappedSelectUngroupedScan, WrapperPullupReplacerUngrouped, + WrapperPushdownReplacerUngrouped, }, - var, var_iter, + copy_flag, var, var_iter, }; use egg::{Subst, Var}; @@ -40,7 +41,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -108,6 +109,7 @@ impl WrapperRules { "?expr", "?projection_alias", "?ungrouped", + "?pushdown_ungrouped", "?select_alias", "?select_push_to_cube", "?select_ungrouped_scan", @@ -159,14 +161,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pushdown_replacer( "?subqueries", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -228,6 +230,7 @@ impl WrapperRules { "?expr", "?projection_alias", "?ungrouped", + "?pushdown_ungrouped", "?select_alias", "?select_push_to_cube", "?select_ungrouped_scan", @@ -239,6 +242,7 @@ impl WrapperRules { expr_var: &'static str, projection_alias_var: &'static str, ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, select_alias_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, @@ -246,6 +250,7 @@ impl WrapperRules { let expr_var = var!(expr_var); let projection_alias_var = var!(projection_alias_var); let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); let select_alias_var = var!(select_alias_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); @@ -256,6 +261,7 @@ impl WrapperRules { expr_var, projection_alias_var, ungrouped_var, + pushdown_ungrouped_var, select_alias_var, select_push_to_cube_var, select_ungrouped_scan_var, @@ -269,6 +275,7 @@ impl WrapperRules { expr_var: &'static str, projection_alias_var: &'static str, ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, select_alias_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, @@ -277,6 +284,7 @@ impl WrapperRules { let expr_var = var!(expr_var); let projection_alias_var = var!(projection_alias_var); let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); let select_alias_var = var!(select_alias_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); @@ -294,6 +302,7 @@ impl WrapperRules { expr_var, projection_alias_var, ungrouped_var, + pushdown_ungrouped_var, select_alias_var, select_push_to_cube_var, select_ungrouped_scan_var, @@ -310,11 +319,23 @@ impl WrapperRules { expr_var: Var, projection_alias_var: Var, ungrouped_var: Var, + pushdown_ungrouped_var: Var, select_alias_var: Var, select_push_to_cube_var: Var, select_ungrouped_scan_var: Var, ) -> bool { if let Some(_) = &egraph[subst[expr_var]].data.referenced_expr { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPullupReplacerUngrouped, + pushdown_ungrouped_var, + WrapperPushdownReplacerUngrouped + ) { + return false; + } + for projection_alias in var_iter!(egraph[subst[projection_alias_var]], ProjectionAlias).cloned() { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs index 731eab66934ed..016f29ec27fde 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs @@ -5,9 +5,10 @@ use crate::{ rules::wrapper::WrapperRules, scalar_fun_expr_args_empty_tail, scalar_fun_expr_args_legacy, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListPattern, ListType, - ScalarFunctionExprFun, WrapperPullupReplacerAliasToCube, + ScalarFunctionExprFun, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + WrapperPushdownReplacerUngrouped, }, - var, var_iter, + copy_flag, var, var_iter, }; use egg::Subst; @@ -55,7 +56,7 @@ impl WrapperRules { ), self.transform_fun_expr("?fun", "?alias_to_cube"), ), - rewrite( + transforming_rewrite( "wrapper-push-down-scalar-function-empty-tail", wrapper_pushdown_replacer( scalar_fun_expr_args_empty_tail(), @@ -67,10 +68,11 @@ impl WrapperRules { wrapper_pullup_replacer( scalar_fun_expr_args_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), + self.transform_scalar_function_empty_tail("?ungrouped", "?pullup_ungrouped"), ), ]); @@ -193,6 +195,29 @@ impl WrapperRules { } } + fn transform_scalar_function_empty_tail( + &self, + ungrouped_var: &'static str, + pullup_ungrouped_var: &'static str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); + move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + + true + } + } + fn transform_fun_expr( &self, fun_var: &'static str, diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs index 48629fdbab7b6..e178df961bd19 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs @@ -5,7 +5,9 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, EmptyRelationDerivedSourceTableName, LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, }, + copy_flag, transport::MetaContext, var, var_iter, var_list_iter, }; @@ -36,11 +38,15 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), - self.transform_check_subquery_wrapped("?cube_scan_input"), + self.transform_check_subquery_wrapped( + "?cube_scan_input", + "?ungrouped", + "?pullup_ungrouped", + ), ), transforming_rewrite( "wrapper-subqueries-wrap-empty-rel", @@ -138,9 +144,24 @@ impl WrapperRules { fn transform_check_subquery_wrapped( &self, cube_scan_input_var: &'static str, + ungrouped_var: &'static str, + pullup_ungrouped_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let cube_scan_input_var = var!(cube_scan_input_var); + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + for _ in var_list_iter!(egraph[subst[cube_scan_input_var]], WrappedSelect).cloned() { return true; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs index 7a8413d43396a..f7c6777c955a4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs @@ -5,9 +5,10 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, udf_expr_var_arg, udf_fun_expr_args, udf_fun_expr_args_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ScalarUDFExprFun, - WrapperPullupReplacerAliasToCube, + WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + WrapperPushdownReplacerUngrouped, }, - var, var_iter, + copy_flag, var, var_iter, }; use egg::Subst; @@ -107,7 +108,7 @@ impl WrapperRules { "?cube_members", ), ), - rewrite( + transforming_rewrite( "wrapper-push-down-udf-empty-tail", wrapper_pushdown_replacer( udf_fun_expr_args_empty_tail(), @@ -119,10 +120,11 @@ impl WrapperRules { wrapper_pullup_replacer( udf_fun_expr_args_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?pullup_ungrouped", "?in_projection", "?cube_members", ), + self.transform_udf_expr_tail("?ungrouped", "?pullup_ungrouped"), ), ]); } @@ -157,4 +159,26 @@ impl WrapperRules { false } } + + fn transform_udf_expr_tail( + &self, + ungrouped_var: &'static str, + pullup_ungrouped_var: &'static str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pullup_ungrouped_var = var!(pullup_ungrouped_var); + move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPushdownReplacerUngrouped, + pullup_ungrouped_var, + WrapperPullupReplacerUngrouped + ) { + return false; + } + true + } + } } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs index 4e9d5c0cd59f7..c14fa643132c5 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs @@ -1,12 +1,19 @@ -use crate::compile::rewrite::{ - cube_scan_wrapper, rewrite, rewriter::CubeRewrite, rules::wrapper::WrapperRules, window, - wrapped_select, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, - wrapper_pushdown_replacer, ListType, +use crate::{ + compile::rewrite::{ + cube_scan_wrapper, + rewriter::{CubeEGraph, CubeRewrite}, + rules::wrapper::WrapperRules, + transforming_rewrite, window, wrapped_select, wrapped_select_window_expr_empty_tail, + wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + }, + copy_flag, var, }; +use egg::Subst; impl WrapperRules { pub fn window_rules(&self, rules: &mut Vec) { - rules.extend(vec![rewrite( + rules.extend(vec![transforming_rewrite( "wrapper-push-down-window-to-cube-scan", window( cube_scan_wrapper( @@ -73,7 +80,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?window_expr", "?alias_to_cube", - "?ungrouped", + "?pushdown_ungrouped", "?in_projection", "?cube_members", ), @@ -109,6 +116,7 @@ impl WrapperRules { ), "CubeScanWrapperFinalized:false", ), + self.transform_window_pushdown("?ungrouped", "?pushdown_ungrouped"), )]); if self.config_obj.push_down_pull_up_split() { @@ -127,4 +135,26 @@ impl WrapperRules { ); } } + + fn transform_window_pushdown( + &self, + ungrouped_var: &'static str, + pushdown_ungrouped_var: &'static str, + ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { + let ungrouped_var = var!(ungrouped_var); + let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + move |egraph, subst| { + if !copy_flag!( + egraph, + subst, + ungrouped_var, + WrapperPullupReplacerUngrouped, + pushdown_ungrouped_var, + WrapperPushdownReplacerUngrouped + ) { + return false; + } + true + } + } } From e678da86540d10fc1031943a2d3a65d991694c20 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Fri, 25 Oct 2024 13:53:49 +0300 Subject: [PATCH 4/9] refactor(cubesql): Rename ungrouped field of WrapperPushdownReplacer to push_to_cube --- .../cubesql/src/compile/rewrite/mod.rs | 13 ++++-- .../rewrite/rules/wrapper/aggregate.rs | 40 ++++++++--------- .../rules/wrapper/aggregate_function.rs | 4 +- .../compile/rewrite/rules/wrapper/alias.rs | 4 +- .../rewrite/rules/wrapper/binary_expr.rs | 6 +-- .../src/compile/rewrite/rules/wrapper/case.rs | 8 ++-- .../src/compile/rewrite/rules/wrapper/cast.rs | 4 +- .../compile/rewrite/rules/wrapper/column.rs | 6 +-- .../compile/rewrite/rules/wrapper/filter.rs | 30 ++++++------- .../rewrite/rules/wrapper/in_list_expr.rs | 22 +++++----- .../rewrite/rules/wrapper/in_subquery_expr.rs | 16 +++---- .../rewrite/rules/wrapper/is_null_expr.rs | 8 ++-- .../rewrite/rules/wrapper/like_expr.rs | 6 +-- .../compile/rewrite/rules/wrapper/literal.rs | 26 +++++------ .../src/compile/rewrite/rules/wrapper/mod.rs | 44 +++++++++---------- .../rewrite/rules/wrapper/negative_expr.rs | 4 +- .../compile/rewrite/rules/wrapper/not_expr.rs | 4 +- .../compile/rewrite/rules/wrapper/order.rs | 14 +++--- .../rewrite/rules/wrapper/projection.rs | 30 ++++++------- .../rewrite/rules/wrapper/scalar_function.rs | 28 ++++++------ .../rewrite/rules/wrapper/sort_expr.rs | 4 +- .../compile/rewrite/rules/wrapper/subquery.rs | 14 +++--- .../rewrite/rules/wrapper/udf_function.rs | 24 +++++----- .../compile/rewrite/rules/wrapper/window.rs | 14 +++--- .../rewrite/rules/wrapper/window_function.rs | 8 ++-- 25 files changed, 194 insertions(+), 187 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs index d6d2a770ce1b4..2918708d29262 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs @@ -457,7 +457,14 @@ crate::plan_to_language! { WrapperPushdownReplacer { member: Arc, alias_to_cube: Vec<(String, String)>, - ungrouped: bool, + // This means that result of this replacer would be used as member expression in load query to Cube. + // This flag should be passed from top, by the rule that starts wrapping new logical plan node. + // Important caveat: it means that result would be used for push to cube *and only there*. + // So it's more like "must push to Cube" than "can push to Cube" + // This part is important for rewrites like SUM(sumMeasure) => sumMeasure + // We can use sumMeasure instead of SUM(sumMeasure) ONLY in with push to Cube + // An vice versa, we can't use SUM(sumMeasure) in grouped query to Cube, so it can be allowed ONLY without push to grouped Cube query + push_to_cube: bool, in_projection: bool, cube_members: Vec, }, @@ -1929,13 +1936,13 @@ fn case_expr_replacer(members: impl Display, alias_to_cube: impl Display) -> Str fn wrapper_pushdown_replacer( members: impl Display, alias_to_cube: impl Display, - ungrouped: impl Display, + push_to_cube: impl Display, in_projection: impl Display, cube_members: impl Display, ) -> String { format!( "(WrapperPushdownReplacer {} {} {} {} {})", - members, alias_to_cube, ungrouped, in_projection, cube_members + members, alias_to_cube, push_to_cube, in_projection, cube_members ) } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs index b62fb2ba6ebc2..e5c7f1b170b6e 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs @@ -12,7 +12,7 @@ use crate::{ wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, AggregateFunctionExprDistinct, AggregateFunctionExprFun, AliasExprAlias, ColumnExprColumn, ListType, LogicalPlanLanguage, WrappedSelectPushToCube, WrapperPullupReplacerAliasToCube, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, }, copy_flag, transport::V1CubeMetaMeasureExt, @@ -62,14 +62,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?group_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pushdown_replacer( "?aggr_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -116,7 +116,7 @@ impl WrapperRules { "?group_expr", "?aggr_expr", "?ungrouped", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?select_push_to_cube", ), ), @@ -125,7 +125,7 @@ impl WrapperRules { wrapper_pushdown_replacer( grouping_set_expr("?rollout_members", "?type"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -133,7 +133,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?rollout_members", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -178,7 +178,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?aggr_expr", "?alias_to_cube", - "WrapperPushdownReplacerUngrouped:true", + "WrapperPushdownReplacerPushToCube:true", "?in_projection", "?cube_members", ), @@ -281,21 +281,21 @@ impl WrapperRules { wrapper_pushdown_replacer( "?subqueries", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pushdown_replacer( "?group_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pushdown_replacer( "?aggr_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -343,7 +343,7 @@ impl WrapperRules { "?group_expr", "?aggr_expr", "?ungrouped", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?select_push_to_cube", ), )]); @@ -354,13 +354,13 @@ impl WrapperRules { group_expr_var: &'static str, aggr_expr_var: &'static str, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); move |egraph, subst| { Self::transform_aggregate_impl( @@ -369,7 +369,7 @@ impl WrapperRules { group_expr_var, aggr_expr_var, ungrouped_var, - pushdown_ungrouped_var, + pushdown_push_to_cube_var, select_push_to_cube_var, ) } @@ -381,14 +381,14 @@ impl WrapperRules { group_expr_var: &'static str, aggr_expr_var: &'static str, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let meta = self.meta_context.clone(); move |egraph, subst| { @@ -404,7 +404,7 @@ impl WrapperRules { group_expr_var, aggr_expr_var, ungrouped_var, - pushdown_ungrouped_var, + pushdown_push_to_cube_var, select_push_to_cube_var, ) } else { @@ -419,7 +419,7 @@ impl WrapperRules { group_expr_var: Var, aggr_expr_var: Var, ungrouped_var: Var, - pushdown_ungrouped_var: Var, + pushdown_push_to_cube_var: Var, select_push_to_cube_var: Var, ) -> bool { if egraph[subst[group_expr_var]].data.referenced_expr.is_none() { @@ -434,8 +434,8 @@ impl WrapperRules { subst, ungrouped_var, WrapperPullupReplacerUngrouped, - pushdown_ungrouped_var, - WrapperPushdownReplacerUngrouped + pushdown_push_to_cube_var, + WrapperPushdownReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs index 35c4deeef968d..17ceb4333b3e2 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs @@ -19,7 +19,7 @@ impl WrapperRules { wrapper_pushdown_replacer( agg_fun_expr("?fun", vec!["?expr"], "?distinct"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -28,7 +28,7 @@ impl WrapperRules { vec![wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )], diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs index 61914129452af..9fc28b734838e 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs @@ -11,7 +11,7 @@ impl WrapperRules { wrapper_pushdown_replacer( alias_expr("?expr", "?alias"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -19,7 +19,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs index f1c007ea6af3f..448ef284e5bc7 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs @@ -18,7 +18,7 @@ impl WrapperRules { wrapper_pushdown_replacer( binary_expr("?left", "?op", "?right"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -26,7 +26,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?left", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -34,7 +34,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?right", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs index fe2b9e19f4e06..11d0814003dc9 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs @@ -18,7 +18,7 @@ impl WrapperRules { wrapper_pushdown_replacer( case_expr_var_arg("?when", "?then", "?else"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -26,21 +26,21 @@ impl WrapperRules { wrapper_pushdown_replacer( "?when", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?then", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?else", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs index 8aabbe4e4f944..b6a0b73ae3662 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs @@ -11,7 +11,7 @@ impl WrapperRules { wrapper_pushdown_replacer( cast_expr("?expr", "?data_type"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -19,7 +19,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs index b234c6f2f202a..f7e8739125118 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs @@ -19,7 +19,7 @@ impl WrapperRules { wrapper_pushdown_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPushdownReplacerUngrouped:false", + "WrapperPushdownReplacerPushToCube:false", "?in_projection", "?cube_members", ), @@ -38,7 +38,7 @@ impl WrapperRules { wrapper_pushdown_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPushdownReplacerUngrouped:true", + "WrapperPushdownReplacerPushToCube:true", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -57,7 +57,7 @@ impl WrapperRules { wrapper_pushdown_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPushdownReplacerUngrouped:true", + "WrapperPushdownReplacerPushToCube:true", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs index 309b30a091395..241158485a89b 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs @@ -10,7 +10,7 @@ use crate::{ wrapped_select_projection_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, LogicalPlanLanguage, WrappedSelectPushToCube, WrappedSelectUngroupedScan, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, }; @@ -177,7 +177,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?filter_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?in_projection", "?cube_members", ), @@ -208,7 +208,7 @@ impl WrapperRules { ), self.transform_filter( "?ungrouped", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?select_push_to_cube", "?select_ungrouped_scan", ), @@ -255,7 +255,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?subqueries", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?in_projection", "?cube_members", ), @@ -292,7 +292,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?filter_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?in_projection", "?cube_members", ), @@ -324,7 +324,7 @@ impl WrapperRules { self.transform_filter_subquery( "?alias_to_cube", "?ungrouped", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?select_push_to_cube", "?select_ungrouped_scan", ), @@ -334,12 +334,12 @@ impl WrapperRules { fn transform_filter( &self, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); move |egraph, subst| { @@ -347,7 +347,7 @@ impl WrapperRules { egraph, subst, ungrouped_var, - pushdown_ungrouped_var, + pushdown_push_to_cube_var, select_push_to_cube_var, select_ungrouped_scan_var, ) @@ -358,13 +358,13 @@ impl WrapperRules { &self, alias_to_cube_var: &'static str, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); let meta = self.meta_context.clone(); @@ -379,7 +379,7 @@ impl WrapperRules { egraph, subst, ungrouped_var, - pushdown_ungrouped_var, + pushdown_push_to_cube_var, select_push_to_cube_var, select_ungrouped_scan_var, ) @@ -393,7 +393,7 @@ impl WrapperRules { egraph: &mut CubeEGraph, subst: &mut Subst, ungrouped_var: Var, - pushdown_ungrouped_var: Var, + pushdown_push_to_cube_var: Var, select_push_to_cube_var: Var, select_ungrouped_scan_var: Var, ) -> bool { @@ -402,8 +402,8 @@ impl WrapperRules { subst, ungrouped_var, WrapperPullupReplacerUngrouped, - pushdown_ungrouped_var, - WrapperPushdownReplacerUngrouped + pushdown_push_to_cube_var, + WrapperPushdownReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs index b14c5569f14f1..4b2838e3420bf 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, - WrapperPushdownReplacerUngrouped, + WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, }; @@ -19,7 +19,7 @@ impl WrapperRules { wrapper_pushdown_replacer( inlist_expr("?expr", "?list", "?negated"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -27,7 +27,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -40,14 +40,14 @@ impl WrapperRules { ), "?negated", ), - self.transform_in_list_only_consts("?list", "?ungrouped", "?pullup_ungrouped"), + self.transform_in_list_only_consts("?list", "?push_to_cube", "?pullup_ungrouped"), ), rewrite( "wrapper-in-list-push-down", wrapper_pushdown_replacer( inlist_expr("?expr", "?list", "?negated"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -55,14 +55,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?list", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -133,18 +133,18 @@ impl WrapperRules { fn transform_in_list_only_consts( &self, list_var: &'static str, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pullup_ungrouped_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let list_var = var!(list_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph: &mut CubeEGraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs index 93578f87a4c82..1ed401a662339 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, }, copy_flag, var, }; @@ -18,7 +18,7 @@ impl WrapperRules { wrapper_pushdown_replacer( insubquery_expr("?expr", "?subquery", "?negated"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -26,7 +26,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -39,7 +39,7 @@ impl WrapperRules { ), "?negated", ), - self.transform_in_subquery_pushdown("?ungrouped", "?pullup_ungrouped"), + self.transform_in_subquery_pushdown("?push_to_cube", "?pullup_ungrouped"), ), rewrite( "wrapper-in-subquery-pull-up", @@ -73,17 +73,17 @@ impl WrapperRules { fn transform_in_subquery_pushdown( &self, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pullup_ungrouped_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph: &mut CubeEGraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs index 14dfc04ef0dc9..0c68798f9c3b5 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs @@ -18,14 +18,14 @@ impl WrapperRules { wrapper_pushdown_replacer( is_null_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), is_null_expr(wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), @@ -53,14 +53,14 @@ impl WrapperRules { wrapper_pushdown_replacer( is_not_null_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), is_not_null_expr(wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs index 544accf3f0db8..21e09ec21e4f8 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs @@ -24,7 +24,7 @@ impl WrapperRules { "?escape_char", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -34,14 +34,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?pattern", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs index e698ed0893673..17473c3837cb0 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs @@ -3,7 +3,7 @@ use crate::{ literal_expr, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, LiteralExprValue, LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, - WrapperPushdownReplacerUngrouped, + WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, }; @@ -23,7 +23,7 @@ impl WrapperRules { wrapper_pushdown_replacer( literal_expr("?value"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -37,7 +37,7 @@ impl WrapperRules { self.transform_literal( "?alias_to_cube", "?value", - "?ungrouped", + "?push_to_cube", "?pullup_ungrouped", ), ), @@ -46,7 +46,7 @@ impl WrapperRules { wrapper_pushdown_replacer( literal_expr("?value"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -61,7 +61,7 @@ impl WrapperRules { "?alias_to_cube", "?value", "?new_value", - "?ungrouped", + "?push_to_cube", "?pullup_ungrouped", ), ), @@ -72,20 +72,20 @@ impl WrapperRules { &self, alias_to_cube_var: &str, value_var: &str, - ungrouped_var: &str, + push_to_cube_var: &str, pullup_ungrouped_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let value_var = var!(value_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); let meta = self.meta_context.clone(); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { @@ -127,21 +127,21 @@ impl WrapperRules { alias_to_cube_var: &str, value_var: &str, new_value_var: &str, - ungrouped_var: &str, + push_to_cube_var: &str, pullup_ungrouped_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let value_var = var!(value_var); let new_value_var = var!(new_value_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); let meta = self.meta_context.clone(); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs index c5841da8b9f53..7affbb9793dc3 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs @@ -36,7 +36,7 @@ use crate::{ replacer_push_down_node, }, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, }, config::ConfigObj, copy_flag, @@ -116,7 +116,7 @@ impl WrapperRules { wrapper_pushdown_replacer( node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ) @@ -144,7 +144,7 @@ impl WrapperRules { wrapper_pushdown_replacer( list_node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -155,22 +155,22 @@ impl WrapperRules { "?in_projection", "?cube_members", ), - Self::transform_list_tail("?ungrouped", "?pullup_ungrouped"), + Self::transform_list_tail("?push_to_cube", "?pullup_ungrouped"), )]); } fn transform_list_tail( - ungrouped_var: &str, + push_to_cube_var: &str, pullup_ungrouped_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { @@ -193,7 +193,7 @@ impl WrapperRules { wrapper_pushdown_replacer( node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ) @@ -227,7 +227,7 @@ impl WrapperRules { wrapper_pushdown_replacer( list_type.empty_list(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -238,22 +238,22 @@ impl WrapperRules { "?in_projection", "?cube_members", ), - Self::transform_flat_list_tail("?ungrouped", "?pullup_ungrouped"), + Self::transform_flat_list_tail("?push_to_cube", "?pullup_ungrouped"), )]); } fn transform_flat_list_tail( - ungrouped_var: &str, + push_to_cube_var: &str, pullup_ungrouped_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { @@ -275,7 +275,7 @@ impl WrapperRules { wrapper_pushdown_replacer( node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ) @@ -303,7 +303,7 @@ impl WrapperRules { wrapper_pushdown_replacer( list_node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -314,22 +314,22 @@ impl WrapperRules { "?in_projection", "?cube_members", ), - Self::transform_expr_list_tail("?ungrouped", "?pullup_ungrouped"), + Self::transform_expr_list_tail("?push_to_cube", "?pullup_ungrouped"), )]); } fn transform_expr_list_tail( - ungrouped_var: &str, + push_to_cube_var: &str, pullup_ungrouped_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs index 5a040964fa3c9..950acfc40798f 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs @@ -18,14 +18,14 @@ impl WrapperRules { wrapper_pushdown_replacer( negative_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), negative_expr(wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs index 2866c89c5448c..185eb9869c4c2 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs @@ -18,14 +18,14 @@ impl WrapperRules { wrapper_pushdown_replacer( not_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), not_expr(wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs index 9b90ceaecfdfc..dff85cae4e289 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, sort, transforming_rewrite, wrapped_select, wrapped_select_order_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, WrapperPullupReplacerUngrouped, - WrapperPushdownReplacerUngrouped, + WrapperPushdownReplacerPushToCube, }, copy_flag, var, }; @@ -105,7 +105,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?order_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?in_projection", "?cube_members", ), @@ -116,7 +116,7 @@ impl WrapperRules { ), "CubeScanWrapperFinalized:false", ), - self.transform_order("?ungrouped", "?pushdown_ungrouped"), + self.transform_order("?ungrouped", "?pushdown_push_to_cube"), )]); Self::list_pushdown_pullup_rules( @@ -130,18 +130,18 @@ impl WrapperRules { fn transform_order( &self, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, ungrouped_var, WrapperPullupReplacerUngrouped, - pushdown_ungrouped_var, - WrapperPushdownReplacerUngrouped + pushdown_push_to_cube_var, + WrapperPushdownReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs index 977af58060969..b25951aba6a93 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs @@ -10,7 +10,7 @@ use crate::{ wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, LogicalPlanLanguage, ProjectionAlias, WrappedSelectAlias, WrappedSelectPushToCube, WrappedSelectUngroupedScan, WrapperPullupReplacerUngrouped, - WrapperPushdownReplacerUngrouped, + WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, }; @@ -41,7 +41,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -109,7 +109,7 @@ impl WrapperRules { "?expr", "?projection_alias", "?ungrouped", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?select_alias", "?select_push_to_cube", "?select_ungrouped_scan", @@ -161,14 +161,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pushdown_replacer( "?subqueries", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -230,7 +230,7 @@ impl WrapperRules { "?expr", "?projection_alias", "?ungrouped", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?select_alias", "?select_push_to_cube", "?select_ungrouped_scan", @@ -242,7 +242,7 @@ impl WrapperRules { expr_var: &'static str, projection_alias_var: &'static str, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, select_alias_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, @@ -250,7 +250,7 @@ impl WrapperRules { let expr_var = var!(expr_var); let projection_alias_var = var!(projection_alias_var); let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_alias_var = var!(select_alias_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); @@ -261,7 +261,7 @@ impl WrapperRules { expr_var, projection_alias_var, ungrouped_var, - pushdown_ungrouped_var, + pushdown_push_to_cube_var, select_alias_var, select_push_to_cube_var, select_ungrouped_scan_var, @@ -275,7 +275,7 @@ impl WrapperRules { expr_var: &'static str, projection_alias_var: &'static str, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, select_alias_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, @@ -284,7 +284,7 @@ impl WrapperRules { let expr_var = var!(expr_var); let projection_alias_var = var!(projection_alias_var); let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_alias_var = var!(select_alias_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); @@ -302,7 +302,7 @@ impl WrapperRules { expr_var, projection_alias_var, ungrouped_var, - pushdown_ungrouped_var, + pushdown_push_to_cube_var, select_alias_var, select_push_to_cube_var, select_ungrouped_scan_var, @@ -319,7 +319,7 @@ impl WrapperRules { expr_var: Var, projection_alias_var: Var, ungrouped_var: Var, - pushdown_ungrouped_var: Var, + pushdown_push_to_cube_var: Var, select_alias_var: Var, select_push_to_cube_var: Var, select_ungrouped_scan_var: Var, @@ -330,8 +330,8 @@ impl WrapperRules { subst, ungrouped_var, WrapperPullupReplacerUngrouped, - pushdown_ungrouped_var, - WrapperPushdownReplacerUngrouped + pushdown_push_to_cube_var, + WrapperPushdownReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs index 016f29ec27fde..395903dc8c935 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs @@ -6,7 +6,7 @@ use crate::{ scalar_fun_expr_args_empty_tail, scalar_fun_expr_args_legacy, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListPattern, ListType, ScalarFunctionExprFun, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, - WrapperPushdownReplacerUngrouped, + WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, }; @@ -20,7 +20,7 @@ impl WrapperRules { wrapper_pushdown_replacer( fun_expr_var_arg("?fun", "?args"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -29,7 +29,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?args", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -61,7 +61,7 @@ impl WrapperRules { wrapper_pushdown_replacer( scalar_fun_expr_args_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -72,7 +72,7 @@ impl WrapperRules { "?in_projection", "?cube_members", ), - self.transform_scalar_function_empty_tail("?ungrouped", "?pullup_ungrouped"), + self.transform_scalar_function_empty_tail("?push_to_cube", "?pullup_ungrouped"), ), ]); @@ -85,7 +85,7 @@ impl WrapperRules { pattern: wrapper_pushdown_replacer( "?args", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -98,7 +98,7 @@ impl WrapperRules { elem: wrapper_pushdown_replacer( "?arg", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -144,7 +144,7 @@ impl WrapperRules { wrapper_pushdown_replacer( scalar_fun_expr_args_legacy("?left", "?right"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -152,14 +152,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?left", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?right", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -197,17 +197,17 @@ impl WrapperRules { fn transform_scalar_function_empty_tail( &self, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pullup_ungrouped_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs index 1c4a8d652354e..720542833e98c 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs @@ -11,7 +11,7 @@ impl WrapperRules { wrapper_pushdown_replacer( sort_expr("?expr", "?asc", "?nulls_first"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -19,7 +19,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs index e178df961bd19..ab09fc2d34d88 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, EmptyRelationDerivedSourceTableName, LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, }, copy_flag, transport::MetaContext, @@ -31,7 +31,7 @@ impl WrapperRules { "CubeScanWrapperFinalized:false", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -44,7 +44,7 @@ impl WrapperRules { ), self.transform_check_subquery_wrapped( "?cube_scan_input", - "?ungrouped", + "?push_to_cube", "?pullup_ungrouped", ), ), @@ -144,18 +144,18 @@ impl WrapperRules { fn transform_check_subquery_wrapped( &self, cube_scan_input_var: &'static str, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pullup_ungrouped_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let cube_scan_input_var = var!(cube_scan_input_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs index f7c6777c955a4..617602384840f 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs @@ -6,7 +6,7 @@ use crate::{ transforming_rewrite, udf_expr_var_arg, udf_fun_expr_args, udf_fun_expr_args_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ScalarUDFExprFun, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, - WrapperPushdownReplacerUngrouped, + WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, }; @@ -20,7 +20,7 @@ impl WrapperRules { wrapper_pushdown_replacer( udf_expr_var_arg("?fun", "?args"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -29,7 +29,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?args", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -61,7 +61,7 @@ impl WrapperRules { wrapper_pushdown_replacer( udf_fun_expr_args("?left", "?right"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -69,14 +69,14 @@ impl WrapperRules { wrapper_pushdown_replacer( "?left", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?right", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -113,7 +113,7 @@ impl WrapperRules { wrapper_pushdown_replacer( udf_fun_expr_args_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -124,7 +124,7 @@ impl WrapperRules { "?in_projection", "?cube_members", ), - self.transform_udf_expr_tail("?ungrouped", "?pullup_ungrouped"), + self.transform_udf_expr_tail("?push_to_cube", "?pullup_ungrouped"), ), ]); } @@ -162,17 +162,17 @@ impl WrapperRules { fn transform_udf_expr_tail( &self, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pullup_ungrouped_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pullup_ungrouped_var = var!(pullup_ungrouped_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPushdownReplacerUngrouped, + push_to_cube_var, + WrapperPushdownReplacerPushToCube, pullup_ungrouped_var, WrapperPullupReplacerUngrouped ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs index c14fa643132c5..a0c572b53aa99 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, window, wrapped_select, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerUngrouped, + WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, }, copy_flag, var, }; @@ -80,7 +80,7 @@ impl WrapperRules { wrapper_pushdown_replacer( "?window_expr", "?alias_to_cube", - "?pushdown_ungrouped", + "?pushdown_push_to_cube", "?in_projection", "?cube_members", ), @@ -116,7 +116,7 @@ impl WrapperRules { ), "CubeScanWrapperFinalized:false", ), - self.transform_window_pushdown("?ungrouped", "?pushdown_ungrouped"), + self.transform_window_pushdown("?ungrouped", "?pushdown_push_to_cube"), )]); if self.config_obj.push_down_pull_up_split() { @@ -139,18 +139,18 @@ impl WrapperRules { fn transform_window_pushdown( &self, ungrouped_var: &'static str, - pushdown_ungrouped_var: &'static str, + pushdown_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let ungrouped_var = var!(ungrouped_var); - let pushdown_ungrouped_var = var!(pushdown_ungrouped_var); + let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, ungrouped_var, WrapperPullupReplacerUngrouped, - pushdown_ungrouped_var, - WrapperPushdownReplacerUngrouped + pushdown_push_to_cube_var, + WrapperPushdownReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs index 31c6b61373a67..1e03cbdb0d2e4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs @@ -25,7 +25,7 @@ impl WrapperRules { "?window_frame", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -34,21 +34,21 @@ impl WrapperRules { wrapper_pushdown_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?partition_by", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pushdown_replacer( "?order_by", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), From 48265af9a5ce2d3034ef87e0d37d659d0a0fc5cb Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Tue, 29 Oct 2024 21:45:12 +0200 Subject: [PATCH 5/9] refactor(cubesql): Rename ungrouped field of WrapperPullupReplacer to push_to_cube --- .../cubesql/src/compile/rewrite/mod.rs | 14 +++- .../rewrite/rules/wrapper/aggregate.rs | 65 ++++++++--------- .../rules/wrapper/aggregate_function.rs | 4 +- .../compile/rewrite/rules/wrapper/alias.rs | 4 +- .../rewrite/rules/wrapper/binary_expr.rs | 6 +- .../src/compile/rewrite/rules/wrapper/case.rs | 8 +-- .../src/compile/rewrite/rules/wrapper/cast.rs | 4 +- .../compile/rewrite/rules/wrapper/column.rs | 6 +- .../rules/wrapper/cube_scan_wrapper.rs | 18 ++--- .../compile/rewrite/rules/wrapper/distinct.rs | 4 +- .../compile/rewrite/rules/wrapper/extract.rs | 6 +- .../compile/rewrite/rules/wrapper/filter.rs | 69 ++++++++++--------- .../rewrite/rules/wrapper/in_list_expr.rs | 24 ++++--- .../rewrite/rules/wrapper/in_subquery_expr.rs | 20 +++--- .../rewrite/rules/wrapper/is_null_expr.rs | 8 +-- .../rewrite/rules/wrapper/like_expr.rs | 6 +- .../compile/rewrite/rules/wrapper/limit.rs | 4 +- .../compile/rewrite/rules/wrapper/literal.rs | 26 +++---- .../src/compile/rewrite/rules/wrapper/mod.rs | 46 ++++++------- .../rewrite/rules/wrapper/negative_expr.rs | 4 +- .../compile/rewrite/rules/wrapper/not_expr.rs | 4 +- .../compile/rewrite/rules/wrapper/order.rs | 28 ++++---- .../rewrite/rules/wrapper/projection.rs | 65 ++++++++--------- .../rewrite/rules/wrapper/scalar_function.rs | 30 ++++---- .../rewrite/rules/wrapper/sort_expr.rs | 4 +- .../compile/rewrite/rules/wrapper/subquery.rs | 18 ++--- .../rewrite/rules/wrapper/udf_function.rs | 24 +++---- .../compile/rewrite/rules/wrapper/window.rs | 28 ++++---- .../rewrite/rules/wrapper/window_function.rs | 8 +-- .../rewrite/rules/wrapper/wrapper_pull_up.rs | 40 ++++++----- 30 files changed, 310 insertions(+), 285 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs index 2918708d29262..7b67cc2042bd6 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/mod.rs @@ -471,7 +471,15 @@ crate::plan_to_language! { WrapperPullupReplacer { member: Arc, alias_to_cube: Vec<(String, String)>, - ungrouped: bool, + // When `member` is expression this means that result of this replacer should be used as member expression in load query to Cube. + // When `member` is logical plan node this means that logical plan inside allows to push to Cube + // This flag should make roundtrip from top to bottom and back. + // Important caveat: it means that result should be used for push to cube *and only there*. + // So it's more like "must push to Cube" than "can push to Cube" + // This part is important for rewrites like SUM(sumMeasure) => sumMeasure + // We can use sumMeasure instead of SUM(sumMeasure) ONLY in with push to Cube + // An vice versa, we can't use SUM(sumMeasure) in grouped query to Cube, so it can be allowed ONLY without push to grouped Cube query + push_to_cube: bool, in_projection: bool, cube_members: Vec, }, @@ -1949,13 +1957,13 @@ fn wrapper_pushdown_replacer( fn wrapper_pullup_replacer( members: impl Display, alias_to_cube: impl Display, - ungrouped: impl Display, + push_to_cube: impl Display, in_projection: impl Display, cube_members: impl Display, ) -> String { format!( "(WrapperPullupReplacer {} {} {} {} {})", - members, alias_to_cube, ungrouped, in_projection, cube_members + members, alias_to_cube, push_to_cube, in_projection, cube_members ) } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs index e5c7f1b170b6e..4ed8a311b8506 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs @@ -12,7 +12,7 @@ use crate::{ wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, AggregateFunctionExprDistinct, AggregateFunctionExprFun, AliasExprAlias, ColumnExprColumn, ListType, LogicalPlanLanguage, WrappedSelectPushToCube, WrapperPullupReplacerAliasToCube, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, + WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, transport::V1CubeMetaMeasureExt, @@ -32,7 +32,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -48,14 +48,14 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_projection_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_subqueries_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -76,14 +76,14 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_window_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -91,7 +91,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_filter_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -101,7 +101,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_order_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -115,7 +115,7 @@ impl WrapperRules { self.transform_aggregate( "?group_expr", "?aggr_expr", - "?ungrouped", + "?push_to_cube", "?pushdown_push_to_cube", "?select_push_to_cube", ), @@ -147,7 +147,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?rollout_members", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -156,7 +156,7 @@ impl WrapperRules { wrapper_pullup_replacer( grouping_set_expr("?rollout_members", "?type"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -186,7 +186,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?measure", "?alias_to_cube", - "WrapperPullupReplacerUngrouped:true", + "WrapperPullupReplacerPushToCube:true", "?in_projection", "?cube_members", ), @@ -255,7 +255,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -274,7 +274,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_projection_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -302,14 +302,14 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_window_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -317,7 +317,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_filter_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -327,7 +327,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_order_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:false", "?cube_members", ), @@ -342,7 +342,7 @@ impl WrapperRules { "?alias_to_cube", "?group_expr", "?aggr_expr", - "?ungrouped", + "?push_to_cube", "?pushdown_push_to_cube", "?select_push_to_cube", ), @@ -353,13 +353,13 @@ impl WrapperRules { &self, group_expr_var: &'static str, aggr_expr_var: &'static str, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); move |egraph, subst| { @@ -368,7 +368,7 @@ impl WrapperRules { subst, group_expr_var, aggr_expr_var, - ungrouped_var, + push_to_cube_var, pushdown_push_to_cube_var, select_push_to_cube_var, ) @@ -380,14 +380,14 @@ impl WrapperRules { alias_to_cube_var: &'static str, group_expr_var: &'static str, aggr_expr_var: &'static str, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let group_expr_var = var!(group_expr_var); let aggr_expr_var = var!(aggr_expr_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let meta = self.meta_context.clone(); @@ -403,7 +403,7 @@ impl WrapperRules { subst, group_expr_var, aggr_expr_var, - ungrouped_var, + push_to_cube_var, pushdown_push_to_cube_var, select_push_to_cube_var, ) @@ -418,7 +418,7 @@ impl WrapperRules { subst: &mut Subst, group_expr_var: Var, aggr_expr_var: Var, - ungrouped_var: Var, + push_to_cube_var: Var, pushdown_push_to_cube_var: Var, select_push_to_cube_var: Var, ) -> bool { @@ -432,21 +432,24 @@ impl WrapperRules { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPullupReplacerUngrouped, + push_to_cube_var, + WrapperPullupReplacerPushToCube, pushdown_push_to_cube_var, WrapperPushdownReplacerPushToCube ) { return false; } - for ungrouped in - var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() + for push_to_cube in var_iter!( + egraph[subst[push_to_cube_var]], + WrapperPullupReplacerPushToCube + ) + .cloned() { subst.insert( select_push_to_cube_var, egraph.add(LogicalPlanLanguage::WrappedSelectPushToCube( - WrappedSelectPushToCube(ungrouped), + WrappedSelectPushToCube(push_to_cube), )), ); return true; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs index 17ceb4333b3e2..827132fb01df5 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate_function.rs @@ -42,7 +42,7 @@ impl WrapperRules { vec![wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )], @@ -51,7 +51,7 @@ impl WrapperRules { wrapper_pullup_replacer( agg_fun_expr("?fun", vec!["?expr"], "?distinct"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs index 9fc28b734838e..521c4f8d7578c 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/alias.rs @@ -32,7 +32,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -41,7 +41,7 @@ impl WrapperRules { wrapper_pullup_replacer( alias_expr("?expr", "?alias"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs index 448ef284e5bc7..226e7608b5490 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/binary_expr.rs @@ -46,7 +46,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?left", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -54,7 +54,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?right", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -62,7 +62,7 @@ impl WrapperRules { wrapper_pullup_replacer( binary_expr("?left", "?op", "?right"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs index 11d0814003dc9..b64ddea965a58 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/case.rs @@ -52,21 +52,21 @@ impl WrapperRules { wrapper_pullup_replacer( "?when", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?then", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?else", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -74,7 +74,7 @@ impl WrapperRules { wrapper_pullup_replacer( case_expr_var_arg("?when", "?then", "?else"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs index b6a0b73ae3662..22f8f3945972d 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cast.rs @@ -32,7 +32,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -41,7 +41,7 @@ impl WrapperRules { wrapper_pullup_replacer( cast_expr("?expr", "?data_type"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs index f7e8739125118..be57c4b7f743c 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/column.rs @@ -26,7 +26,7 @@ impl WrapperRules { wrapper_pullup_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPullupReplacerUngrouped:false", + "WrapperPullupReplacerPushToCube:false", "?in_projection", "?cube_members", ), @@ -45,7 +45,7 @@ impl WrapperRules { wrapper_pullup_replacer( column_expr("?name"), "?alias_to_cube", - "WrapperPullupReplacerUngrouped:true", + "WrapperPullupReplacerPushToCube:true", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -64,7 +64,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?dimension", "?alias_to_cube", - "WrapperPullupReplacerUngrouped:true", + "WrapperPullupReplacerPushToCube:true", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cube_scan_wrapper.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cube_scan_wrapper.rs index b439f71f191fe..29ae2e2328df2 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cube_scan_wrapper.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/cube_scan_wrapper.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, CubeScanAliasToCube, CubeScanUngrouped, - LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerPushToCube, }, var, var_iter, }; @@ -42,7 +42,7 @@ impl WrapperRules { "?ungrouped", ), "?alias_to_cube_out", - "?ungrouped_out", + "?push_to_cube_out", "WrapperPullupReplacerInProjection:false", "?members", ), @@ -53,7 +53,7 @@ impl WrapperRules { "?alias_to_cube", "?ungrouped", "?alias_to_cube_out", - "?ungrouped_out", + "?push_to_cube_out", ), ), rewrite( @@ -62,7 +62,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -79,13 +79,13 @@ impl WrapperRules { alias_to_cube_var: &'static str, ungrouped_cube_var: &'static str, alias_to_cube_var_out: &'static str, - ungrouped_cube_var_out: &'static str, + push_to_cube_out_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let members_var = var!(members_var); let alias_to_cube_var = var!(alias_to_cube_var); let ungrouped_cube_var = var!(ungrouped_cube_var); let alias_to_cube_var_out = var!(alias_to_cube_var_out); - let ungrouped_cube_var_out = var!(ungrouped_cube_var_out); + let push_to_cube_out_var = var!(push_to_cube_out_var); move |egraph, subst| { if let Some(_) = egraph[subst[members_var]].data.member_name_to_expr { for alias_to_cube in @@ -95,9 +95,9 @@ impl WrapperRules { var_iter!(egraph[subst[ungrouped_cube_var]], CubeScanUngrouped).cloned() { subst.insert( - ungrouped_cube_var_out, - egraph.add(LogicalPlanLanguage::WrapperPullupReplacerUngrouped( - WrapperPullupReplacerUngrouped(ungrouped), + push_to_cube_out_var, + egraph.add(LogicalPlanLanguage::WrapperPullupReplacerPushToCube( + WrapperPullupReplacerPushToCube(ungrouped), )), ); subst.insert( diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs index 16f3d1f16c734..ab959f80444a3 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/distinct.rs @@ -29,7 +29,7 @@ impl WrapperRules { "?select_ungrouped_scan", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -57,7 +57,7 @@ impl WrapperRules { "?select_ungrouped_scan", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs index 1ae5903a0fc5d..230aaaa8c17a6 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/extract.rs @@ -19,14 +19,14 @@ impl WrapperRules { wrapper_pullup_replacer( literal_expr("?date_part"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?date", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -38,7 +38,7 @@ impl WrapperRules { vec![literal_expr("?date_part"), "?date".to_string()], ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs index 241158485a89b..2f75b8b59cf6f 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/filter.rs @@ -10,7 +10,7 @@ use crate::{ wrapped_select_projection_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, LogicalPlanLanguage, WrappedSelectPushToCube, WrappedSelectUngroupedScan, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, + WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, }; @@ -120,7 +120,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -133,42 +133,42 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_projection_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_subqueries_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_group_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_aggr_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_window_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -184,7 +184,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_filter_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -195,7 +195,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_order_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -207,7 +207,7 @@ impl WrapperRules { "CubeScanWrapperFinalized:false", ), self.transform_filter( - "?ungrouped", + "?push_to_cube", "?pushdown_push_to_cube", "?select_push_to_cube", "?select_ungrouped_scan", @@ -232,7 +232,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -248,7 +248,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_projection_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -262,28 +262,28 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_group_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_aggr_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_window_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -299,7 +299,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_filter_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -310,7 +310,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_order_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -323,7 +323,7 @@ impl WrapperRules { ), self.transform_filter_subquery( "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?pushdown_push_to_cube", "?select_push_to_cube", "?select_ungrouped_scan", @@ -333,12 +333,12 @@ impl WrapperRules { fn transform_filter( &self, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); @@ -346,7 +346,7 @@ impl WrapperRules { Self::transform_filter_impl( egraph, subst, - ungrouped_var, + push_to_cube_var, pushdown_push_to_cube_var, select_push_to_cube_var, select_ungrouped_scan_var, @@ -357,13 +357,13 @@ impl WrapperRules { fn transform_filter_subquery( &self, alias_to_cube_var: &'static str, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, select_push_to_cube_var: &'static str, select_ungrouped_scan_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_push_to_cube_var = var!(select_push_to_cube_var); let select_ungrouped_scan_var = var!(select_ungrouped_scan_var); @@ -378,7 +378,7 @@ impl WrapperRules { Self::transform_filter_impl( egraph, subst, - ungrouped_var, + push_to_cube_var, pushdown_push_to_cube_var, select_push_to_cube_var, select_ungrouped_scan_var, @@ -392,7 +392,7 @@ impl WrapperRules { fn transform_filter_impl( egraph: &mut CubeEGraph, subst: &mut Subst, - ungrouped_var: Var, + push_to_cube_var: Var, pushdown_push_to_cube_var: Var, select_push_to_cube_var: Var, select_ungrouped_scan_var: Var, @@ -400,28 +400,31 @@ impl WrapperRules { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPullupReplacerUngrouped, + push_to_cube_var, + WrapperPullupReplacerPushToCube, pushdown_push_to_cube_var, WrapperPushdownReplacerPushToCube ) { return false; } - for ungrouped in - var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() + for push_to_cube in var_iter!( + egraph[subst[push_to_cube_var]], + WrapperPullupReplacerPushToCube + ) + .cloned() { subst.insert( select_push_to_cube_var, egraph.add(LogicalPlanLanguage::WrappedSelectPushToCube( - WrappedSelectPushToCube(ungrouped), + WrappedSelectPushToCube(push_to_cube), )), ); subst.insert( select_ungrouped_scan_var, egraph.add(LogicalPlanLanguage::WrappedSelectUngroupedScan( - WrappedSelectUngroupedScan(ungrouped), + WrappedSelectUngroupedScan(push_to_cube), )), ); return true; diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs index 4b2838e3420bf..d2d37c4899bb3 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_list_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + WrapperPullupReplacerAliasToCube, WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, @@ -34,13 +34,17 @@ impl WrapperRules { wrapper_pullup_replacer( "?list", "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), "?negated", ), - self.transform_in_list_only_consts("?list", "?push_to_cube", "?pullup_ungrouped"), + self.transform_in_list_only_consts( + "?list", + "?push_to_cube", + "?pullup_push_to_cube", + ), ), rewrite( "wrapper-in-list-push-down", @@ -75,14 +79,14 @@ impl WrapperRules { wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?list", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -91,7 +95,7 @@ impl WrapperRules { wrapper_pullup_replacer( inlist_expr("?expr", "?list", "?negated"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -134,19 +138,19 @@ impl WrapperRules { &self, list_var: &'static str, push_to_cube_var: &'static str, - pullup_ungrouped_var: &'static str, + pullup_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let list_var = var!(list_var); let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph: &mut CubeEGraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs index 1ed401a662339..d6699eac3dbd4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/in_subquery_expr.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, + WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, }; @@ -33,13 +33,13 @@ impl WrapperRules { wrapper_pullup_replacer( "?subquery", "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), "?negated", ), - self.transform_in_subquery_pushdown("?push_to_cube", "?pullup_ungrouped"), + self.transform_in_subquery_pushdown("?push_to_cube", "?pullup_push_to_cube"), ), rewrite( "wrapper-in-subquery-pull-up", @@ -47,14 +47,14 @@ impl WrapperRules { wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?subquery", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -63,7 +63,7 @@ impl WrapperRules { wrapper_pullup_replacer( insubquery_expr("?expr", "?subquery", "?negated"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -74,18 +74,18 @@ impl WrapperRules { fn transform_in_subquery_pushdown( &self, push_to_cube_var: &'static str, - pullup_ungrouped_var: &'static str, + pullup_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph: &mut CubeEGraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs index 0c68798f9c3b5..8239eb0aa34e8 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/is_null_expr.rs @@ -35,14 +35,14 @@ impl WrapperRules { is_null_expr(wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), wrapper_pullup_replacer( is_null_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -70,14 +70,14 @@ impl WrapperRules { is_not_null_expr(wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), wrapper_pullup_replacer( is_not_null_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs index 21e09ec21e4f8..98a8f85379a0b 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/like_expr.rs @@ -56,14 +56,14 @@ impl WrapperRules { wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?pattern", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -78,7 +78,7 @@ impl WrapperRules { "?escape_char", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs index aaeba19fe9779..d46cb971541a3 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/limit.rs @@ -39,7 +39,7 @@ impl WrapperRules { "?select_ungrouped_scan", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -68,7 +68,7 @@ impl WrapperRules { "?select_ungrouped_scan", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs index 17473c3837cb0..91cab261e8c98 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/literal.rs @@ -2,7 +2,7 @@ use crate::{ compile::rewrite::{ literal_expr, rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, LiteralExprValue, LogicalPlanLanguage, - WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + WrapperPullupReplacerAliasToCube, WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, @@ -30,7 +30,7 @@ impl WrapperRules { wrapper_pullup_replacer( literal_expr("?value"), "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), @@ -38,7 +38,7 @@ impl WrapperRules { "?alias_to_cube", "?value", "?push_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", ), ), transforming_rewrite( @@ -53,7 +53,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?new_value", "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), @@ -62,7 +62,7 @@ impl WrapperRules { "?value", "?new_value", "?push_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", ), ), ]); @@ -73,12 +73,12 @@ impl WrapperRules { alias_to_cube_var: &str, value_var: &str, push_to_cube_var: &str, - pullup_ungrouped_var: &str, + pullup_push_to_cube_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let value_var = var!(value_var); let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); let meta = self.meta_context.clone(); move |egraph, subst| { if !copy_flag!( @@ -86,8 +86,8 @@ impl WrapperRules { subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } @@ -128,13 +128,13 @@ impl WrapperRules { value_var: &str, new_value_var: &str, push_to_cube_var: &str, - pullup_ungrouped_var: &str, + pullup_push_to_cube_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let alias_to_cube_var = var!(alias_to_cube_var); let value_var = var!(value_var); let new_value_var = var!(new_value_var); let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); let meta = self.meta_context.clone(); move |egraph, subst| { if !copy_flag!( @@ -142,8 +142,8 @@ impl WrapperRules { subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs index 7affbb9793dc3..e908df296e047 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs @@ -36,7 +36,7 @@ use crate::{ replacer_push_down_node, }, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, + WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, config::ConfigObj, copy_flag, @@ -132,7 +132,7 @@ impl WrapperRules { wrapper_pullup_replacer( node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ) @@ -151,28 +151,28 @@ impl WrapperRules { wrapper_pullup_replacer( substitute_list_node, "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), - Self::transform_list_tail("?push_to_cube", "?pullup_ungrouped"), + Self::transform_list_tail("?push_to_cube", "?pullup_push_to_cube"), )]); } fn transform_list_tail( push_to_cube_var: &str, - pullup_ungrouped_var: &str, + pullup_push_to_cube_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } @@ -209,14 +209,14 @@ impl WrapperRules { wrapper_pullup_replacer( node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ) }, &[ "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ], @@ -234,28 +234,28 @@ impl WrapperRules { wrapper_pullup_replacer( substitute_list_type.empty_list(), "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), - Self::transform_flat_list_tail("?push_to_cube", "?pullup_ungrouped"), + Self::transform_flat_list_tail("?push_to_cube", "?pullup_push_to_cube"), )]); } fn transform_flat_list_tail( push_to_cube_var: &str, - pullup_ungrouped_var: &str, + pullup_push_to_cube_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } @@ -291,7 +291,7 @@ impl WrapperRules { wrapper_pullup_replacer( node, "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ) @@ -310,28 +310,28 @@ impl WrapperRules { wrapper_pullup_replacer( list_node, "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), - Self::transform_expr_list_tail("?push_to_cube", "?pullup_ungrouped"), + Self::transform_expr_list_tail("?push_to_cube", "?pullup_push_to_cube"), )]); } fn transform_expr_list_tail( push_to_cube_var: &str, - pullup_ungrouped_var: &str, + pullup_push_to_cube_var: &str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs index 950acfc40798f..52c303ce32aa3 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/negative_expr.rs @@ -35,14 +35,14 @@ impl WrapperRules { negative_expr(wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), wrapper_pullup_replacer( negative_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs index 185eb9869c4c2..82572f59d97e4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/not_expr.rs @@ -35,14 +35,14 @@ impl WrapperRules { not_expr(wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", )), wrapper_pullup_replacer( not_expr("?expr"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs index dff85cae4e289..98f9718d4f8f4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/order.rs @@ -4,7 +4,7 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::wrapper::WrapperRules, sort, transforming_rewrite, wrapped_select, wrapped_select_order_expr_empty_tail, - wrapper_pullup_replacer, wrapper_pushdown_replacer, WrapperPullupReplacerUngrouped, + wrapper_pullup_replacer, wrapper_pushdown_replacer, WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, @@ -39,7 +39,7 @@ impl WrapperRules { "?select_ungrouped_scan", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -52,42 +52,42 @@ impl WrapperRules { wrapper_pullup_replacer( "?projection_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?subqueries", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?group_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?aggr_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?window_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -95,7 +95,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?filter_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -116,7 +116,7 @@ impl WrapperRules { ), "CubeScanWrapperFinalized:false", ), - self.transform_order("?ungrouped", "?pushdown_push_to_cube"), + self.transform_order("?push_to_cube", "?pushdown_push_to_cube"), )]); Self::list_pushdown_pullup_rules( @@ -129,17 +129,17 @@ impl WrapperRules { fn transform_order( &self, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPullupReplacerUngrouped, + push_to_cube_var, + WrapperPullupReplacerPushToCube, pushdown_push_to_cube_var, WrapperPushdownReplacerPushToCube ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs index b25951aba6a93..473c5b04fef16 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/projection.rs @@ -9,7 +9,7 @@ use crate::{ wrapped_select_order_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, LogicalPlanLanguage, ProjectionAlias, WrappedSelectAlias, - WrappedSelectPushToCube, WrappedSelectUngroupedScan, WrapperPullupReplacerUngrouped, + WrappedSelectPushToCube, WrappedSelectUngroupedScan, WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, @@ -26,7 +26,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -48,35 +48,35 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_subqueries_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_group_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_aggr_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_window_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -84,7 +84,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_filter_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -94,7 +94,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_order_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -108,7 +108,7 @@ impl WrapperRules { self.transform_projection( "?expr", "?projection_alias", - "?ungrouped", + "?push_to_cube", "?pushdown_push_to_cube", "?select_alias", "?select_push_to_cube", @@ -143,7 +143,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -175,28 +175,28 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_group_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_aggr_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pullup_replacer( wrapped_select_window_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -204,7 +204,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_filter_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -214,7 +214,7 @@ impl WrapperRules { wrapper_pullup_replacer( wrapped_select_order_expr_empty_tail(), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "WrapperPullupReplacerInProjection:true", "?cube_members", ), @@ -229,7 +229,7 @@ impl WrapperRules { "?alias_to_cube", "?expr", "?projection_alias", - "?ungrouped", + "?push_to_cube", "?pushdown_push_to_cube", "?select_alias", "?select_push_to_cube", @@ -241,7 +241,7 @@ impl WrapperRules { &self, expr_var: &'static str, projection_alias_var: &'static str, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, select_alias_var: &'static str, select_push_to_cube_var: &'static str, @@ -249,7 +249,7 @@ impl WrapperRules { ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let expr_var = var!(expr_var); let projection_alias_var = var!(projection_alias_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_alias_var = var!(select_alias_var); let select_push_to_cube_var = var!(select_push_to_cube_var); @@ -260,7 +260,7 @@ impl WrapperRules { subst, expr_var, projection_alias_var, - ungrouped_var, + push_to_cube_var, pushdown_push_to_cube_var, select_alias_var, select_push_to_cube_var, @@ -274,7 +274,7 @@ impl WrapperRules { alias_to_cube_var: &'static str, expr_var: &'static str, projection_alias_var: &'static str, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, select_alias_var: &'static str, select_push_to_cube_var: &'static str, @@ -283,7 +283,7 @@ impl WrapperRules { let alias_to_cube_var = var!(alias_to_cube_var); let expr_var = var!(expr_var); let projection_alias_var = var!(projection_alias_var); - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); let select_alias_var = var!(select_alias_var); let select_push_to_cube_var = var!(select_push_to_cube_var); @@ -301,7 +301,7 @@ impl WrapperRules { subst, expr_var, projection_alias_var, - ungrouped_var, + push_to_cube_var, pushdown_push_to_cube_var, select_alias_var, select_push_to_cube_var, @@ -318,7 +318,7 @@ impl WrapperRules { subst: &mut Subst, expr_var: Var, projection_alias_var: Var, - ungrouped_var: Var, + push_to_cube_var: Var, pushdown_push_to_cube_var: Var, select_alias_var: Var, select_push_to_cube_var: Var, @@ -328,8 +328,8 @@ impl WrapperRules { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPullupReplacerUngrouped, + push_to_cube_var, + WrapperPullupReplacerPushToCube, pushdown_push_to_cube_var, WrapperPushdownReplacerPushToCube ) { @@ -339,19 +339,22 @@ impl WrapperRules { for projection_alias in var_iter!(egraph[subst[projection_alias_var]], ProjectionAlias).cloned() { - for ungrouped in - var_iter!(egraph[subst[ungrouped_var]], WrapperPullupReplacerUngrouped).cloned() + for push_to_cube in var_iter!( + egraph[subst[push_to_cube_var]], + WrapperPullupReplacerPushToCube + ) + .cloned() { subst.insert( select_push_to_cube_var, egraph.add(LogicalPlanLanguage::WrappedSelectPushToCube( - WrappedSelectPushToCube(ungrouped), + WrappedSelectPushToCube(push_to_cube), )), ); subst.insert( select_ungrouped_scan_var, egraph.add(LogicalPlanLanguage::WrappedSelectUngroupedScan( - WrappedSelectUngroupedScan(ungrouped), + WrappedSelectUngroupedScan(push_to_cube), )), ); subst.insert( diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs index 395903dc8c935..a888fa8ab9e70 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/scalar_function.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, scalar_fun_expr_args_empty_tail, scalar_fun_expr_args_legacy, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListPattern, ListType, - ScalarFunctionExprFun, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + ScalarFunctionExprFun, WrapperPullupReplacerAliasToCube, WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, @@ -42,7 +42,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?args", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -50,7 +50,7 @@ impl WrapperRules { wrapper_pullup_replacer( fun_expr_var_arg("?fun", "?args"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -68,11 +68,11 @@ impl WrapperRules { wrapper_pullup_replacer( scalar_fun_expr_args_empty_tail(), "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), - self.transform_scalar_function_empty_tail("?push_to_cube", "?pullup_ungrouped"), + self.transform_scalar_function_empty_tail("?push_to_cube", "?pullup_push_to_cube"), ), ]); @@ -113,7 +113,7 @@ impl WrapperRules { elem: wrapper_pullup_replacer( "?arg", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -122,7 +122,7 @@ impl WrapperRules { pattern: wrapper_pullup_replacer( "?new_args", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -131,7 +131,7 @@ impl WrapperRules { }, &[ "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ], @@ -171,14 +171,14 @@ impl WrapperRules { wrapper_pullup_replacer( "?left", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?right", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -186,7 +186,7 @@ impl WrapperRules { wrapper_pullup_replacer( scalar_fun_expr_args_legacy("?left", "?right"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -198,18 +198,18 @@ impl WrapperRules { fn transform_scalar_function_empty_tail( &self, push_to_cube_var: &'static str, - pullup_ungrouped_var: &'static str, + pullup_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs index 720542833e98c..1e5262fdd4133 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/sort_expr.rs @@ -33,7 +33,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -43,7 +43,7 @@ impl WrapperRules { wrapper_pullup_replacer( sort_expr("?expr", "?asc", "?nulls_first"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs index ab09fc2d34d88..686499b1b5093 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/subquery.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, wrapper_pullup_replacer, wrapper_pushdown_replacer, EmptyRelationDerivedSourceTableName, LogicalPlanLanguage, WrapperPullupReplacerAliasToCube, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, + WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, transport::MetaContext, @@ -24,7 +24,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?inner_alias_to_cube", - "?nner_ungrouped", + "?nner_push_to_cube", "?inner_in_projection", "?inner_cube_members", ), @@ -38,14 +38,14 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), self.transform_check_subquery_wrapped( "?cube_scan_input", "?push_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", ), ), transforming_rewrite( @@ -63,7 +63,7 @@ impl WrapperRules { "EmptyRelationIsWrappable:true", ), "?alias_to_cube", - "WrapperPullupReplacerUngrouped:false", + "WrapperPullupReplacerPushToCube:false", "WrapperPullupReplacerInProjection:true", "CubeScanMembers", ), @@ -145,19 +145,19 @@ impl WrapperRules { &self, cube_scan_input_var: &'static str, push_to_cube_var: &'static str, - pullup_ungrouped_var: &'static str, + pullup_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let cube_scan_input_var = var!(cube_scan_input_var); let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs index 617602384840f..5505b1f467281 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/udf_function.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, udf_expr_var_arg, udf_fun_expr_args, udf_fun_expr_args_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ScalarUDFExprFun, - WrapperPullupReplacerAliasToCube, WrapperPullupReplacerUngrouped, + WrapperPullupReplacerAliasToCube, WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, var_iter, @@ -42,7 +42,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?args", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -50,7 +50,7 @@ impl WrapperRules { wrapper_pullup_replacer( udf_expr_var_arg("?fun", "?args"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -88,14 +88,14 @@ impl WrapperRules { wrapper_pullup_replacer( "?left", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?right", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -103,7 +103,7 @@ impl WrapperRules { wrapper_pullup_replacer( udf_fun_expr_args("?left", "?right"), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -120,11 +120,11 @@ impl WrapperRules { wrapper_pullup_replacer( udf_fun_expr_args_empty_tail(), "?alias_to_cube", - "?pullup_ungrouped", + "?pullup_push_to_cube", "?in_projection", "?cube_members", ), - self.transform_udf_expr_tail("?push_to_cube", "?pullup_ungrouped"), + self.transform_udf_expr_tail("?push_to_cube", "?pullup_push_to_cube"), ), ]); } @@ -163,18 +163,18 @@ impl WrapperRules { fn transform_udf_expr_tail( &self, push_to_cube_var: &'static str, - pullup_ungrouped_var: &'static str, + pullup_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { let push_to_cube_var = var!(push_to_cube_var); - let pullup_ungrouped_var = var!(pullup_ungrouped_var); + let pullup_push_to_cube_var = var!(pullup_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, push_to_cube_var, WrapperPushdownReplacerPushToCube, - pullup_ungrouped_var, - WrapperPullupReplacerUngrouped + pullup_push_to_cube_var, + WrapperPullupReplacerPushToCube ) { return false; } diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs index a0c572b53aa99..928a1dd388cc4 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window.rs @@ -5,7 +5,7 @@ use crate::{ rules::wrapper::WrapperRules, transforming_rewrite, window, wrapped_select, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, ListType, - WrapperPullupReplacerUngrouped, WrapperPushdownReplacerPushToCube, + WrapperPullupReplacerPushToCube, WrapperPushdownReplacerPushToCube, }, copy_flag, var, }; @@ -38,7 +38,7 @@ impl WrapperRules { "?select_ungrouped_scan", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -52,28 +52,28 @@ impl WrapperRules { wrapper_pullup_replacer( "?projection_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?subqueries", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?group_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?aggr_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -87,7 +87,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -95,7 +95,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?filter_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -105,7 +105,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?order_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -116,7 +116,7 @@ impl WrapperRules { ), "CubeScanWrapperFinalized:false", ), - self.transform_window_pushdown("?ungrouped", "?pushdown_push_to_cube"), + self.transform_window_pushdown("?push_to_cube", "?pushdown_push_to_cube"), )]); if self.config_obj.push_down_pull_up_split() { @@ -138,17 +138,17 @@ impl WrapperRules { fn transform_window_pushdown( &self, - ungrouped_var: &'static str, + push_to_cube_var: &'static str, pushdown_push_to_cube_var: &'static str, ) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool { - let ungrouped_var = var!(ungrouped_var); + let push_to_cube_var = var!(push_to_cube_var); let pushdown_push_to_cube_var = var!(pushdown_push_to_cube_var); move |egraph, subst| { if !copy_flag!( egraph, subst, - ungrouped_var, - WrapperPullupReplacerUngrouped, + push_to_cube_var, + WrapperPullupReplacerPushToCube, pushdown_push_to_cube_var, WrapperPushdownReplacerPushToCube ) { diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs index 1e03cbdb0d2e4..c2fe257d4130a 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/window_function.rs @@ -62,21 +62,21 @@ impl WrapperRules { wrapper_pullup_replacer( "?expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?partition_by", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?order_by", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -91,7 +91,7 @@ impl WrapperRules { "?window_frame", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs index e9c0a64f0c3a4..b90bc4604ad0b 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs @@ -22,42 +22,42 @@ impl WrapperRules { wrapper_pullup_replacer( "?projection_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?subqueries", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?group_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?aggr_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?window_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?cube_scan_input", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -65,7 +65,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?filter_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -75,7 +75,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?order_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -109,7 +109,9 @@ impl WrapperRules { ), "?alias_to_cube", // 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? - "WrapperPullupReplacerUngrouped:false", + // This is fixed to false for any LHS because we should only allow to push to Cube when from is ungrouped CubeScan + // And after pulling replacer over this node it will be WrappedSelect(from=CubeScan), so it should not allow to push for whatever LP is on top of it + "WrapperPullupReplacerPushToCube:false", "?in_projection", "?cube_members", ), @@ -125,35 +127,35 @@ impl WrapperRules { wrapper_pullup_replacer( "?projection_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?subqueries", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?group_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?aggr_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), wrapper_pullup_replacer( "?window_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -178,7 +180,7 @@ impl WrapperRules { "?inner_ungrouped_scan", ), "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -186,7 +188,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?filter_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -196,7 +198,7 @@ impl WrapperRules { wrapper_pullup_replacer( "?order_expr", "?alias_to_cube", - "?ungrouped", + "?push_to_cube", "?in_projection", "?cube_members", ), @@ -247,7 +249,9 @@ impl WrapperRules { "?select_ungrouped_scan", ), "?alias_to_cube", - "WrapperPullupReplacerUngrouped:false", + // This is fixed to false for any LHS because we should only allow to push to Cube when from is ungrouped CubeSCan + // And after pulling replacer over this node it will be WrappedSelect(from=WrappedSelect), so it should not allow to push for whatever LP is on top of it + "WrapperPullupReplacerPushToCube:false", "?inner_projection_expr", "?cube_members", ), From cfb202785c5101079e7bf97134438756389d1580 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Thu, 31 Oct 2024 18:56:39 +0200 Subject: [PATCH 6/9] test(cubesql): Add member_to_alias to TestConnectionTransport SQL output --- rust/cubesql/cubesql/src/compile/test/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rust/cubesql/cubesql/src/compile/test/mod.rs b/rust/cubesql/cubesql/src/compile/test/mod.rs index 7fb8672fe856f..a27ee21c8a1fe 100644 --- a/rust/cubesql/cubesql/src/compile/test/mod.rs +++ b/rust/cubesql/cubesql/src/compile/test/mod.rs @@ -785,12 +785,13 @@ impl TransportService for TestConnectionTransport { query: TransportLoadRequestQuery, _ctx: AuthContextRef, meta: LoadRequestMeta, - _member_to_alias: Option>, + member_to_alias: Option>, expression_params: Option>>, ) -> Result { let inputs = serde_json::json!({ "query": query, "meta": meta, + "member_to_alias": member_to_alias, }); Ok(SqlResponse { sql: SqlQuery::new( From 95526cbc82724286a1d7310a929179c31706765a Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Thu, 31 Oct 2024 18:59:16 +0200 Subject: [PATCH 7/9] test(cubesql): Format JSON part of TestConnectionTransport SQL output --- rust/cubesql/cubesql/src/compile/mod.rs | 18 ++++++++++-------- rust/cubesql/cubesql/src/compile/test/mod.rs | 5 ++++- .../src/compile/test/test_user_change.rs | 2 +- .../cubesql/src/compile/test/test_wrapper.rs | 4 ++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/mod.rs b/rust/cubesql/cubesql/src/compile/mod.rs index 7b2ac97e5b4f0..38e7b20780c20 100644 --- a/rust/cubesql/cubesql/src/compile/mod.rs +++ b/rust/cubesql/cubesql/src/compile/mod.rs @@ -7278,13 +7278,15 @@ ORDER BY .sql .contains("ungrouped")); - assert!(query_plan - .as_logical_plan() - .find_cube_scan_wrapper() - .wrapped_sql - .unwrap() - .sql - .contains("[\"dim2\",\"asc\"]")); + let re = Regex::new(r#"\[[[:space:]]*"dim2",[[:space:]]*"asc"[[:space:]]*\]"#).unwrap(); + assert!(re.is_match( + &query_plan + .as_logical_plan() + .find_cube_scan_wrapper() + .wrapped_sql + .unwrap() + .sql + )); } #[tokio::test] @@ -13732,7 +13734,7 @@ ORDER BY "source"."str0" ASC if Rewriter::top_down_extractor_enabled() { assert!(sql.contains("LIMIT 1000")); } else { - assert!(sql.contains("\"limit\":1000")); + assert!(sql.contains("\"limit\": 1000")); } assert!(sql.contains("% 7")); diff --git a/rust/cubesql/cubesql/src/compile/test/mod.rs b/rust/cubesql/cubesql/src/compile/test/mod.rs index a27ee21c8a1fe..d2737c53bb164 100644 --- a/rust/cubesql/cubesql/src/compile/test/mod.rs +++ b/rust/cubesql/cubesql/src/compile/test/mod.rs @@ -795,7 +795,10 @@ impl TransportService for TestConnectionTransport { }); Ok(SqlResponse { sql: SqlQuery::new( - format!("SELECT * FROM {}", serde_json::to_string(&inputs).unwrap()), + format!( + "SELECT * FROM {}", + serde_json::to_string_pretty(&inputs).unwrap() + ), expression_params.unwrap_or(Vec::new()), ), }) diff --git a/rust/cubesql/cubesql/src/compile/test/test_user_change.rs b/rust/cubesql/cubesql/src/compile/test/test_user_change.rs index 47f0164a5fba3..ae2a8b2e171ef 100644 --- a/rust/cubesql/cubesql/src/compile/test/test_user_change.rs +++ b/rust/cubesql/cubesql/src/compile/test/test_user_change.rs @@ -271,6 +271,6 @@ GROUP BY 1 let sql_query = load_calls[0].sql_query.as_ref().unwrap(); // This should be placed from load meta to query by TestConnectionTransport::sql // It would mean that SQL generation used changed user - assert!(sql_query.sql.contains(r#""changeUser":"gopher""#)); + assert!(sql_query.sql.contains(r#""changeUser": "gopher""#)); assert_eq!(load_calls[0].meta.change_user(), Some("gopher".to_string())); } diff --git a/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs b/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs index a133391646e65..b38237568e5bd 100644 --- a/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs +++ b/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs @@ -426,7 +426,7 @@ async fn test_simple_subquery_wrapper_projection() { .wrapped_sql .unwrap() .sql - .contains("\\\\\\\"limit\\\\\\\":1")); + .contains("\\\\\\\"limit\\\\\\\": 1")); let _physical_plan = query_plan.as_physical_plan().await.unwrap(); } @@ -482,7 +482,7 @@ async fn test_simple_subquery_wrapper_filter_equal() { .wrapped_sql .unwrap() .sql - .contains("\\\\\\\"limit\\\\\\\":1")); + .contains("\\\\\\\"limit\\\\\\\": 1")); let _physical_plan = query_plan.as_physical_plan().await.unwrap(); } From 59d12315c70c0bf516d65004cd0faff85780c315 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Wed, 30 Oct 2024 13:57:29 +0200 Subject: [PATCH 8/9] refactor(cubesql): Tighten rule for non-trivial wrapper pullup --- .../src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs index b90bc4604ad0b..be7c228d321b7 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/wrapper_pull_up.rs @@ -204,7 +204,8 @@ impl WrapperRules { ), "?select_alias", "?select_distinct", - "?select_push_to_cube", + // This node has a WrappedSelect in from, so it's not allowed to use push to Cube + "WrappedSelectPushToCube:false", "?select_ungrouped_scan", ), "CubeScanWrapperFinalized:false", @@ -245,7 +246,7 @@ impl WrapperRules { "?order_expr", "?select_alias", "?select_distinct", - "?select_push_to_cube", + "WrappedSelectPushToCube:false", "?select_ungrouped_scan", ), "?alias_to_cube", From 77e4461653ad293cf3da92d7f1eda9918bbd6924 Mon Sep 17 00:00:00 2001 From: Mikhail Cheshkov Date: Wed, 30 Oct 2024 14:05:17 +0200 Subject: [PATCH 9/9] feat(cubesql): Flatten aggregation of WrappedSelect with filters Some queries in tests reduced to a single CubeScan with member expressions, so tests have changed --- rust/cubesql/cubesql/src/compile/mod.rs | 259 +++++++++++------- .../rewrite/rules/wrapper/aggregate.rs | 159 ++++++++++- .../src/compile/rewrite/rules/wrapper/mod.rs | 1 + .../cubesql/src/compile/test/test_wrapper.rs | 79 ++++++ 4 files changed, 404 insertions(+), 94 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/mod.rs b/rust/cubesql/cubesql/src/compile/mod.rs index 38e7b20780c20..e0b4974a99166 100644 --- a/rust/cubesql/cubesql/src/compile/mod.rs +++ b/rust/cubesql/cubesql/src/compile/mod.rs @@ -7242,51 +7242,88 @@ ORDER BY displayable(physical_plan.as_ref()).indent() ); + fn trivial_member_expr(cube: &str, member: &str, alias: &str) -> String { + json!({ + "cube_name": cube, + "alias": alias, + "cube_params": [cube], + "expr": format!("${{{cube}.{member}}}"), + "grouping_set": null, + }) + .to_string() + } + assert_eq!( - query_plan.as_logical_plan().find_cube_scan().request, + query_plan + .as_logical_plan() + .find_cube_scan_wrapper() + .request + .unwrap(), V1LoadRequestQuery { measures: Some(vec![ - "WideCube.measure1".to_string(), - "WideCube.measure2".to_string(), - "WideCube.measure3".to_string(), - "WideCube.measure4".to_string(), + json!({ + "cube_name": "WideCube", + "alias": "max_source_measu", + "cube_params": ["WideCube"], + "expr": "${WideCube.measure1}", + "grouping_set": null, + }) + .to_string(), + json!({ + "cube_name": "WideCube", + "alias": "max_source_measu_1", + "cube_params": ["WideCube"], + "expr": "${WideCube.measure2}", + "grouping_set": null, + }) + .to_string(), + json!({ + "cube_name": "WideCube", + "alias": "sum_source_measu", + "cube_params": ["WideCube"], + "expr": "${WideCube.measure3}", + "grouping_set": null, + }) + .to_string(), + json!({ + "cube_name": "WideCube", + "alias": "max_source_measu_2", + "cube_params": ["WideCube"], + "expr": "${WideCube.measure4}", + "grouping_set": null, + }) + .to_string(), ]), dimensions: Some(vec![ - "WideCube.dim1".to_string(), - "WideCube.dim2".to_string(), - "WideCube.dim3".to_string(), - "WideCube.dim4".to_string(), + trivial_member_expr("WideCube", "dim2", "dim2"), + trivial_member_expr("WideCube", "dim3", "dim3"), + trivial_member_expr("WideCube", "dim4", "dim4"), + json!({ + "cube_name": "WideCube", + "alias": "pivot_grouping", + "cube_params": ["WideCube"], + "expr": "0", + "grouping_set": null, + }) + .to_string() ]), segments: Some(vec![]), - order: Some(vec![]), + order: Some(vec![ + vec!["dim2".to_string(), "asc".to_string(),], + vec!["dim3".to_string(), "asc".to_string(),], + vec!["dim4".to_string(), "asc".to_string(),], + vec!["pivot_grouping".to_string(), "asc".to_string(),], + ]), filters: Some(vec![V1LoadRequestQueryFilterItem { member: Some("WideCube.dim1".to_string()), operator: Some("equals".to_string()), values: Some(vec!["foo".to_string()]), or: None, and: None, - }]), - ungrouped: Some(true), + },]), ..Default::default() } ); - assert!(!query_plan - .as_logical_plan() - .find_cube_scan_wrapper() - .wrapped_sql - .unwrap() - .sql - .contains("ungrouped")); - - let re = Regex::new(r#"\[[[:space:]]*"dim2",[[:space:]]*"asc"[[:space:]]*\]"#).unwrap(); - assert!(re.is_match( - &query_plan - .as_logical_plan() - .find_cube_scan_wrapper() - .wrapped_sql - .unwrap() - .sql - )); } #[tokio::test] @@ -11611,15 +11648,39 @@ ORDER BY "source"."str0" ASC .await .as_logical_plan(); - let sql = logical_plan - .find_cube_scan_wrapper() - .wrapped_sql - .unwrap() - .sql; - - assert!(sql.contains("LOWER(")); - assert!(sql.contains("GROUP BY ")); - assert!(sql.contains("ORDER BY ")); + assert_eq!( + logical_plan + .find_cube_scan_wrapper() + .request + .unwrap(), + V1LoadRequestQuery { + measures: Some(vec![]), + dimensions: Some(vec![ + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "ta_1_order_date_", + "cube_params": ["KibanaSampleDataEcommerce", "Logs"], + "expr": "((${KibanaSampleDataEcommerce.order_date} = DATE('1994-05-01')) OR (${KibanaSampleDataEcommerce.order_date} = DATE('1996-05-03')))", + "grouping_set": null, + }).to_string(), + ]), + segments: Some(vec![ + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "lower_ta_2_conte", + "cube_params": ["KibanaSampleDataEcommerce", "Logs"], + "expr": "(LOWER(${Logs.content}) = $0$)", + "grouping_set": null, + }).to_string(), + ]), + time_dimensions: None, + order: Some(vec![]), + limit: None, + offset: None, + filters: None, + ungrouped: None, + } + ); } #[tokio::test] @@ -11873,20 +11934,46 @@ ORDER BY "source"."str0" ASC ); assert_eq!( - query_plan.as_logical_plan().find_cube_scan().request, + query_plan + .as_logical_plan() + .find_cube_scan_wrapper() + .request + .unwrap(), V1LoadRequestQuery { measures: Some(vec![]), - dimensions: Some(vec![]), - segments: Some(vec![]), + dimensions: Some(vec![ + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "customer_gender", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "${KibanaSampleDataEcommerce.customer_gender}", + "grouping_set": null, + }).to_string(), + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "cast_dateadd_utf", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "CAST(DATE_ADD(${KibanaSampleDataEcommerce.order_date}, INTERVAL '2 DAY') AS DATE)", + "grouping_set": null, + }).to_string(), + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "dateadd_utf8__se", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "DATE_ADD(${KibanaSampleDataEcommerce.order_date}, INTERVAL '2000000 MILLISECOND')", + "grouping_set": null, + }).to_string(), + ]), + segments: Some(vec![ + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "dateadd_utf8__da", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "(DATE_ADD(${KibanaSampleDataEcommerce.order_date}, INTERVAL '2 DAY') < DATE('2014-06-02'))", + "grouping_set": null, + }).to_string(), + ]), order: Some(vec![]), - filters: Some(vec![V1LoadRequestQueryFilterItem { - member: Some("KibanaSampleDataEcommerce.order_date".to_string(),), - operator: Some("beforeDate".to_string(),), - values: Some(vec!["2014-05-31T00:00:00.000Z".to_string()]), - or: None, - and: None, - }]), - ungrouped: Some(true), ..Default::default() } ) @@ -12671,53 +12758,39 @@ ORDER BY "source"."str0" ASC .await .as_logical_plan(); - let end_date = chrono::Utc::now().date_naive() - chrono::Duration::days(1); - let start_date = end_date - chrono::Duration::days(29); + let end_date = chrono::Utc::now().date_naive(); + let start_date = end_date - chrono::Duration::days(30); assert_eq!( - logical_plan.find_cube_scan().request, + logical_plan.find_cube_scan_wrapper().request.unwrap(), V1LoadRequestQuery { - measures: Some(vec![]), - dimensions: Some(vec![]), - segments: Some(vec![]), - time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension { - dimension: "KibanaSampleDataEcommerce.order_date".to_string(), - granularity: None, - date_range: Some(json!(vec![ - format!("{}T00:00:00.000Z", start_date), - format!("{}T23:59:59.999Z", end_date), - ])) - }]), + measures: Some(vec![ + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "avg_kibanasample", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "${KibanaSampleDataEcommerce.avgPrice}", + "grouping_set": null, + }).to_string(), + ]), + dimensions: Some(vec![ + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "cast_kibanasampl", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "CAST(${KibanaSampleDataEcommerce.order_date} AS DATE)", + "grouping_set": null, + }).to_string(), + ]), + segments: Some(vec![ + json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "kibanasampledata", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": format!("(((${{KibanaSampleDataEcommerce.order_date}} >= DATE('{start_date}')) AND (${{KibanaSampleDataEcommerce.order_date}} < DATE('{end_date}'))) AND (((${{KibanaSampleDataEcommerce.notes}} = $0$) OR (${{KibanaSampleDataEcommerce.notes}} = $1$)) OR (${{KibanaSampleDataEcommerce.notes}} = $2$)))"), + "grouping_set": null, + }).to_string(), + ]), order: Some(vec![]), - filters: Some(vec![V1LoadRequestQueryFilterItem { - member: None, - operator: None, - values: None, - or: Some(vec![ - json!(V1LoadRequestQueryFilterItem { - member: Some("KibanaSampleDataEcommerce.notes".to_string()), - operator: Some("equals".to_string()), - values: Some(vec!["note1".to_string()]), - or: None, - and: None, - }), - json!(V1LoadRequestQueryFilterItem { - member: Some("KibanaSampleDataEcommerce.notes".to_string()), - operator: Some("equals".to_string()), - values: Some(vec!["note2".to_string()]), - or: None, - and: None, - }), - json!(V1LoadRequestQueryFilterItem { - member: Some("KibanaSampleDataEcommerce.notes".to_string()), - operator: Some("equals".to_string()), - values: Some(vec!["note3".to_string()]), - or: None, - and: None, - }), - ]), - and: None - }]), - ungrouped: Some(true), ..Default::default() } ) diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs index 4ed8a311b8506..64f02744fb7dd 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/aggregate.rs @@ -6,7 +6,8 @@ use crate::{ rewriter::{CubeEGraph, CubeRewrite}, rules::{members::MemberRules, wrapper::WrapperRules}, subquery, transforming_chain_rewrite, transforming_rewrite, wrapped_select, - wrapped_select_filter_expr_empty_tail, wrapped_select_having_expr_empty_tail, + wrapped_select_aggr_expr_empty_tail, wrapped_select_filter_expr_empty_tail, + wrapped_select_group_expr_empty_tail, wrapped_select_having_expr_empty_tail, wrapped_select_joins_empty_tail, wrapped_select_order_expr_empty_tail, wrapped_select_projection_expr_empty_tail, wrapped_select_subqueries_empty_tail, wrapped_select_window_expr_empty_tail, wrapper_pullup_replacer, wrapper_pushdown_replacer, @@ -349,6 +350,162 @@ impl WrapperRules { )]); } + pub fn aggregate_merge_rules(&self, rules: &mut Vec) { + rules.extend(vec![rewrite( + "wrapper-merge-aggregation-with-inner-wrapped-select", + // Input is not a finished wrapper_pullup_replacer, but WrappedSelect just before pullup + // After pullup replacer would disable push to cube, because any node on top would have WrappedSelect in `from` + // So there would be no CubeScan to push to + // Instead, this rule tries to catch `from` before pulling up, and merge outer Aggregate into inner WrappedSelect + aggregate( + cube_scan_wrapper( + wrapped_select( + "WrappedSelectSelectType:Projection", + wrapper_pullup_replacer( + wrapped_select_projection_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + wrapped_select_subqueries_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + wrapped_select_group_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + wrapped_select_aggr_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + wrapped_select_window_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + "?inner_from", + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapped_select_joins_empty_tail(), + wrapper_pullup_replacer( + "?inner_filters", + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapped_select_having_expr_empty_tail(), + // Inner must not have limit and offset, because they are not commutative with aggregation + "WrappedSelectLimit:None", + "WrappedSelectOffset:None", + wrapper_pullup_replacer( + wrapped_select_order_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + "WrappedSelectAlias:None", + "WrappedSelectDistinct:false", + "WrappedSelectPushToCube:true", + "WrappedSelectUngroupedScan:true", + ), + "CubeScanWrapperFinalized:false", + ), + "?group_expr", + "?aggr_expr", + "AggregateSplit:false", + ), + cube_scan_wrapper( + wrapped_select( + "WrappedSelectSelectType:Aggregate", + wrapper_pullup_replacer( + wrapped_select_projection_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + wrapped_select_subqueries_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pushdown_replacer( + "?group_expr", + "?alias_to_cube", + "WrapperPushdownReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pushdown_replacer( + "?aggr_expr", + "?alias_to_cube", + "WrapperPushdownReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + wrapped_select_window_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapper_pullup_replacer( + "?inner_from", + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapped_select_joins_empty_tail(), + wrapper_pullup_replacer( + "?inner_filters", + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + wrapped_select_having_expr_empty_tail(), + "WrappedSelectLimit:None", + "WrappedSelectOffset:None", + wrapper_pullup_replacer( + wrapped_select_order_expr_empty_tail(), + "?alias_to_cube", + "WrapperPullupReplacerPushToCube:true", + "WrapperPullupReplacerInProjection:false", + "?cube_members", + ), + "WrappedSelectAlias:None", + "WrappedSelectDistinct:false", + "WrappedSelectPushToCube:true", + "WrappedSelectUngroupedScan:false", + ), + "CubeScanWrapperFinalized:false", + ), + )]); + } + fn transform_aggregate( &self, group_expr_var: &'static str, diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs index e908df296e047..5624d3a201134 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/wrapper/mod.rs @@ -59,6 +59,7 @@ impl RewriteRules for WrapperRules { self.wrapper_pull_up_rules(&mut rules); self.aggregate_rules(&mut rules); self.aggregate_rules_subquery(&mut rules); + self.aggregate_merge_rules(&mut rules); self.projection_rules(&mut rules); self.projection_rules_subquery(&mut rules); self.limit_rules(&mut rules); diff --git a/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs b/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs index b38237568e5bd..b899760160c2d 100644 --- a/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs +++ b/rust/cubesql/cubesql/src/compile/test/test_wrapper.rs @@ -1,4 +1,6 @@ use datafusion::physical_plan::displayable; +use pretty_assertions::assert_eq; +use serde_json::json; use std::sync::Arc; use crate::{ @@ -11,6 +13,7 @@ use crate::{ DatabaseProtocol, }, config::ConfigObjImpl, + transport::TransportLoadRequestQuery, }; #[tokio::test] @@ -1001,3 +1004,79 @@ async fn test_wrapper_limit_zero() { let _physical_plan = query_plan.as_physical_plan().await.unwrap(); } + +/// Tests that Aggregation(Filter(CubeScan(ungrouped=true))) with expresions in filter +/// can be executed as a single ungrouped=false load query +#[tokio::test] +async fn test_wrapper_filter_flatten() { + if !Rewriter::sql_push_down_enabled() { + return; + } + init_testing_logger(); + + let query_plan = convert_select_to_query_plan( + // language=PostgreSQL + r#" + SELECT + customer_gender, + SUM(sumPrice) + FROM + KibanaSampleDataEcommerce + WHERE + LOWER(customer_gender) = 'male' + GROUP BY + 1 + "# + .to_string(), + DatabaseProtocol::PostgreSQL, + ) + .await; + + let physical_plan = query_plan.as_physical_plan().await.unwrap(); + println!( + "Physical plan: {}", + displayable(physical_plan.as_ref()).indent() + ); + + assert_eq!( + query_plan + .as_logical_plan() + .find_cube_scan_wrapper() + .request + .unwrap(), + TransportLoadRequestQuery { + measures: Some(vec![json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "sum_kibanasample", + "cube_params": ["KibanaSampleDataEcommerce"], + // This is grouped query, KibanaSampleDataEcommerce.sumPrice is correct in this context + // SUM(sumPrice) will be incrrect here, it would lead to SUM(SUM(sql)) in generated query + "expr": "${KibanaSampleDataEcommerce.sumPrice}", + "grouping_set": null, + }) + .to_string(),]), + dimensions: Some(vec![json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "customer_gender", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "${KibanaSampleDataEcommerce.customer_gender}", + "grouping_set": null, + }) + .to_string(),]), + segments: Some(vec![json!({ + "cube_name": "KibanaSampleDataEcommerce", + "alias": "lower_kibanasamp", + "cube_params": ["KibanaSampleDataEcommerce"], + "expr": "(LOWER(${KibanaSampleDataEcommerce.customer_gender}) = $0$)", + "grouping_set": null, + }) + .to_string(),]), + time_dimensions: None, + order: Some(vec![]), + limit: Some(50000), + offset: None, + filters: None, + ungrouped: None, + } + ); +}