@@ -22,7 +22,8 @@ use crate::variation_const::{
2222    DATE_32_TYPE_VARIATION_REF ,  DATE_64_TYPE_VARIATION_REF , 
2323    DECIMAL_128_TYPE_VARIATION_REF ,  DECIMAL_256_TYPE_VARIATION_REF , 
2424    DEFAULT_CONTAINER_TYPE_VARIATION_REF ,  DEFAULT_INTERVAL_DAY_TYPE_VARIATION_REF , 
25-     DEFAULT_TYPE_VARIATION_REF ,  DURATION_INTERVAL_DAY_TYPE_VARIATION_REF , 
25+     DEFAULT_MAP_TYPE_VARIATION_REF ,  DEFAULT_TYPE_VARIATION_REF , 
26+     DICTIONARY_MAP_TYPE_VARIATION_REF ,  DURATION_INTERVAL_DAY_TYPE_VARIATION_REF , 
2627    INTERVAL_DAY_TIME_TYPE_REF ,  INTERVAL_MONTH_DAY_NANO_TYPE_NAME , 
2728    INTERVAL_MONTH_DAY_NANO_TYPE_REF ,  INTERVAL_YEAR_MONTH_TYPE_REF , 
2829    LARGE_CONTAINER_TYPE_VARIATION_REF ,  TIMESTAMP_MICRO_TYPE_VARIATION_REF , 
@@ -177,24 +178,32 @@ pub fn from_substrait_type(
177178                let  value_type = map. value . as_ref ( ) . ok_or_else ( || { 
178179                    substrait_datafusion_err ! ( "Map type must have value type" ) 
179180                } ) ?; 
180-                 let  key_field = Arc :: new ( Field :: new ( 
181-                     "key" , 
182-                     from_substrait_type ( consumer,  key_type,  dfs_names,  name_idx) ?, 
183-                     false , 
184-                 ) ) ; 
185-                 let  value_field = Arc :: new ( Field :: new ( 
186-                     "value" , 
187-                     from_substrait_type ( consumer,  value_type,  dfs_names,  name_idx) ?, 
188-                     true , 
189-                 ) ) ; 
190-                 Ok ( DataType :: Map ( 
191-                     Arc :: new ( Field :: new_struct ( 
192-                         "entries" , 
193-                         [ key_field,  value_field] , 
194-                         false ,  // The inner map field is always non-nullable (Arrow #1697), 
181+                 let  key_type =
182+                     from_substrait_type ( consumer,  key_type,  dfs_names,  name_idx) ?; 
183+                 let  value_type =
184+                     from_substrait_type ( consumer,  value_type,  dfs_names,  name_idx) ?; 
185+ 
186+                 match  map. type_variation_reference  { 
187+                     DEFAULT_MAP_TYPE_VARIATION_REF  => { 
188+                         let  key_field = Arc :: new ( Field :: new ( "key" ,  key_type,  false ) ) ; 
189+                         let  value_field = Arc :: new ( Field :: new ( "value" ,  value_type,  true ) ) ; 
190+                         Ok ( DataType :: Map ( 
191+                             Arc :: new ( Field :: new_struct ( 
192+                                 "entries" , 
193+                                 [ key_field,  value_field] , 
194+                                 false ,  // The inner map field is always non-nullable (Arrow #1697), 
195+                             ) ) , 
196+                             false ,  // whether keys are sorted 
197+                         ) ) 
198+                     } 
199+                     DICTIONARY_MAP_TYPE_VARIATION_REF  => Ok ( DataType :: Dictionary ( 
200+                         Box :: new ( key_type) , 
201+                         Box :: new ( value_type) , 
195202                    ) ) , 
196-                     false ,  // whether keys are sorted 
197-                 ) ) 
203+                     v => not_impl_err ! ( 
204+                         "Unsupported Substrait type variation {v} of type {s_kind:?}" 
205+                     ) , 
206+                 } 
198207            } 
199208            r#type:: Kind :: Decimal ( d)  => match  d. type_variation_reference  { 
200209                DECIMAL_128_TYPE_VARIATION_REF  => { 
0 commit comments