@@ -22,7 +22,7 @@ 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_TYPE_VARIATION_REF , DICTIONARY_CONTAINER_TYPE_VARIATION_REF , DURATION_INTERVAL_DAY_TYPE_VARIATION_REF ,
2626 INTERVAL_DAY_TIME_TYPE_REF , INTERVAL_MONTH_DAY_NANO_TYPE_NAME ,
2727 INTERVAL_MONTH_DAY_NANO_TYPE_REF , INTERVAL_YEAR_MONTH_TYPE_REF ,
2828 LARGE_CONTAINER_TYPE_VARIATION_REF , TIMESTAMP_MICRO_TYPE_VARIATION_REF ,
@@ -177,24 +177,32 @@ pub fn from_substrait_type(
177177 let value_type = map. value . as_ref ( ) . ok_or_else ( || {
178178 substrait_datafusion_err ! ( "Map type must have value type" )
179179 } ) ?;
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),
180+ let key_type =
181+ from_substrait_type ( consumer, key_type, dfs_names, name_idx) ?;
182+ let value_type =
183+ from_substrait_type ( consumer, value_type, dfs_names, name_idx) ?;
184+
185+ match map. type_variation_reference {
186+ DEFAULT_CONTAINER_TYPE_VARIATION_REF => {
187+ let key_field = Arc :: new ( Field :: new ( "key" , key_type, false ) ) ;
188+ let value_field = Arc :: new ( Field :: new ( "value" , value_type, true ) ) ;
189+ Ok ( DataType :: Map (
190+ Arc :: new ( Field :: new_struct (
191+ "entries" ,
192+ [ key_field, value_field] ,
193+ false , // The inner map field is always non-nullable (Arrow #1697),
194+ ) ) ,
195+ false , // whether keys are sorted
196+ ) )
197+ }
198+ DICTIONARY_CONTAINER_TYPE_VARIATION_REF => Ok ( DataType :: Dictionary (
199+ Box :: new ( key_type) ,
200+ Box :: new ( value_type) ,
195201 ) ) ,
196- false , // whether keys are sorted
197- ) )
202+ v => not_impl_err ! (
203+ "Unsupported Substrait type variation {v} of type {s_kind:?}"
204+ ) ,
205+ }
198206 }
199207 r#type:: Kind :: Decimal ( d) => match d. type_variation_reference {
200208 DECIMAL_128_TYPE_VARIATION_REF => {
0 commit comments