@@ -3,9 +3,10 @@ use crate::{
33 engine:: provider:: CubeContext ,
44 rewrite:: {
55 converter:: { is_expr_node, node_to_expr, LogicalPlanToLanguageConverter } ,
6- expr_column_name, AliasExprAlias , AllMembersAlias , AllMembersCube , ChangeUserCube ,
7- ColumnExprColumn , DimensionName , FilterMemberMember , FilterMemberOp , LiteralExprValue ,
8- LiteralMemberRelation , LiteralMemberValue , LogicalPlanLanguage , MeasureName ,
6+ expr_column_name, AggregateFunctionExprFun , AggregateUDFExprFun , AliasExprAlias ,
7+ AllMembersAlias , AllMembersCube , ChangeUserCube , ColumnExprColumn , DimensionName ,
8+ FilterMemberMember , FilterMemberOp , LiteralExprValue , LiteralMemberRelation ,
9+ LiteralMemberValue , LogicalPlanLanguage , MeasureName , ScalarFunctionExprFun ,
910 SegmentName , TableScanSourceTableName , TimeDimensionDateRange ,
1011 TimeDimensionGranularity , TimeDimensionName , VirtualFieldCube , VirtualFieldName ,
1112 } ,
@@ -21,6 +22,7 @@ use datafusion::{
2122 } ,
2223 logical_plan:: { Column , DFSchema , Expr } ,
2324 physical_plan:: {
25+ aggregates:: AggregateFunction ,
2426 functions:: { BuiltinScalarFunction , Volatility } ,
2527 planner:: DefaultPhysicalPlanner ,
2628 ColumnarValue , PhysicalPlanner ,
@@ -34,6 +36,7 @@ use std::{fmt::Debug, ops::Index, sync::Arc};
3436pub struct LogicalPlanData {
3537 pub original_expr : Option < Expr > ,
3638 pub member_name_to_expr : Option < Vec < ( Option < String > , Member , Expr ) > > ,
39+ pub trivial_push_down : Option < usize > ,
3740 pub column : Option < Column > ,
3841 pub expr_to_alias : Option < Vec < ( Expr , String , Option < bool > ) > > ,
3942 pub referenced_expr : Option < Vec < Expr > > ,
@@ -266,6 +269,86 @@ impl LogicalPlanAnalysis {
266269 original_expr
267270 }
268271
272+ fn make_trivial_push_down (
273+ egraph : & EGraph < LogicalPlanLanguage , Self > ,
274+ enode : & LogicalPlanLanguage ,
275+ ) -> Option < usize > {
276+ let trivial_push_down = |id| egraph. index ( id) . data . trivial_push_down . clone ( ) ;
277+ match enode {
278+ LogicalPlanLanguage :: ColumnExpr ( _) => Some ( 0 ) ,
279+ LogicalPlanLanguage :: LiteralExpr ( _) => Some ( 0 ) ,
280+ LogicalPlanLanguage :: AliasExpr ( params) => trivial_push_down ( params[ 0 ] ) ,
281+ LogicalPlanLanguage :: ProjectionExpr ( params)
282+ | LogicalPlanLanguage :: AggregateAggrExpr ( params)
283+ | LogicalPlanLanguage :: AggregateGroupExpr ( params)
284+ | LogicalPlanLanguage :: AggregateFunctionExprArgs ( params)
285+ | LogicalPlanLanguage :: AggregateUDFExprArgs ( params) => {
286+ let mut trivial = 0 ;
287+ for id in params. iter ( ) {
288+ trivial = trivial_push_down ( * id) ?. max ( trivial) ;
289+ }
290+ Some ( trivial)
291+ }
292+ LogicalPlanLanguage :: ScalarFunctionExprFun ( ScalarFunctionExprFun ( fun) ) => {
293+ if fun == & BuiltinScalarFunction :: DateTrunc {
294+ Some ( 0 )
295+ } else {
296+ None
297+ }
298+ }
299+ LogicalPlanLanguage :: ScalarFunctionExpr ( params) => {
300+ let mut trivial = 0 ;
301+ for id in params. iter ( ) {
302+ trivial = trivial_push_down ( * id) ?. max ( trivial) ;
303+ }
304+ Some ( trivial + 1 )
305+ }
306+ LogicalPlanLanguage :: ScalarFunctionExprArgs ( params) => {
307+ let mut trivial = 0 ;
308+ for id in params. iter ( ) {
309+ trivial = trivial_push_down ( * id) ?. max ( trivial) ;
310+ }
311+ Some ( trivial)
312+ }
313+ LogicalPlanLanguage :: AggregateUDFExprFun ( AggregateUDFExprFun ( fun) ) => {
314+ if fun. to_lowercase ( ) == "measure" {
315+ Some ( 0 )
316+ } else {
317+ None
318+ }
319+ }
320+ LogicalPlanLanguage :: AggregateFunctionExprFun ( AggregateFunctionExprFun ( fun) ) => {
321+ if matches ! (
322+ * fun,
323+ AggregateFunction :: Count
324+ | AggregateFunction :: Sum
325+ | AggregateFunction :: Avg
326+ | AggregateFunction :: Min
327+ | AggregateFunction :: Max
328+ ) {
329+ Some ( 0 )
330+ } else {
331+ None
332+ }
333+ }
334+ LogicalPlanLanguage :: AggregateUDFExpr ( params) => {
335+ let mut trivial = 0 ;
336+ for id in params. iter ( ) {
337+ trivial = trivial_push_down ( * id) ?. max ( trivial) ;
338+ }
339+ Some ( trivial + 1 )
340+ }
341+ LogicalPlanLanguage :: AggregateFunctionExpr ( params) => {
342+ let mut trivial = 0 ;
343+ for id in params. iter ( ) {
344+ trivial = trivial_push_down ( * id) ?. max ( trivial) ;
345+ }
346+ Some ( trivial + 1 )
347+ }
348+ _ => None ,
349+ }
350+ }
351+
269352 fn make_member_name_to_expr (
270353 egraph : & EGraph < LogicalPlanLanguage , Self > ,
271354 enode : & LogicalPlanLanguage ,
@@ -1084,6 +1167,7 @@ impl Analysis<LogicalPlanLanguage> for LogicalPlanAnalysis {
10841167 LogicalPlanData {
10851168 original_expr : Self :: make_original_expr ( egraph, enode) ,
10861169 member_name_to_expr : Self :: make_member_name_to_expr ( egraph, enode) ,
1170+ trivial_push_down : Self :: make_trivial_push_down ( egraph, enode) ,
10871171 column : Self :: make_column_name ( egraph, enode) ,
10881172 expr_to_alias : Self :: make_expr_to_alias ( egraph, enode) ,
10891173 referenced_expr : Self :: make_referenced_expr ( egraph, enode) ,
@@ -1099,6 +1183,7 @@ impl Analysis<LogicalPlanLanguage> for LogicalPlanAnalysis {
10991183 let ( original_expr, b) = self . merge_option_field ( a, b, |d| & mut d. original_expr ) ;
11001184 let ( member_name_to_expr, b) =
11011185 self . merge_option_field ( a, b, |d| & mut d. member_name_to_expr ) ;
1186+ let ( trivial_push_down, b) = self . merge_option_field ( a, b, |d| & mut d. trivial_push_down ) ;
11021187 let ( column_name_to_alias, b) = self . merge_option_field ( a, b, |d| & mut d. expr_to_alias ) ;
11031188 let ( referenced_columns, b) = self . merge_option_field ( a, b, |d| & mut d. referenced_expr ) ;
11041189 let ( constant_in_list, b) = self . merge_option_field ( a, b, |d| & mut d. constant_in_list ) ;
@@ -1109,6 +1194,7 @@ impl Analysis<LogicalPlanLanguage> for LogicalPlanAnalysis {
11091194 let ( column_name, _) = self . merge_option_field ( a, b, |d| & mut d. column ) ;
11101195 original_expr
11111196 | member_name_to_expr
1197+ | trivial_push_down
11121198 | column_name_to_alias
11131199 | referenced_columns
11141200 | constant_in_list
0 commit comments