@@ -154,7 +154,7 @@ pub use value_iter::ValueIter;
154154
155155use crate :: reader:: boolean_array:: BooleanArrayDecoder ;
156156use crate :: reader:: decimal_array:: DecimalArrayDecoder ;
157- use crate :: reader:: list_array:: ListArrayDecoder ;
157+ use crate :: reader:: list_array:: { ListArrayDecoder , ListViewArrayDecoder } ;
158158use crate :: reader:: map_array:: MapArrayDecoder ;
159159use crate :: reader:: null_array:: NullArrayDecoder ;
160160use crate :: reader:: primitive_array:: PrimitiveArrayDecoder ;
@@ -792,6 +792,8 @@ fn make_decoder(
792792 DataType :: LargeUtf8 => Ok ( Box :: new( StringArrayDecoder :: <i64 >:: new( coerce_primitive) ) ) ,
793793 DataType :: List ( _) => Ok ( Box :: new( ListArrayDecoder :: <i32 >:: new( ctx, data_type, is_nullable) ?) ) ,
794794 DataType :: LargeList ( _) => Ok ( Box :: new( ListArrayDecoder :: <i64 >:: new( ctx, data_type, is_nullable) ?) ) ,
795+ DataType :: ListView ( _) => Ok ( Box :: new( ListViewArrayDecoder :: <i32 >:: new( ctx, data_type, is_nullable) ?) ) ,
796+ DataType :: LargeListView ( _) => Ok ( Box :: new( ListViewArrayDecoder :: <i64 >:: new( ctx, data_type, is_nullable) ?) ) ,
795797 DataType :: Struct ( _) => Ok ( Box :: new( StructArrayDecoder :: new( ctx, data_type, is_nullable) ?) ) ,
796798 DataType :: Binary => Ok ( Box :: new( BinaryArrayDecoder :: <i32 >:: default ( ) ) ) ,
797799 DataType :: LargeBinary => Ok ( Box :: new( BinaryArrayDecoder :: <i64 >:: default ( ) ) ) ,
@@ -815,7 +817,10 @@ mod tests {
815817 use std:: io:: { BufReader , Cursor , Seek } ;
816818
817819 use arrow_array:: cast:: AsArray ;
818- use arrow_array:: { Array , BooleanArray , Float64Array , ListArray , StringArray , StringViewArray } ;
820+ use arrow_array:: {
821+ Array , BooleanArray , Float64Array , GenericListViewArray , ListArray , OffsetSizeTrait ,
822+ StringArray , StringViewArray ,
823+ } ;
819824 use arrow_buffer:: { ArrowNativeType , Buffer } ;
820825 use arrow_cast:: display:: { ArrayFormatter , FormatOptions } ;
821826 use arrow_data:: ArrayDataBuilder ;
@@ -2192,6 +2197,77 @@ mod tests {
21922197 assert_eq ! ( read, expected) ;
21932198 }
21942199
2200+ fn assert_read_list_view < O : OffsetSizeTrait > ( ) {
2201+ let field = Arc :: new ( Field :: new ( "item" , DataType :: Int32 , true ) ) ;
2202+ let data_type = GenericListViewArray :: < O > :: DATA_TYPE_CONSTRUCTOR ( field. clone ( ) ) ;
2203+ let schema = Arc :: new ( Schema :: new ( vec ! [ Field :: new( "lv" , data_type, true ) ] ) ) ;
2204+
2205+ let buf = r#"
2206+ {"lv": [1, 2, 3]}
2207+ {"lv": [4, null]}
2208+ {"lv": null}
2209+ {"lv": [6]}
2210+ {"lv": []}
2211+ "# ;
2212+
2213+ let batches = do_read ( buf, 1024 , false , false , schema) ;
2214+ assert_eq ! ( batches. len( ) , 1 ) ;
2215+ let batch = & batches[ 0 ] ;
2216+ let col = batch. column ( 0 ) ;
2217+ let list_view = col
2218+ . as_any ( )
2219+ . downcast_ref :: < GenericListViewArray < O > > ( )
2220+ . unwrap ( ) ;
2221+
2222+ assert_eq ! ( list_view. len( ) , 5 ) ;
2223+
2224+ // Check offsets and sizes
2225+ let expected_offsets: Vec < O > = vec ! [ 0 , 3 , 5 , 5 , 6 ]
2226+ . into_iter ( )
2227+ . map ( |v| O :: usize_as ( v) )
2228+ . collect ( ) ;
2229+ let expected_sizes: Vec < O > = vec ! [ 3 , 2 , 0 , 1 , 0 ]
2230+ . into_iter ( )
2231+ . map ( |v| O :: usize_as ( v) )
2232+ . collect ( ) ;
2233+ assert_eq ! ( list_view. value_offsets( ) , & expected_offsets) ;
2234+ assert_eq ! ( list_view. value_sizes( ) , & expected_sizes) ;
2235+
2236+ // Row 0: [1, 2, 3]
2237+ assert ! ( list_view. is_valid( 0 ) ) ;
2238+ let vals = list_view. value ( 0 ) ;
2239+ let ints = vals. as_primitive :: < Int32Type > ( ) ;
2240+ assert_eq ! ( ints. values( ) , & [ 1 , 2 , 3 ] ) ;
2241+
2242+ // Row 1: [4, null]
2243+ assert ! ( list_view. is_valid( 1 ) ) ;
2244+ let vals = list_view. value ( 1 ) ;
2245+ let ints = vals. as_primitive :: < Int32Type > ( ) ;
2246+ assert_eq ! ( ints. len( ) , 2 ) ;
2247+ assert_eq ! ( ints. value( 0 ) , 4 ) ;
2248+ assert ! ( ints. is_null( 1 ) ) ;
2249+
2250+ // Row 2: null
2251+ assert ! ( list_view. is_null( 2 ) ) ;
2252+
2253+ // Row 3: [6]
2254+ assert ! ( list_view. is_valid( 3 ) ) ;
2255+ let vals = list_view. value ( 3 ) ;
2256+ let ints = vals. as_primitive :: < Int32Type > ( ) ;
2257+ assert_eq ! ( ints. values( ) , & [ 6 ] ) ;
2258+
2259+ // Row 4: []
2260+ assert ! ( list_view. is_valid( 4 ) ) ;
2261+ let vals = list_view. value ( 4 ) ;
2262+ assert_eq ! ( vals. len( ) , 0 ) ;
2263+ }
2264+
2265+ #[ test]
2266+ fn test_read_list_view ( ) {
2267+ assert_read_list_view :: < i32 > ( ) ;
2268+ assert_read_list_view :: < i64 > ( ) ;
2269+ }
2270+
21952271 #[ test]
21962272 fn test_skip_empty_lines ( ) {
21972273 let schema = Schema :: new ( vec ! [ Field :: new( "a" , DataType :: Int64 , true ) ] ) ;
0 commit comments