@@ -21,7 +21,8 @@ use super::SubstraitConsumer;
2121use 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 ,
24- DEFAULT_CONTAINER_TYPE_VARIATION_REF , DEFAULT_TYPE_VARIATION_REF ,
24+ DEFAULT_CONTAINER_TYPE_VARIATION_REF , DEFAULT_MAP_TYPE_VARIATION_REF ,
25+ DEFAULT_TYPE_VARIATION_REF , DICTIONARY_MAP_TYPE_VARIATION_REF ,
2526 INTERVAL_DAY_TIME_TYPE_REF , INTERVAL_MONTH_DAY_NANO_TYPE_NAME ,
2627 INTERVAL_MONTH_DAY_NANO_TYPE_REF , INTERVAL_YEAR_MONTH_TYPE_REF ,
2728 LARGE_CONTAINER_TYPE_VARIATION_REF , TIMESTAMP_MICRO_TYPE_VARIATION_REF ,
@@ -180,24 +181,32 @@ pub fn from_substrait_type(
180181 let value_type = map. value . as_ref ( ) . ok_or_else ( || {
181182 substrait_datafusion_err ! ( "Map type must have value type" )
182183 } ) ?;
183- let key_field = Arc :: new ( Field :: new (
184- "key" ,
185- from_substrait_type ( consumer, key_type, dfs_names, name_idx) ?,
186- false ,
187- ) ) ;
188- let value_field = Arc :: new ( Field :: new (
189- "value" ,
190- from_substrait_type ( consumer, value_type, dfs_names, name_idx) ?,
191- true ,
192- ) ) ;
193- Ok ( DataType :: Map (
194- Arc :: new ( Field :: new_struct (
195- "entries" ,
196- [ key_field, value_field] ,
197- false , // The inner map field is always non-nullable (Arrow #1697),
184+ let key_type =
185+ from_substrait_type ( consumer, key_type, dfs_names, name_idx) ?;
186+ let value_type =
187+ from_substrait_type ( consumer, value_type, dfs_names, name_idx) ?;
188+
189+ match map. type_variation_reference {
190+ DEFAULT_MAP_TYPE_VARIATION_REF => {
191+ let key_field = Arc :: new ( Field :: new ( "key" , key_type, false ) ) ;
192+ let value_field = Arc :: new ( Field :: new ( "value" , value_type, true ) ) ;
193+ Ok ( DataType :: Map (
194+ Arc :: new ( Field :: new_struct (
195+ "entries" ,
196+ [ key_field, value_field] ,
197+ false , // The inner map field is always non-nullable (Arrow #1697),
198+ ) ) ,
199+ false , // whether keys are sorted
200+ ) )
201+ }
202+ DICTIONARY_MAP_TYPE_VARIATION_REF => Ok ( DataType :: Dictionary (
203+ Box :: new ( key_type) ,
204+ Box :: new ( value_type) ,
198205 ) ) ,
199- false , // whether keys are sorted
200- ) )
206+ v => not_impl_err ! (
207+ "Unsupported Substrait type variation {v} of type {s_kind:?}"
208+ ) ,
209+ }
201210 }
202211 r#type:: Kind :: Decimal ( d) => match d. type_variation_reference {
203212 DECIMAL_128_TYPE_VARIATION_REF => {
0 commit comments