@@ -25,7 +25,9 @@ use std::io::{BufWriter, Write};
2525
2626use  flatbuffers:: FlatBufferBuilder ; 
2727
28- use  crate :: array:: { as_struct_array,  as_union_array,  ArrayData ,  ArrayRef } ; 
28+ use  crate :: array:: { 
29+     as_list_array,  as_struct_array,  as_union_array,  make_array,  ArrayData ,  ArrayRef , 
30+ } ; 
2931use  crate :: buffer:: { Buffer ,  MutableBuffer } ; 
3032use  crate :: datatypes:: * ; 
3133use  crate :: error:: { ArrowError ,  Result } ; 
@@ -137,15 +139,14 @@ impl IpcDataGenerator {
137139        } 
138140    } 
139141
140-     fn  encode_dictionaries ( 
142+     fn  _encode_dictionaries ( 
141143        & self , 
142-         field :  & Field , 
143144        column :  & ArrayRef , 
144145        encoded_dictionaries :  & mut  Vec < EncodedData > , 
145146        dictionary_tracker :  & mut  DictionaryTracker , 
146147        write_options :  & IpcWriteOptions , 
147148    )  -> Result < ( ) >  { 
148-         // TODO: Handle other nested types (map, list,  etc) 
149+         // TODO: Handle other nested types (map, etc) 
149150        match  column. data_type ( )  { 
150151            DataType :: Struct ( fields)  => { 
151152                let  s = as_struct_array ( column) ; 
@@ -159,6 +160,16 @@ impl IpcDataGenerator {
159160                    ) ?; 
160161                } 
161162            } 
163+             DataType :: List ( field)  => { 
164+                 let  list = as_list_array ( column) ; 
165+                 self . encode_dictionaries ( 
166+                     field, 
167+                     & list. values ( ) , 
168+                     encoded_dictionaries, 
169+                     dictionary_tracker, 
170+                     write_options, 
171+                 ) ?; 
172+             } 
162173            DataType :: Union ( fields,  _)  => { 
163174                let  union = as_union_array ( column) ; 
164175                for  ( field,  ref  column)  in  fields
@@ -175,13 +186,37 @@ impl IpcDataGenerator {
175186                    ) ?; 
176187                } 
177188            } 
189+             _ => ( ) , 
190+         } 
191+ 
192+         Ok ( ( ) ) 
193+     } 
194+ 
195+     fn  encode_dictionaries ( 
196+         & self , 
197+         field :  & Field , 
198+         column :  & ArrayRef , 
199+         encoded_dictionaries :  & mut  Vec < EncodedData > , 
200+         dictionary_tracker :  & mut  DictionaryTracker , 
201+         write_options :  & IpcWriteOptions , 
202+     )  -> Result < ( ) >  { 
203+         match  column. data_type ( )  { 
178204            DataType :: Dictionary ( _key_type,  _value_type)  => { 
179205                let  dict_id = field
180206                    . dict_id ( ) 
181207                    . expect ( "All Dictionary types have `dict_id`" ) ; 
182208                let  dict_data = column. data ( ) ; 
183209                let  dict_values = & dict_data. child_data ( ) [ 0 ] ; 
184210
211+                 let  values = make_array ( dict_data. child_data ( ) [ 0 ] . clone ( ) ) ; 
212+ 
213+                 self . _encode_dictionaries ( 
214+                     & values, 
215+                     encoded_dictionaries, 
216+                     dictionary_tracker, 
217+                     write_options, 
218+                 ) ?; 
219+ 
185220                let  emit = dictionary_tracker. insert ( dict_id,  column) ?; 
186221
187222                if  emit { 
@@ -192,7 +227,12 @@ impl IpcDataGenerator {
192227                    ) ) ; 
193228                } 
194229            } 
195-             _ => ( ) , 
230+             _ => self . _encode_dictionaries ( 
231+                 column, 
232+                 encoded_dictionaries, 
233+                 dictionary_tracker, 
234+                 write_options, 
235+             ) ?, 
196236        } 
197237
198238        Ok ( ( ) ) 
@@ -205,7 +245,7 @@ impl IpcDataGenerator {
205245        write_options :  & IpcWriteOptions , 
206246    )  -> Result < ( Vec < EncodedData > ,  EncodedData ) >  { 
207247        let  schema = batch. schema ( ) ; 
208-         let  mut  encoded_dictionaries = Vec :: with_capacity ( schema. fields ( ) . len ( ) ) ; 
248+         let  mut  encoded_dictionaries = Vec :: with_capacity ( schema. all_fields ( ) . len ( ) ) ; 
209249
210250        for  ( i,  field)  in  schema. fields ( ) . iter ( ) . enumerate ( )  { 
211251            let  column = batch. column ( i) ; 
0 commit comments