@@ -277,11 +277,13 @@ fn fixed_size_array_reverse(
277277 let mut indices: Vec < u64 > = Vec :: with_capacity ( values. len ( ) ) ;
278278
279279 for row_index in 0 ..array. len ( ) {
280- // skip the null value
280+ // If the (sub) array is null, it doesn't matter what its values are, but
281+ // we do need to insert `value_length` elements since it's a fixed size list
281282 if array. is_null ( row_index) {
282- indices. push ( 0 ) ;
283+ indices. extend ( vec ! [ 0 ; value_length ] ) ;
283284 continue ;
284285 }
286+
285287 let start = row_index * value_length;
286288 let end = start + value_length;
287289 for idx in ( start..end) . rev ( ) {
@@ -302,11 +304,11 @@ fn fixed_size_array_reverse(
302304
303305#[ cfg( test) ]
304306mod tests {
305- use crate :: reverse:: list_view_reverse;
307+ use crate :: reverse:: { fixed_size_array_reverse , list_view_reverse} ;
306308 use arrow:: {
307309 array:: {
308- AsArray , GenericListViewArray , Int32Array , LargeListViewArray , ListViewArray ,
309- OffsetSizeTrait ,
310+ AsArray , FixedSizeListArray , GenericListViewArray , Int32Array ,
311+ LargeListViewArray , ListViewArray , OffsetSizeTrait ,
310312 } ,
311313 buffer:: { NullBuffer , ScalarBuffer } ,
312314 datatypes:: { DataType , Field , Int32Type } ,
@@ -323,6 +325,13 @@ mod tests {
323325 . collect ( )
324326 }
325327
328+ fn fixed_size_list_values ( array : & FixedSizeListArray ) -> Vec < Option < Vec < i32 > > > {
329+ array
330+ . iter ( )
331+ . map ( |x| x. map ( |x| x. as_primitive :: < Int32Type > ( ) . values ( ) . to_vec ( ) ) )
332+ . collect ( )
333+ }
334+
326335 #[ test]
327336 fn test_reverse_list_view ( ) -> Result < ( ) > {
328337 let field = Arc :: new ( Field :: new ( "a" , DataType :: Int32 , false ) ) ;
@@ -461,4 +470,23 @@ mod tests {
461470 assert_eq ! ( expected, reversed) ;
462471 Ok ( ( ) )
463472 }
473+
474+ #[ test]
475+ fn test_reverse_fixed_size_list ( ) -> Result < ( ) > {
476+ let field = Arc :: new ( Field :: new ( "a" , DataType :: Int32 , false ) ) ;
477+ let values = Arc :: new ( Int32Array :: from ( vec ! [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ) ) ;
478+ let result = fixed_size_array_reverse (
479+ & FixedSizeListArray :: new (
480+ field,
481+ 3 ,
482+ values,
483+ Some ( NullBuffer :: from ( vec ! [ true , false , true ] ) ) ,
484+ ) ,
485+ & Arc :: new ( Field :: new ( "test" , DataType :: Int32 , true ) ) ,
486+ ) ?;
487+ let reversed = fixed_size_list_values ( result. as_fixed_size_list ( ) ) ;
488+ let expected = vec ! [ Some ( vec![ 3 , 2 , 1 ] ) , None , Some ( vec![ 9 , 8 , 7 ] ) ] ;
489+ assert_eq ! ( expected, reversed) ;
490+ Ok ( ( ) )
491+ }
464492}
0 commit comments