@@ -19,10 +19,9 @@ use std::marker::PhantomData;
1919use std:: sync:: Arc ;
2020
2121use arrow_array:: builder:: BooleanBufferBuilder ;
22- use arrow_array:: { ArrayRef , GenericListArray , OffsetSizeTrait , make_array } ;
22+ use arrow_array:: { ArrayRef , GenericListArray , GenericListViewArray , OffsetSizeTrait } ;
2323use arrow_buffer:: buffer:: NullBuffer ;
24- use arrow_buffer:: { Buffer , OffsetBuffer , ScalarBuffer } ;
25- use arrow_data:: ArrayDataBuilder ;
24+ use arrow_buffer:: { OffsetBuffer , ScalarBuffer } ;
2625use arrow_schema:: { ArrowError , DataType , FieldRef } ;
2726
2827use crate :: reader:: tape:: { Tape , TapeElement } ;
@@ -109,22 +108,17 @@ impl<O: OffsetSizeTrait, const IS_VIEW: bool> ArrayDecoder for ListLikeArrayDeco
109108 sizes. push ( offsets[ i] - offsets[ i - 1 ] ) ;
110109 }
111110 offsets. pop ( ) ;
112- let data_type = if O :: IS_LARGE {
113- DataType :: LargeListView ( self . field . clone ( ) )
114- } else {
115- DataType :: ListView ( self . field . clone ( ) )
116- } ;
117111 // SAFETY: offsets and sizes are constructed correctly from the tape
118- let array_data = unsafe {
119- ArrayDataBuilder :: new ( data_type )
120- . len ( pos . len ( ) )
121- . nulls ( nulls )
122- . child_data ( vec ! [ values . to_data ( ) ] )
123- . add_buffer ( Buffer :: from_vec ( offsets ) )
124- . add_buffer ( Buffer :: from_vec ( sizes ) )
125- . build_unchecked ( )
112+ let array = unsafe {
113+ GenericListViewArray :: < O > :: new_unchecked (
114+ self . field . clone ( ) ,
115+ ScalarBuffer :: from ( offsets ) ,
116+ ScalarBuffer :: from ( sizes ) ,
117+ values ,
118+ nulls ,
119+ )
126120 } ;
127- Ok ( make_array ( array_data ) )
121+ Ok ( Arc :: new ( array ) )
128122 } else {
129123 // SAFETY: offsets are built monotonically starting from 0
130124 let offsets = unsafe { OffsetBuffer :: < O > :: new_unchecked ( ScalarBuffer :: from ( offsets) ) } ;
0 commit comments