@@ -25,7 +25,7 @@ use arrow_array::*;
2525use arrow_buffer:: { ArrowNativeType , BooleanBuffer , MutableBuffer , NullBuffer , OffsetBuffer } ;
2626use arrow_data:: ByteView ;
2727use arrow_data:: transform:: MutableArrayData ;
28- use arrow_schema:: { ArrowError , DataType , Fields } ;
28+ use arrow_schema:: { ArrowError , DataType , FieldRef , Fields } ;
2929use std:: sync:: Arc ;
3030
3131macro_rules! primitive_helper {
@@ -105,6 +105,8 @@ pub fn interleave(
105105 _ => unreachable!( "illegal dictionary key type {k}" )
106106 } ,
107107 DataType :: Struct ( fields) => interleave_struct( fields, values, indices) ,
108+ DataType :: List ( field) => interleave_list:: <i32 >( values, indices, field) ,
109+ DataType :: LargeList ( field) => interleave_list:: <i64 >( values, indices, field) ,
108110 _ => interleave_fallback( values, indices)
109111 }
110112}
@@ -312,6 +314,47 @@ fn interleave_struct(
312314 Ok ( Arc :: new ( struct_array) )
313315}
314316
317+ fn interleave_list < O : OffsetSizeTrait > (
318+ values : & [ & dyn Array ] ,
319+ indices : & [ ( usize , usize ) ] ,
320+ field : & FieldRef ,
321+ ) -> Result < ArrayRef , ArrowError > {
322+ let interleaved = Interleave :: < ' _ , GenericListArray < O > > :: new ( values, indices) ;
323+
324+ let mut child_indices = Vec :: new ( ) ;
325+ let mut offsets = Vec :: with_capacity ( indices. len ( ) + 1 ) ;
326+ offsets. push ( O :: from_usize ( 0 ) . unwrap ( ) ) ;
327+
328+ for ( array, row) in indices {
329+ let list = interleaved. arrays [ * array] ;
330+ let start = list. value_offsets ( ) [ * row] . as_usize ( ) ;
331+ let end = list. value_offsets ( ) [ * row + 1 ] . as_usize ( ) ;
332+
333+ for child_idx in start..end {
334+ child_indices. push ( ( * array, child_idx) ) ;
335+ }
336+ offsets. push ( O :: from_usize ( child_indices. len ( ) ) . expect ( "offset overflow" ) ) ;
337+ }
338+
339+ let child_arrays: Vec < & dyn Array > = interleaved
340+ . arrays
341+ . iter ( )
342+ . map ( |list| list. values ( ) . as_ref ( ) )
343+ . collect ( ) ;
344+
345+ let interleaved_values = interleave ( & child_arrays, & child_indices) ?;
346+
347+ let offsets = OffsetBuffer :: new ( offsets. into ( ) ) ;
348+ let list_array = GenericListArray :: < O > :: new (
349+ field. clone ( ) ,
350+ offsets,
351+ interleaved_values,
352+ interleaved. nulls ,
353+ ) ;
354+
355+ Ok ( Arc :: new ( list_array) )
356+ }
357+
315358/// Fallback implementation of interleave using [`MutableArrayData`]
316359fn interleave_fallback (
317360 values : & [ & dyn Array ] ,
@@ -411,7 +454,7 @@ pub fn interleave_record_batch(
411454mod tests {
412455 use super :: * ;
413456 use arrow_array:: Int32RunArray ;
414- use arrow_array:: builder:: { Int32Builder , ListBuilder , PrimitiveRunBuilder } ;
457+ use arrow_array:: builder:: { GenericListBuilder , Int32Builder , PrimitiveRunBuilder } ;
415458 use arrow_schema:: Field ;
416459
417460 #[ test]
@@ -509,10 +552,9 @@ mod tests {
509552 assert_eq ! ( actual, expected) ;
510553 }
511554
512- #[ test]
513- fn test_lists ( ) {
555+ fn test_interleave_lists < O : OffsetSizeTrait > ( ) {
514556 // [[1, 2], null, [3]]
515- let mut a = ListBuilder :: new ( Int32Builder :: new ( ) ) ;
557+ let mut a = GenericListBuilder :: < O , _ > :: new ( Int32Builder :: new ( ) ) ;
516558 a. values ( ) . append_value ( 1 ) ;
517559 a. values ( ) . append_value ( 2 ) ;
518560 a. append ( true ) ;
@@ -522,7 +564,7 @@ mod tests {
522564 let a = a. finish ( ) ;
523565
524566 // [[4], null, [5, 6, null]]
525- let mut b = ListBuilder :: new ( Int32Builder :: new ( ) ) ;
567+ let mut b = GenericListBuilder :: < O , _ > :: new ( Int32Builder :: new ( ) ) ;
526568 b. values ( ) . append_value ( 4 ) ;
527569 b. append ( true ) ;
528570 b. append ( false ) ;
@@ -533,10 +575,13 @@ mod tests {
533575 let b = b. finish ( ) ;
534576
535577 let values = interleave ( & [ & a, & b] , & [ ( 0 , 2 ) , ( 0 , 1 ) , ( 1 , 0 ) , ( 1 , 2 ) , ( 1 , 1 ) ] ) . unwrap ( ) ;
536- let v = values. as_any ( ) . downcast_ref :: < ListArray > ( ) . unwrap ( ) ;
578+ let v = values
579+ . as_any ( )
580+ . downcast_ref :: < GenericListArray < O > > ( )
581+ . unwrap ( ) ;
537582
538583 // [[3], null, [4], [5, 6, null], null]
539- let mut expected = ListBuilder :: new ( Int32Builder :: new ( ) ) ;
584+ let mut expected = GenericListBuilder :: < O , _ > :: new ( Int32Builder :: new ( ) ) ;
540585 expected. values ( ) . append_value ( 3 ) ;
541586 expected. append ( true ) ;
542587 expected. append ( false ) ;
@@ -552,6 +597,16 @@ mod tests {
552597 assert_eq ! ( v, & expected) ;
553598 }
554599
600+ #[ test]
601+ fn test_lists ( ) {
602+ test_interleave_lists :: < i32 > ( ) ;
603+ }
604+
605+ #[ test]
606+ fn test_large_lists ( ) {
607+ test_interleave_lists :: < i64 > ( ) ;
608+ }
609+
555610 #[ test]
556611 fn test_struct_without_nulls ( ) {
557612 let fields = Fields :: from ( vec ! [
0 commit comments