@@ -79,25 +79,25 @@ impl EvalScan {
7979impl Evaluable for EvalScan {
8080 fn evaluate ( & mut self , ctx : & dyn EvalContext ) -> Option < Value > {
8181 let mut value = partiql_bag ! [ ] ;
82- let v = self . expr . evaluate ( & Tuple ( HashMap :: new ( ) ) , ctx) ;
82+ let v = self . expr . evaluate ( & Tuple :: new ( ) , ctx) ;
8383 let ordered = & v. is_ordered ( ) ;
8484 let mut at_index_counter: i64 = 0 ;
8585 if let Some ( at_key) = & self . at_key {
8686 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) ] ) ;
8888 let at_id = if * ordered {
8989 at_index_counter. into ( )
9090 } else {
9191 Missing
9292 } ;
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) ) ) ;
9595 at_index_counter += 1 ;
9696 }
9797 } else {
9898 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) ) ) ;
101101 }
102102 }
103103 self . output = Some ( Value :: Bag ( Box :: new ( value) ) ) ;
@@ -130,15 +130,15 @@ impl EvalUnpivot {
130130
131131impl Evaluable for EvalUnpivot {
132132 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) ;
134134 let mut out = vec ! [ ] ;
135135
136136 let tuple = match result {
137137 Value :: Tuple ( tuple) => * tuple,
138138 other => other. coerce_to_tuple ( ) ,
139139 } ;
140140
141- let unpivoted = tuple. 0 . into_iter ( ) . map ( |( k, v) | {
141+ let unpivoted = tuple. into_iter ( ) . map ( |( k, v) | {
142142 Tuple :: from ( [ ( self . as_key . as_str ( ) , v) , ( self . at_key . as_str ( ) , k. into ( ) ) ] )
143143 } ) ;
144144
@@ -233,14 +233,13 @@ impl Evaluable for EvalProject {
233233 . clone ( ) ;
234234 let mut value = partiql_bag ! [ ] ;
235235 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) ) ) ;
244243 }
245244
246245 self . output = Some ( Value :: Bag ( Box :: new ( value) ) ) ;
@@ -269,7 +268,7 @@ impl EvalExpr for EvalPath {
269268 fn path_into ( value : Value , path : & EvalPathComponent ) -> Value {
270269 match path {
271270 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 ) ,
273272 _ => Missing ,
274273 } ,
275274 EvalPathComponent :: Index ( idx) => match value {
@@ -344,9 +343,7 @@ pub struct EvalVarRef {
344343
345344impl EvalExpr for EvalVarRef {
346345 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 ) ) ;
350347 value. map_or ( Null , |v| v. clone ( ) )
351348 }
352349}
@@ -421,9 +418,9 @@ impl EvalExpr for EvalBinOpExpr {
421418 #[ inline]
422419 fn short_circuit ( op : & EvalBinOp , value : & Value ) -> Option < Value > {
423420 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 ) ,
427424 _ => None ,
428425 }
429426 }
0 commit comments