@@ -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