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