@@ -21,7 +21,7 @@ use arrow::array::{ArrayRef, BooleanArray, BooleanBufferBuilder, PrimitiveArray}
2121use arrow:: buffer:: NullBuffer ;
2222use arrow:: datatypes:: ArrowNativeTypeOp ;
2323use arrow:: datatypes:: ArrowPrimitiveType ;
24- use arrow:: datatypes:: { DataType as ArrowDataType , Field } ;
24+ use arrow:: datatypes:: DataType as ArrowDataType ;
2525use arrow:: datatypes:: {
2626 Date32Type , Float32Type , Float64Type , Int16Type , Int32Type , Int64Type , Int8Type , SchemaRef ,
2727} ;
@@ -32,7 +32,7 @@ use crate::column::Column;
3232use crate :: encoding:: boolean:: BooleanDecoder ;
3333use crate :: encoding:: byte:: ByteRleDecoder ;
3434use crate :: encoding:: float:: FloatDecoder ;
35- use crate :: encoding:: integer:: get_rle_reader ;
35+ use crate :: encoding:: integer:: get_signed_int_decoder ;
3636use crate :: encoding:: PrimitiveValueDecoder ;
3737use crate :: error:: {
3838 self , MismatchedSchemaSnafu , Result , UnexpectedSnafu , UnsupportedTypeVariantSnafu ,
@@ -258,10 +258,10 @@ impl Iterator for NaiveStripeDecoder {
258258
259259pub fn array_decoder_factory (
260260 column : & Column ,
261- field : Arc < Field > ,
261+ hinted_arrow_type : & ArrowDataType ,
262262 stripe : & Stripe ,
263263) -> Result < Box < dyn ArrayBatchDecoder > > {
264- let decoder: Box < dyn ArrayBatchDecoder > = match ( column. data_type ( ) , field . data_type ( ) ) {
264+ let decoder: Box < dyn ArrayBatchDecoder > = match ( column. data_type ( ) , hinted_arrow_type ) {
265265 // TODO: try make branches more generic, reduce duplication
266266 ( DataType :: Boolean { .. } , ArrowDataType :: Boolean ) => {
267267 let iter = stripe. stream_map ( ) . get ( column, Kind :: Data ) ;
@@ -277,19 +277,19 @@ pub fn array_decoder_factory(
277277 }
278278 ( DataType :: Short { .. } , ArrowDataType :: Int16 ) => {
279279 let iter = stripe. stream_map ( ) . get ( column, Kind :: Data ) ;
280- let iter = get_rle_reader ( column , iter ) ? ;
280+ let iter = get_signed_int_decoder ( iter , column . rle_version ( ) ) ;
281281 let present = PresentDecoder :: from_stripe ( stripe, column) ;
282282 Box :: new ( Int16ArrayDecoder :: new ( iter, present) )
283283 }
284284 ( DataType :: Int { .. } , ArrowDataType :: Int32 ) => {
285285 let iter = stripe. stream_map ( ) . get ( column, Kind :: Data ) ;
286- let iter = get_rle_reader ( column , iter ) ? ;
286+ let iter = get_signed_int_decoder ( iter , column . rle_version ( ) ) ;
287287 let present = PresentDecoder :: from_stripe ( stripe, column) ;
288288 Box :: new ( Int32ArrayDecoder :: new ( iter, present) )
289289 }
290290 ( DataType :: Long { .. } , ArrowDataType :: Int64 ) => {
291291 let iter = stripe. stream_map ( ) . get ( column, Kind :: Data ) ;
292- let iter = get_rle_reader ( column , iter ) ? ;
292+ let iter = get_signed_int_decoder ( iter , column . rle_version ( ) ) ;
293293 let present = PresentDecoder :: from_stripe ( stripe, column) ;
294294 Box :: new ( Int64ArrayDecoder :: new ( iter, present) )
295295 }
@@ -315,7 +315,7 @@ pub fn array_decoder_factory(
315315 } ,
316316 ArrowDataType :: Decimal128 ( a_precision, a_scale) ,
317317 ) if * precision as u8 == * a_precision && * scale as i8 == * a_scale => {
318- new_decimal_decoder ( column, stripe, * precision, * scale) ?
318+ new_decimal_decoder ( column, stripe, * precision, * scale)
319319 }
320320 ( DataType :: Timestamp { .. } , field_type) => {
321321 new_timestamp_decoder ( column, field_type. clone ( ) , stripe) ?
@@ -326,7 +326,7 @@ pub fn array_decoder_factory(
326326 ( DataType :: Date { .. } , ArrowDataType :: Date32 ) => {
327327 // TODO: allow Date64
328328 let iter = stripe. stream_map ( ) . get ( column, Kind :: Data ) ;
329- let iter = get_rle_reader ( column , iter ) ? ;
329+ let iter = get_signed_int_decoder ( iter , column . rle_version ( ) ) ;
330330 let present = PresentDecoder :: from_stripe ( stripe, column) ;
331331 Box :: new ( DateArrayDecoder :: new ( iter, present) )
332332 }
@@ -433,17 +433,13 @@ impl NaiveStripeDecoder {
433433 }
434434
435435 pub fn new ( stripe : Stripe , schema_ref : SchemaRef , batch_size : usize ) -> Result < Self > {
436- let mut decoders = Vec :: with_capacity ( stripe. columns ( ) . len ( ) ) ;
437436 let number_of_rows = stripe. number_of_rows ( ) ;
438-
439- for ( col, field) in stripe
437+ let decoders = stripe
440438 . columns ( )
441439 . iter ( )
442- . zip ( schema_ref. fields . iter ( ) . cloned ( ) )
443- {
444- let decoder = array_decoder_factory ( col, field, & stripe) ?;
445- decoders. push ( decoder) ;
446- }
440+ . zip ( schema_ref. fields . iter ( ) )
441+ . map ( |( col, field) | array_decoder_factory ( col, field. data_type ( ) , & stripe) )
442+ . collect :: < Result < Vec < _ > > > ( ) ?;
447443
448444 Ok ( Self {
449445 stripe,
0 commit comments