@@ -24,6 +24,7 @@ use partiql_value::Value::Null;
24
24
pub struct EvaluatorPlanner ;
25
25
26
26
impl EvaluatorPlanner {
27
+ #[ inline]
27
28
pub fn compile ( & self , plan : & LogicalPlan < BindingsOp > ) -> EvalPlan {
28
29
self . plan_eval ( plan)
29
30
}
@@ -60,28 +61,28 @@ impl EvaluatorPlanner {
60
61
} ) => {
61
62
if let Some ( at_key) = at_key {
62
63
Box :: new ( eval:: EvalScan :: new_with_at_key (
63
- self . plan_values ( expr. clone ( ) ) ,
64
+ self . plan_values ( expr) ,
64
65
as_key,
65
66
at_key,
66
67
) )
67
68
} else {
68
- Box :: new ( eval:: EvalScan :: new ( self . plan_values ( expr. clone ( ) ) , as_key) )
69
+ Box :: new ( eval:: EvalScan :: new ( self . plan_values ( expr) , as_key) )
69
70
}
70
71
}
71
72
BindingsOp :: Project ( logical:: Project { exprs } ) => {
72
73
let exprs: HashMap < _ , _ > = exprs
73
74
. iter ( )
74
- . map ( |( k, v) | ( k. clone ( ) , self . plan_values ( v. clone ( ) ) ) )
75
+ . map ( |( k, v) | ( k. clone ( ) , self . plan_values ( v) ) )
75
76
. collect ( ) ;
76
77
Box :: new ( eval:: EvalSelect :: new ( exprs) )
77
78
}
78
79
BindingsOp :: ProjectAll => Box :: new ( eval:: EvalSelectAll :: new ( ) ) ,
79
80
BindingsOp :: ProjectValue ( logical:: ProjectValue { expr } ) => {
80
- let expr = self . plan_values ( expr. clone ( ) ) ;
81
+ let expr = self . plan_values ( expr) ;
81
82
Box :: new ( eval:: EvalSelectValue :: new ( expr) )
82
83
}
83
84
BindingsOp :: Filter ( logical:: Filter { expr } ) => Box :: new ( eval:: EvalFilter {
84
- expr : self . plan_values ( expr. clone ( ) ) ,
85
+ expr : self . plan_values ( expr) ,
85
86
input : None ,
86
87
} ) ,
87
88
BindingsOp :: Distinct => Box :: new ( eval:: EvalDistinct :: new ( ) ) ,
@@ -91,7 +92,7 @@ impl EvaluatorPlanner {
91
92
as_key,
92
93
at_key,
93
94
} ) => Box :: new ( eval:: EvalUnpivot :: new (
94
- self . plan_values ( expr. clone ( ) ) ,
95
+ self . plan_values ( expr) ,
95
96
as_key,
96
97
at_key. clone ( ) ,
97
98
) ) ,
@@ -111,7 +112,7 @@ impl EvaluatorPlanner {
111
112
} ;
112
113
let on = on
113
114
. as_ref ( )
114
- . map ( |on_condition| self . plan_values ( on_condition. clone ( ) ) ) ;
115
+ . map ( |on_condition| self . plan_values ( on_condition) ) ;
115
116
Box :: new ( eval:: EvalJoin :: new (
116
117
kind,
117
118
self . get_eval_node ( left) ,
@@ -120,7 +121,7 @@ impl EvaluatorPlanner {
120
121
) )
121
122
}
122
123
BindingsOp :: ExprQuery ( logical:: ExprQuery { expr } ) => {
123
- let expr = self . plan_values ( expr. clone ( ) ) ;
124
+ let expr = self . plan_values ( expr) ;
124
125
Box :: new ( eval:: EvalExprQuery :: new ( expr) )
125
126
}
126
127
BindingsOp :: OrderBy => todo ! ( "OrderBy" ) ,
@@ -131,10 +132,10 @@ impl EvaluatorPlanner {
131
132
}
132
133
}
133
134
134
- fn plan_values ( & self , ve : ValueExpr ) -> Box < dyn EvalExpr > {
135
+ fn plan_values ( & self , ve : & ValueExpr ) -> Box < dyn EvalExpr > {
135
136
match ve {
136
137
ValueExpr :: UnExpr ( unary_op, operand) => {
137
- let operand = self . plan_values ( * operand) ;
138
+ let operand = self . plan_values ( operand) ;
138
139
let op = match unary_op {
139
140
UnaryOp :: Pos => EvalUnaryOp :: Pos ,
140
141
UnaryOp :: Neg => EvalUnaryOp :: Neg ,
@@ -143,8 +144,8 @@ impl EvaluatorPlanner {
143
144
Box :: new ( EvalUnaryOpExpr { op, operand } )
144
145
}
145
146
ValueExpr :: BinaryExpr ( binop, lhs, rhs) => {
146
- let lhs = self . plan_values ( * lhs) ;
147
- let rhs = self . plan_values ( * rhs) ;
147
+ let lhs = self . plan_values ( lhs) ;
148
+ let rhs = self . plan_values ( rhs) ;
148
149
let op = match binop {
149
150
BinaryOp :: And => EvalBinOp :: And ,
150
151
BinaryOp :: Or => EvalBinOp :: Or ,
@@ -165,67 +166,67 @@ impl EvaluatorPlanner {
165
166
} ;
166
167
Box :: new ( EvalBinOpExpr { op, lhs, rhs } )
167
168
}
168
- ValueExpr :: Lit ( lit) => Box :: new ( EvalLitExpr { lit } ) ,
169
+ ValueExpr :: Lit ( lit) => Box :: new ( EvalLitExpr { lit : lit . clone ( ) } ) ,
169
170
ValueExpr :: Path ( expr, components) => Box :: new ( EvalPath {
170
- expr : self . plan_values ( * expr) ,
171
+ expr : self . plan_values ( expr) ,
171
172
components : components
172
- . into_iter ( )
173
+ . iter ( )
173
174
. map ( |c| match c {
174
- PathComponent :: Key ( k) => eval:: EvalPathComponent :: Key ( k) ,
175
- PathComponent :: Index ( i) => eval:: EvalPathComponent :: Index ( i) ,
175
+ PathComponent :: Key ( k) => eval:: EvalPathComponent :: Key ( k. clone ( ) ) ,
176
+ PathComponent :: Index ( i) => eval:: EvalPathComponent :: Index ( * i) ,
176
177
PathComponent :: KeyExpr ( k) => {
177
- eval:: EvalPathComponent :: KeyExpr ( self . plan_values ( * k) )
178
+ eval:: EvalPathComponent :: KeyExpr ( self . plan_values ( k) )
178
179
}
179
180
PathComponent :: IndexExpr ( i) => {
180
- eval:: EvalPathComponent :: IndexExpr ( self . plan_values ( * i) )
181
+ eval:: EvalPathComponent :: IndexExpr ( self . plan_values ( i) )
181
182
}
182
183
} )
183
184
. collect ( ) ,
184
185
} ) ,
185
- ValueExpr :: VarRef ( name) => Box :: new ( EvalVarRef { name } ) ,
186
+ ValueExpr :: VarRef ( name) => Box :: new ( EvalVarRef { name : name . clone ( ) } ) ,
186
187
ValueExpr :: TupleExpr ( expr) => {
187
188
let attrs: Vec < Box < dyn EvalExpr > > = expr
188
189
. attrs
189
- . into_iter ( )
190
+ . iter ( )
190
191
. map ( |attr| self . plan_values ( attr) )
191
192
. collect ( ) ;
192
193
let vals: Vec < Box < dyn EvalExpr > > = expr
193
194
. values
194
- . into_iter ( )
195
+ . iter ( )
195
196
. map ( |attr| self . plan_values ( attr) )
196
197
. collect ( ) ;
197
198
Box :: new ( EvalTupleExpr { attrs, vals } )
198
199
}
199
200
ValueExpr :: ListExpr ( expr) => {
200
201
let elements: Vec < Box < dyn EvalExpr > > = expr
201
202
. elements
202
- . into_iter ( )
203
+ . iter ( )
203
204
. map ( |elem| self . plan_values ( elem) )
204
205
. collect ( ) ;
205
206
Box :: new ( EvalListExpr { elements } )
206
207
}
207
208
ValueExpr :: BagExpr ( expr) => {
208
209
let elements: Vec < Box < dyn EvalExpr > > = expr
209
210
. elements
210
- . into_iter ( )
211
+ . iter ( )
211
212
. map ( |elem| self . plan_values ( elem) )
212
213
. collect ( ) ;
213
214
Box :: new ( EvalBagExpr { elements } )
214
215
}
215
216
ValueExpr :: BetweenExpr ( expr) => {
216
- let value = self . plan_values ( * expr. value ) ;
217
- let from = self . plan_values ( * expr. from ) ;
218
- let to = self . plan_values ( * expr. to ) ;
217
+ let value = self . plan_values ( expr. value . as_ref ( ) ) ;
218
+ let from = self . plan_values ( expr. from . as_ref ( ) ) ;
219
+ let to = self . plan_values ( expr. to . as_ref ( ) ) ;
219
220
Box :: new ( EvalBetweenExpr { value, from, to } )
220
221
}
221
222
ValueExpr :: PatternMatchExpr ( PatternMatchExpr { value, pattern } ) => {
222
- let value = self . plan_values ( * value) ;
223
+ let value = self . plan_values ( value) ;
223
224
match pattern {
224
225
Pattern :: LIKE ( logical:: LikeMatch { pattern, escape } ) => {
225
226
// TODO statically assert escape length
226
227
assert ! ( escape. chars( ) . count( ) <= 1 ) ;
227
228
let escape = escape. chars ( ) . next ( ) ;
228
- let regex = like_to_re_pattern ( & pattern, escape) ;
229
+ let regex = like_to_re_pattern ( pattern, escape) ;
229
230
Box :: new ( EvalLikeMatch :: new ( value, & regex) )
230
231
}
231
232
}
@@ -236,56 +237,61 @@ impl EvaluatorPlanner {
236
237
ValueExpr :: SimpleCase ( e) => {
237
238
let cases = e
238
239
. cases
239
- . into_iter ( )
240
+ . iter ( )
240
241
. map ( |case| {
241
242
(
242
- self . plan_values ( ValueExpr :: BinaryExpr (
243
+ self . plan_values ( & ValueExpr :: BinaryExpr (
243
244
BinaryOp :: Eq ,
244
245
e. expr . clone ( ) ,
245
- case. 0 ,
246
+ case. 0 . clone ( ) ,
246
247
) ) ,
247
- self . plan_values ( * case. 1 ) ,
248
+ self . plan_values ( case. 1 . as_ref ( ) ) ,
248
249
)
249
250
} )
250
251
. collect ( ) ;
251
- let default = match e. default {
252
+ let default = match & e. default {
252
253
// If no `ELSE` clause is specified, use implicit `ELSE NULL` (see section 6.9, pg 142 of SQL-92 spec)
253
254
None => Box :: new ( EvalLitExpr {
254
255
lit : Box :: new ( Null ) ,
255
256
} ) ,
256
- Some ( def) => self . plan_values ( * def) ,
257
+ Some ( def) => self . plan_values ( def) ,
257
258
} ;
258
259
// Here, rewrite `SimpleCaseExpr`s as `SearchedCaseExpr`s
259
260
Box :: new ( EvalSearchedCaseExpr { cases, default } )
260
261
}
261
262
ValueExpr :: SearchedCase ( e) => {
262
263
let cases = e
263
264
. cases
264
- . into_iter ( )
265
- . map ( |case| ( self . plan_values ( * case. 0 ) , self . plan_values ( * case. 1 ) ) )
265
+ . iter ( )
266
+ . map ( |case| {
267
+ (
268
+ self . plan_values ( case. 0 . as_ref ( ) ) ,
269
+ self . plan_values ( case. 1 . as_ref ( ) ) ,
270
+ )
271
+ } )
266
272
. collect ( ) ;
267
- let default = match e. default {
273
+ let default = match & e. default {
268
274
// If no `ELSE` clause is specified, use implicit `ELSE NULL` (see section 6.9, pg 142 of SQL-92 spec)
269
275
None => Box :: new ( EvalLitExpr {
270
276
lit : Box :: new ( Null ) ,
271
277
} ) ,
272
- Some ( def) => self . plan_values ( * def) ,
278
+ Some ( def) => self . plan_values ( def. as_ref ( ) ) ,
273
279
} ;
274
280
Box :: new ( EvalSearchedCaseExpr { cases, default } )
275
281
}
276
282
ValueExpr :: IsTypeExpr ( i) => {
277
- let expr = self . plan_values ( * i. expr ) ;
283
+ let expr = self . plan_values ( i. expr . as_ref ( ) ) ;
278
284
match i. not {
279
285
true => Box :: new ( EvalUnaryOpExpr {
280
286
op : EvalUnaryOp :: Not ,
281
287
operand : Box :: new ( EvalIsTypeExpr {
282
288
expr,
283
- is_type : i. is_type ,
289
+ is_type : i. is_type . clone ( ) ,
284
290
} ) ,
285
291
} ) ,
286
292
false => Box :: new ( EvalIsTypeExpr {
287
293
expr,
288
- is_type : i. is_type ,
294
+ is_type : i. is_type . clone ( ) ,
289
295
} ) ,
290
296
}
291
297
}
@@ -297,14 +303,14 @@ impl EvaluatorPlanner {
297
303
cases : vec ! [ (
298
304
Box :: new( ValueExpr :: BinaryExpr (
299
305
BinaryOp :: Eq ,
300
- Box :: new ( * n. lhs. clone( ) ) ,
301
- Box :: new ( * n. rhs. clone( ) ) ,
306
+ n. lhs. clone( ) ,
307
+ n. rhs. clone( ) ,
302
308
) ) ,
303
309
Box :: new( ValueExpr :: Lit ( Box :: new( Null ) ) ) ,
304
310
) ] ,
305
- default : Some ( Box :: new ( * n. lhs ) ) ,
311
+ default : Some ( n. lhs . clone ( ) ) ,
306
312
} ) ;
307
- self . plan_values ( rewritten_as_case)
313
+ self . plan_values ( & rewritten_as_case)
308
314
}
309
315
ValueExpr :: CoalesceExpr ( c) => {
310
316
// COALESCE can be rewritten using CASE WHEN expressions as per section 6.9 pg 142 of SQL-92 spec:
@@ -329,19 +335,19 @@ impl EvaluatorPlanner {
329
335
} ;
330
336
ValueExpr :: SearchedCase ( sc)
331
337
}
332
- self . plan_values ( as_case ( c. elements . first ( ) . unwrap ( ) , & c. elements [ 1 ..] ) )
338
+ self . plan_values ( & as_case ( c. elements . first ( ) . unwrap ( ) , & c. elements [ 1 ..] ) )
333
339
}
334
340
ValueExpr :: DynamicLookup ( lookups) => {
335
341
let lookups = lookups
336
- . into_iter ( )
342
+ . iter ( )
337
343
. map ( |lookup| self . plan_values ( lookup) )
338
344
. collect_vec ( ) ;
339
345
340
346
Box :: new ( EvalDynamicLookup { lookups } )
341
347
}
342
348
ValueExpr :: Call ( logical:: CallExpr { name, arguments } ) => {
343
349
let mut args = arguments
344
- . into_iter ( )
350
+ . iter ( )
345
351
. map ( |arg| self . plan_values ( arg) )
346
352
. collect_vec ( ) ;
347
353
match name {
0 commit comments