@@ -22,13 +22,13 @@ 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 ,
26- INTERVAL_DAY_TIME_TYPE_REF , INTERVAL_MONTH_DAY_NANO_TYPE_NAME ,
27- INTERVAL_MONTH_DAY_NANO_TYPE_REF , INTERVAL_YEAR_MONTH_TYPE_REF ,
28- LARGE_CONTAINER_TYPE_VARIATION_REF , TIMESTAMP_MICRO_TYPE_VARIATION_REF ,
29- TIMESTAMP_MILLI_TYPE_VARIATION_REF , TIMESTAMP_NANO_TYPE_VARIATION_REF ,
30- TIMESTAMP_SECOND_TYPE_VARIATION_REF , UNSIGNED_INTEGER_TYPE_VARIATION_REF ,
31- VIEW_CONTAINER_TYPE_VARIATION_REF ,
25+ DEFAULT_TYPE_VARIATION_REF , DICTIONARY_CONTAINER_TYPE_VARIATION_REF ,
26+ DURATION_INTERVAL_DAY_TYPE_VARIATION_REF , INTERVAL_DAY_TIME_TYPE_REF ,
27+ INTERVAL_MONTH_DAY_NANO_TYPE_NAME , INTERVAL_MONTH_DAY_NANO_TYPE_REF ,
28+ INTERVAL_YEAR_MONTH_TYPE_REF , LARGE_CONTAINER_TYPE_VARIATION_REF ,
29+ TIMESTAMP_MICRO_TYPE_VARIATION_REF , TIMESTAMP_MILLI_TYPE_VARIATION_REF ,
30+ TIMESTAMP_NANO_TYPE_VARIATION_REF , TIMESTAMP_SECOND_TYPE_VARIATION_REF ,
31+ UNSIGNED_INTEGER_TYPE_VARIATION_REF , VIEW_CONTAINER_TYPE_VARIATION_REF ,
3232} ;
3333use datafusion:: arrow:: datatypes:: {
3434 DataType , Field , Fields , IntervalUnit , Schema , TimeUnit ,
@@ -181,24 +181,32 @@ pub fn from_substrait_type(
181181 let value_type = map. value . as_ref ( ) . ok_or_else ( || {
182182 substrait_datafusion_err ! ( "Map type must have value type" )
183183 } ) ?;
184- let key_field = Arc :: new ( Field :: new (
185- "key" ,
186- from_substrait_type ( consumer, key_type, dfs_names, name_idx) ?,
187- false ,
188- ) ) ;
189- let value_field = Arc :: new ( Field :: new (
190- "value" ,
191- from_substrait_type ( consumer, value_type, dfs_names, name_idx) ?,
192- true ,
193- ) ) ;
194- Ok ( DataType :: Map (
195- Arc :: new ( Field :: new_struct (
196- "entries" ,
197- [ key_field, value_field] ,
198- 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_CONTAINER_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_CONTAINER_TYPE_VARIATION_REF => Ok ( DataType :: Dictionary (
203+ Box :: new ( key_type) ,
204+ Box :: new ( value_type) ,
199205 ) ) ,
200- false , // whether keys are sorted
201- ) )
206+ v => not_impl_err ! (
207+ "Unsupported Substrait type variation {v} of type {s_kind:?}"
208+ ) ,
209+ }
202210 }
203211 r#type:: Kind :: Decimal ( d) => match d. type_variation_reference {
204212 DECIMAL_128_TYPE_VARIATION_REF => {
0 commit comments