@@ -770,21 +770,19 @@ where
770
770
take_value_indices_from_list :: < IndexType , OffsetType > ( values, indices) ?;
771
771
772
772
let taken = take_impl :: < OffsetType > ( values. values ( ) . as_ref ( ) , & list_indices, None ) ?;
773
- // determine null count and null buffer, which are a function of `values` and `indices`
774
- let mut null_count = 0 ;
773
+ // determine null buffer, which are a function of `values` and `indices`
775
774
let num_bytes = bit_util:: ceil ( indices. len ( ) , 8 ) ;
776
775
let mut null_buf = MutableBuffer :: new ( num_bytes) . with_bitset ( num_bytes, true ) ;
777
776
{
778
777
let null_slice = null_buf. as_slice_mut ( ) ;
779
- offsets[ ..] . windows ( 2 ) . enumerate ( ) . for_each (
780
- |( i, window) : ( usize , & [ OffsetType :: Native ] ) | {
781
- if window[ 0 ] == window[ 1 ] {
782
- // offsets are equal, slot is null
783
- bit_util:: unset_bit ( null_slice, i) ;
784
- null_count += 1 ;
785
- }
786
- } ,
787
- ) ;
778
+ for i in 0 ..indices. len ( ) {
779
+ let index = ToPrimitive :: to_usize ( & indices. value ( i) ) . ok_or_else ( || {
780
+ ArrowError :: ComputeError ( "Cast to usize failed" . to_string ( ) )
781
+ } ) ?;
782
+ if !indices. is_valid ( i) || values. is_null ( index) {
783
+ bit_util:: unset_bit ( null_slice, i) ;
784
+ }
785
+ }
788
786
}
789
787
let value_offsets = Buffer :: from_slice_ref ( & offsets) ;
790
788
// create a new list with taken data and computed null information
@@ -1428,7 +1426,7 @@ mod tests {
1428
1426
let list_data = ArrayData :: builder( list_data_type. clone( ) )
1429
1427
. len( 4 )
1430
1428
. add_buffer( value_offsets)
1431
- . null_bit_buffer( Buffer :: from( [ 0b10111101 , 0b00000000 ] ) )
1429
+ . null_bit_buffer( Buffer :: from( [ 0b1111 ] ) )
1432
1430
. add_child_data( value_data)
1433
1431
. build( ) ;
1434
1432
let list_array = $list_array_type:: from( list_data) ;
@@ -1501,7 +1499,7 @@ mod tests {
1501
1499
let list_data = ArrayData :: builder( list_data_type. clone( ) )
1502
1500
. len( 4 )
1503
1501
. add_buffer( value_offsets)
1504
- . null_bit_buffer( Buffer :: from( [ 0b01111101 ] ) )
1502
+ . null_bit_buffer( Buffer :: from( [ 0b1011 ] ) )
1505
1503
. add_child_data( value_data)
1506
1504
. build( ) ;
1507
1505
let list_array = $list_array_type:: from( list_data) ;
@@ -1766,6 +1764,22 @@ mod tests {
1766
1764
. unwrap ( ) ;
1767
1765
}
1768
1766
1767
+ #[ test]
1768
+ fn test_take_empty_list ( ) {
1769
+ let input = ListArray :: from_iter_primitive :: < Int64Type , _ , _ > ( vec ! [
1770
+ Some ( vec![ ] ) ,
1771
+ None ,
1772
+ Some ( vec![ ] ) ,
1773
+ Some ( vec![ Some ( 123 ) , None ] ) ,
1774
+ Some ( vec![ ] ) ,
1775
+ ] ) ;
1776
+ let index = UInt32Array :: from ( vec ! [ Some ( 0 ) , Some ( 1 ) , Some ( 2 ) , Some ( 3 ) , Some ( 4 ) ] ) ;
1777
+
1778
+ let output = take ( & input, & index, None ) . unwrap ( ) ;
1779
+ let output = output. as_any ( ) . downcast_ref :: < ListArray > ( ) . unwrap ( ) ;
1780
+ assert_eq ! ( output, & input) ;
1781
+ }
1782
+
1769
1783
#[ test]
1770
1784
fn test_take_dict ( ) {
1771
1785
let keys_builder = Int16Builder :: new ( 8 ) ;
0 commit comments