@@ -57,7 +57,7 @@ impl SubqueryDecorrelatorOptimizer {
57
57
// 1. If the subquery is correlated, we will try to decorrelate it into `SemiJoin`
58
58
pub fn try_decorrelate_simple_subquery (
59
59
& self ,
60
- input : & SExpr ,
60
+ outer : & SExpr ,
61
61
subquery : & SubqueryExpr ,
62
62
) -> Result < Option < SExpr > > {
63
63
if subquery. outer_columns . is_empty ( ) {
@@ -80,7 +80,7 @@ impl SubqueryDecorrelatorOptimizer {
80
80
// EvalScalar
81
81
// \
82
82
// Get
83
- let matchers = vec ! [
83
+ let matchers = [
84
84
Matcher :: MatchOp {
85
85
op_type : RelOp :: EvalScalar ,
86
86
children : vec ! [ Matcher :: MatchOp {
@@ -105,32 +105,23 @@ impl SubqueryDecorrelatorOptimizer {
105
105
} ] ,
106
106
} ,
107
107
] ;
108
- let mut matched = false ;
109
- for matcher in matchers {
110
- if matcher. matches ( & subquery. subquery ) {
111
- matched = true ;
112
- break ;
113
- }
114
- }
115
- if !matched {
108
+ if !matchers
109
+ . iter ( )
110
+ . any ( |matcher| matcher. matches ( & subquery. subquery ) )
111
+ {
116
112
return Ok ( None ) ;
117
113
}
118
114
119
115
let filter_tree = subquery
120
116
. subquery // EvalScalar
121
- . child ( 0 ) ?; // Filter
117
+ . unary_child ( ) ; // Filter
118
+ let filter: Filter = filter_tree. plan ( ) . clone ( ) . try_into ( ) ?;
122
119
let filter_expr = RelExpr :: with_s_expr ( filter_tree) ;
123
- let filter: Filter = subquery
124
- . subquery // EvalScalar
125
- . child ( 0 ) ? // Filter
126
- . plan ( )
127
- . clone ( )
128
- . try_into ( ) ?;
120
+
129
121
let filter_prop = filter_expr. derive_relational_prop ( ) ?;
130
122
let filter_child_prop = filter_expr. derive_relational_prop_child ( 0 ) ?;
131
123
132
- let input_expr = RelExpr :: with_s_expr ( input) ;
133
- let input_prop = input_expr. derive_relational_prop ( ) ?;
124
+ let outer_prop = outer. derive_relational_prop ( ) ?;
134
125
135
126
// First, we will check if all the outer columns are in the filter.
136
127
if !filter_child_prop. outer_columns . is_empty ( ) {
@@ -145,7 +136,7 @@ impl SubqueryDecorrelatorOptimizer {
145
136
let mut left_filters = vec ! [ ] ;
146
137
let mut right_filters = vec ! [ ] ;
147
138
for pred in filter. predicates . iter ( ) {
148
- let join_condition = JoinPredicate :: new ( pred, & input_prop , & filter_prop) ;
139
+ let join_condition = JoinPredicate :: new ( pred, & outer_prop , & filter_prop) ;
149
140
match join_condition {
150
141
JoinPredicate :: Left ( filter) | JoinPredicate :: ALL ( filter) => {
151
142
left_filters. push ( filter. clone ( ) ) ;
@@ -197,7 +188,7 @@ impl SubqueryDecorrelatorOptimizer {
197
188
} ;
198
189
199
190
// Rewrite plan to semi-join.
200
- let mut left_child = input . clone ( ) ;
191
+ let mut left_child = outer . clone ( ) ;
201
192
if !left_filters. is_empty ( ) {
202
193
left_child = SExpr :: create_unary (
203
194
Arc :: new (
0 commit comments