@@ -6,7 +6,7 @@ use std::ffi::c_void;
66use crate :: { handle:: Handle , kernel_string_slice, KernelStringSlice } ;
77use delta_kernel:: expressions:: {
88 ArrayData , BinaryExpression , BinaryOperator , Expression , JunctionExpression , JunctionOperator ,
9- Scalar , StructData , UnaryExpression , UnaryOperator ,
9+ MapData , Scalar , StructData , UnaryExpression , UnaryOperator ,
1010} ;
1111
1212/// Free the memory the passed SharedExpression
@@ -113,6 +113,15 @@ pub struct EngineExpressionVisitor {
113113 /// The values of the array are in a list identified by `child_list_id`.
114114 pub visit_literal_array :
115115 extern "C" fn ( data : * mut c_void , sibling_list_id : usize , child_list_id : usize ) ,
116+ /// Visit a map literal belonging to the list identified by `sibling_list_id`.
117+ /// The keys of the map are in order in a list identified by `key_list_id`. The values of the
118+ /// map are in order in a list identified by `value_list_id`.
119+ pub visit_literal_map : extern "C" fn (
120+ data : * mut c_void ,
121+ sibling_list_id : usize ,
122+ key_list_id : usize ,
123+ value_list_id : usize ,
124+ ) ,
116125 /// Visits a null value belonging to the list identified by `sibling_list_id.
117126 pub visit_literal_null : extern "C" fn ( data : * mut c_void , sibling_list_id : usize ) ,
118127 /// Visits an `and` expression belonging to the list identified by `sibling_list_id`.
@@ -228,6 +237,27 @@ fn visit_expression_array(
228237 call ! ( visitor, visit_literal_array, sibling_list_id, child_list_id) ;
229238}
230239
240+ fn visit_expression_map (
241+ visitor : & mut EngineExpressionVisitor ,
242+ map_data : & MapData ,
243+ sibling_list_id : usize ,
244+ ) {
245+ let pairs = map_data. pairs ( ) ;
246+ let key_list_id = call ! ( visitor, make_field_list, pairs. len( ) ) ;
247+ let value_list_id = call ! ( visitor, make_field_list, pairs. len( ) ) ;
248+ for ( key, val) in pairs {
249+ visit_expression_scalar ( visitor, key, key_list_id) ;
250+ visit_expression_scalar ( visitor, val, value_list_id) ;
251+ }
252+ call ! (
253+ visitor,
254+ visit_literal_map,
255+ sibling_list_id,
256+ key_list_id,
257+ value_list_id
258+ ) ;
259+ }
260+
231261fn visit_expression_struct_literal (
232262 visitor : & mut EngineExpressionVisitor ,
233263 struct_data : & StructData ,
@@ -333,6 +363,7 @@ fn visit_expression_scalar(
333363 visit_expression_struct_literal ( visitor, struct_data, sibling_list_id)
334364 }
335365 Scalar :: Array ( array) => visit_expression_array ( visitor, array, sibling_list_id) ,
366+ Scalar :: Map ( map_data) => visit_expression_map ( visitor, map_data, sibling_list_id) ,
336367 }
337368}
338369
0 commit comments