@@ -8,52 +8,11 @@ use super::macros::{define_impl_rule, define_rule};
88use crate :: plan_nodes:: {
99 ArcDfPlanNode , BinOpPred , BinOpType , ColumnRefPred , ConstantPred , ConstantType , DfNodeType ,
1010 DfPredType , DfReprPlanNode , DfReprPredNode , JoinType , ListPred , LogOpType ,
11- LogicalEmptyRelation , LogicalFilter , LogicalJoin , LogicalProjection , PhysicalHashJoin , PredExt ,
11+ LogicalEmptyRelation , LogicalJoin , LogicalProjection , PhysicalHashJoin , PredExt ,
1212} ;
1313use crate :: properties:: schema:: Schema ;
1414use crate :: OptimizerExt ;
1515
16- // A cross join B -> A inner join B
17- define_rule ! (
18- InnerCrossJoinRule ,
19- apply_inner_cross_join,
20- ( Join ( JoinType :: Cross ) , left, right)
21- ) ;
22-
23- fn apply_inner_cross_join (
24- _: & impl Optimizer < DfNodeType > ,
25- binding : ArcDfPlanNode ,
26- ) -> Vec < PlanNodeOrGroup < DfNodeType > > {
27- let join = LogicalJoin :: from_plan_node ( binding) . unwrap ( ) ;
28- let node = LogicalJoin :: new_unchecked ( join. left ( ) , join. right ( ) , join. cond ( ) , JoinType :: Inner ) ;
29- vec ! [ node. into_plan_node( ) . into( ) ]
30- }
31-
32- // Filter (A inner join B on true) cond -> A inner join B on cond
33- define_rule ! (
34- JoinAbsorbFilterRule ,
35- apply_join_absorb_filter,
36- ( Filter , ( Join ( JoinType :: Inner ) , left, right) )
37- ) ;
38-
39- fn apply_join_absorb_filter (
40- _: & impl Optimizer < DfNodeType > ,
41- binding : ArcDfPlanNode ,
42- ) -> Vec < PlanNodeOrGroup < DfNodeType > > {
43- let filter = LogicalFilter :: from_plan_node ( binding) . unwrap ( ) ;
44- let join = LogicalJoin :: from_plan_node ( filter. child ( ) . unwrap_plan_node ( ) ) . unwrap ( ) ;
45- let join_cond = join. cond ( ) ;
46- let filter_cond = filter. cond ( ) ;
47- if let Some ( constant) = ConstantPred :: from_pred_node ( join_cond) {
48- if constant. value ( ) . as_bool ( ) {
49- let node =
50- LogicalJoin :: new_unchecked ( join. left ( ) , join. right ( ) , filter_cond, JoinType :: Inner ) ;
51- return vec ! [ node. into_plan_node( ) . into( ) ] ;
52- }
53- }
54- vec ! [ ]
55- }
56-
5716// A join B -> B join A
5817define_rule ! (
5918 JoinCommuteRule ,
@@ -112,7 +71,15 @@ fn apply_eliminate_join(
11271 if let DfPredType :: Constant ( const_type) = cond. typ {
11372 if const_type == ConstantType :: Bool {
11473 if let Some ( ref data) = cond. data {
115- if !data. as_bool ( ) {
74+ if data. as_bool ( ) {
75+ let node = LogicalJoin :: new_unchecked (
76+ left,
77+ right,
78+ ConstantPred :: bool ( true ) . into_pred_node ( ) ,
79+ JoinType :: Cross ,
80+ ) ;
81+ return vec ! [ node. into_plan_node( ) . into( ) ] ;
82+ } else {
11683 // No need to handle schema here, as all exprs in the same group
11784 // will have same logical properties
11885 let mut left_fields = optimizer. get_schema_of ( left. clone ( ) ) . fields ;
@@ -146,9 +113,9 @@ fn apply_join_assoc(
146113 let join2 = LogicalJoin :: from_plan_node ( join1. left ( ) . unwrap_plan_node ( ) ) . unwrap ( ) ;
147114 let a = join2. left ( ) ;
148115 let b = join2. right ( ) ;
149- let cond2 = join2. cond ( ) ;
116+ let cond1 = join2. cond ( ) ;
150117 let a_schema = optimizer. get_schema_of ( a. clone ( ) ) ;
151- let cond1 = join1. cond ( ) ;
118+ let cond2 = join1. cond ( ) ;
152119
153120 let Some ( cond2) = cond2. rewrite_column_refs ( & mut |idx| {
154121 if idx < a_schema. len ( ) {
0 commit comments