@@ -79,25 +79,25 @@ impl EvalScan {
79
79
impl Evaluable for EvalScan {
80
80
fn evaluate ( & mut self , ctx : & dyn EvalContext ) -> Option < Value > {
81
81
let mut value = partiql_bag ! [ ] ;
82
- let v = self . expr . evaluate ( & Tuple ( HashMap :: new ( ) ) , ctx) ;
82
+ let v = self . expr . evaluate ( & Tuple :: new ( ) , ctx) ;
83
83
let ordered = & v. is_ordered ( ) ;
84
84
let mut at_index_counter: i64 = 0 ;
85
85
if let Some ( at_key) = & self . at_key {
86
86
for t in v. into_iter ( ) {
87
- let mut out = HashMap :: from ( [ ( self . as_key . clone ( ) , t) ] ) ;
87
+ let mut out = Tuple :: from ( [ ( self . as_key . as_str ( ) , t) ] ) ;
88
88
let at_id = if * ordered {
89
89
at_index_counter. into ( )
90
90
} else {
91
91
Missing
92
92
} ;
93
- out. insert ( at_key. clone ( ) , at_id) ;
94
- value. push ( Value :: Tuple ( Box :: new ( Tuple ( out) ) ) ) ;
93
+ out. insert ( & at_key, at_id) ;
94
+ value. push ( Value :: Tuple ( Box :: new ( out) ) ) ;
95
95
at_index_counter += 1 ;
96
96
}
97
97
} else {
98
98
for t in v. into_iter ( ) {
99
- let out = HashMap :: from ( [ ( self . as_key . clone ( ) , t) ] ) ;
100
- value. push ( Value :: Tuple ( Box :: new ( Tuple ( out) ) ) ) ;
99
+ let out = Tuple :: from ( [ ( self . as_key . as_str ( ) , t) ] ) ;
100
+ value. push ( Value :: Tuple ( Box :: new ( out) ) ) ;
101
101
}
102
102
}
103
103
self . output = Some ( Value :: Bag ( Box :: new ( value) ) ) ;
@@ -130,15 +130,15 @@ impl EvalUnpivot {
130
130
131
131
impl Evaluable for EvalUnpivot {
132
132
fn evaluate ( & mut self , ctx : & dyn EvalContext ) -> Option < Value > {
133
- let result = self . expr . evaluate ( & Tuple ( HashMap :: new ( ) ) , ctx) ;
133
+ let result = self . expr . evaluate ( & Tuple :: new ( ) , ctx) ;
134
134
let mut out = vec ! [ ] ;
135
135
136
136
let tuple = match result {
137
137
Value :: Tuple ( tuple) => * tuple,
138
138
other => other. coerce_to_tuple ( ) ,
139
139
} ;
140
140
141
- let unpivoted = tuple. 0 . into_iter ( ) . map ( |( k, v) | {
141
+ let unpivoted = tuple. into_iter ( ) . map ( |( k, v) | {
142
142
Tuple :: from ( [ ( self . as_key . as_str ( ) , v) , ( self . at_key . as_str ( ) , k. into ( ) ) ] )
143
143
} ) ;
144
144
@@ -233,14 +233,13 @@ impl Evaluable for EvalProject {
233
233
. clone ( ) ;
234
234
let mut value = partiql_bag ! [ ] ;
235
235
for v in input_value. into_iter ( ) {
236
- let out = v. coerce_to_tuple ( ) ;
237
-
238
- let proj: HashMap < String , Value > = self
239
- . exprs
240
- . iter ( )
241
- . map ( |( alias, expr) | ( alias. to_string ( ) , expr. evaluate ( & out, ctx) ) )
242
- . collect ( ) ;
243
- value. push ( Value :: Tuple ( Box :: new ( Tuple ( proj) ) ) ) ;
236
+ let v_as_tuple = v. coerce_to_tuple ( ) ;
237
+ let mut t = Tuple :: new ( ) ;
238
+
239
+ self . exprs . iter ( ) . for_each ( |( alias, expr) | {
240
+ t. insert ( alias. as_str ( ) , expr. evaluate ( & v_as_tuple, ctx) ) ;
241
+ } ) ;
242
+ value. push ( Value :: Tuple ( Box :: new ( t) ) ) ;
244
243
}
245
244
246
245
self . output = Some ( Value :: Bag ( Box :: new ( value) ) ) ;
@@ -269,7 +268,7 @@ impl EvalExpr for EvalPath {
269
268
fn path_into ( value : Value , path : & EvalPathComponent ) -> Value {
270
269
match path {
271
270
EvalPathComponent :: Key ( s) => match value {
272
- Value :: Tuple ( mut tuple) => tuple. 0 . remove ( s) . unwrap_or ( Missing ) ,
271
+ Value :: Tuple ( mut tuple) => tuple. remove ( s) . unwrap_or ( Missing ) ,
273
272
_ => Missing ,
274
273
} ,
275
274
EvalPathComponent :: Index ( idx) => match value {
@@ -344,9 +343,7 @@ pub struct EvalVarRef {
344
343
345
344
impl EvalExpr for EvalVarRef {
346
345
fn evaluate ( & self , bindings : & Tuple , ctx : & dyn EvalContext ) -> Value {
347
- let value = bindings
348
- . get ( & self . name )
349
- . or_else ( || ctx. bindings ( ) . get ( & self . name ) ) ;
346
+ let value = Bindings :: get ( bindings, & self . name ) . or_else ( || ctx. bindings ( ) . get ( & self . name ) ) ;
350
347
value. map_or ( Null , |v| v. clone ( ) )
351
348
}
352
349
}
@@ -421,9 +418,9 @@ impl EvalExpr for EvalBinOpExpr {
421
418
#[ inline]
422
419
fn short_circuit ( op : & EvalBinOp , value : & Value ) -> Option < Value > {
423
420
match ( op, value) {
424
- ( EvalBinOp :: And , Value :: Boolean ( false ) ) => Some ( false . into ( ) ) ,
425
- ( EvalBinOp :: Or , Value :: Boolean ( true ) ) => Some ( true . into ( ) ) ,
426
- ( _, Value :: Missing ) => Some ( Value :: Missing ) ,
421
+ ( EvalBinOp :: And , Boolean ( false ) ) => Some ( false . into ( ) ) ,
422
+ ( EvalBinOp :: Or , Boolean ( true ) ) => Some ( true . into ( ) ) ,
423
+ ( _, Missing ) => Some ( Missing ) ,
427
424
_ => None ,
428
425
}
429
426
}
0 commit comments