@@ -8,52 +8,11 @@ use super::macros::{define_impl_rule, define_rule};
8
8
use crate :: plan_nodes:: {
9
9
ArcDfPlanNode , BinOpPred , BinOpType , ColumnRefPred , ConstantPred , ConstantType , DfNodeType ,
10
10
DfPredType , DfReprPlanNode , DfReprPredNode , JoinType , ListPred , LogOpType ,
11
- LogicalEmptyRelation , LogicalFilter , LogicalJoin , LogicalProjection , PhysicalHashJoin , PredExt ,
11
+ LogicalEmptyRelation , LogicalJoin , LogicalProjection , PhysicalHashJoin , PredExt ,
12
12
} ;
13
13
use crate :: properties:: schema:: Schema ;
14
14
use crate :: OptimizerExt ;
15
15
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
-
57
16
// A join B -> B join A
58
17
define_rule ! (
59
18
JoinCommuteRule ,
@@ -112,7 +71,15 @@ fn apply_eliminate_join(
112
71
if let DfPredType :: Constant ( const_type) = cond. typ {
113
72
if const_type == ConstantType :: Bool {
114
73
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 {
116
83
// No need to handle schema here, as all exprs in the same group
117
84
// will have same logical properties
118
85
let mut left_fields = optimizer. get_schema_of ( left. clone ( ) ) . fields ;
@@ -146,9 +113,9 @@ fn apply_join_assoc(
146
113
let join2 = LogicalJoin :: from_plan_node ( join1. left ( ) . unwrap_plan_node ( ) ) . unwrap ( ) ;
147
114
let a = join2. left ( ) ;
148
115
let b = join2. right ( ) ;
149
- let cond2 = join2. cond ( ) ;
116
+ let cond1 = join2. cond ( ) ;
150
117
let a_schema = optimizer. get_schema_of ( a. clone ( ) ) ;
151
- let cond1 = join1. cond ( ) ;
118
+ let cond2 = join1. cond ( ) ;
152
119
153
120
let Some ( cond2) = cond2. rewrite_column_refs ( & mut |idx| {
154
121
if idx < a_schema. len ( ) {
0 commit comments