2121use std:: mem;
2222use std:: sync:: Arc ;
2323
24- use crate :: { array :: raw_pointer :: RawPtrBox , datatypes:: { DataType , IntervalUnit } } ;
24+ use crate :: datatypes:: { DataType , IntervalUnit } ;
2525use crate :: { bitmap:: Bitmap , datatypes:: ArrowNativeType } ;
2626use crate :: {
2727 buffer:: { Buffer , MutableBuffer } ,
2828 util:: bit_util,
2929} ;
3030
31- use super :: { OffsetSizeTrait , equal:: equal} ;
31+ use super :: equal:: equal;
3232
3333#[ inline]
3434pub ( crate ) fn count_nulls (
@@ -383,18 +383,7 @@ impl ArrayData {
383383 pub fn slice ( & self , offset : usize , length : usize ) -> ArrayData {
384384 assert ! ( ( offset + length) <= self . len( ) ) ;
385385
386- // If data type is primitive, it's quick to clone array
387- if self . child_data ( ) . is_empty ( ) {
388- let mut new_data = self . clone ( ) ;
389-
390- new_data. len = length;
391- new_data. offset = offset + self . offset ;
392-
393- new_data. null_count =
394- count_nulls ( new_data. null_buffer ( ) , new_data. offset , new_data. len ) ;
395-
396- new_data
397- } else {
386+ if let DataType :: Struct ( _) = self . data_type ( ) {
398387 // Slice into children
399388 let new_offset = self . offset + offset;
400389 let new_data = ArrayData {
@@ -403,33 +392,25 @@ impl ArrayData {
403392 null_count : count_nulls ( self . null_buffer ( ) , new_offset, length) ,
404393 offset : new_offset,
405394 buffers : self . buffers . clone ( ) ,
406- child_data : self . child_data ( ) . iter ( ) . map ( |data| {
407- match self . data_type ( ) {
408- DataType :: List ( _) => {
409- let ( start, end) = get_list_child_slice :: < i32 > (
410- self . buffers . get ( 0 ) . unwrap ( ) ,
411- offset,
412- length
413- ) ;
414- data. slice ( start, end - start)
415- }
416- DataType :: LargeList ( _) => {
417- let ( start, end) = get_list_child_slice :: < i64 > (
418- self . buffers . get ( 0 ) . unwrap ( ) ,
419- offset,
420- length
421- ) ;
422- data. slice ( start, end - start)
423- }
424- _ => {
425- // All other types don't require computing offsets
426- data. slice ( offset, length)
427- }
428- }
429- } ) . collect ( ) ,
395+ // Slice child data, to propagate offsets down to them
396+ child_data : self
397+ . child_data ( )
398+ . iter ( )
399+ . map ( |data| data. slice ( offset, length) )
400+ . collect ( ) ,
430401 null_bitmap : self . null_bitmap ( ) . clone ( ) ,
431402 } ;
432403
404+ new_data
405+ } else {
406+ let mut new_data = self . clone ( ) ;
407+
408+ new_data. len = length;
409+ new_data. offset = offset + self . offset ;
410+
411+ new_data. null_count =
412+ count_nulls ( new_data. null_buffer ( ) , new_data. offset , new_data. len ) ;
413+
433414 new_data
434415 }
435416 }
@@ -505,25 +486,6 @@ impl ArrayData {
505486 }
506487}
507488
508- #[ inline]
509- fn get_list_child_slice < OffsetSize : OffsetSizeTrait > (
510- buffer : & Buffer ,
511- offset : usize ,
512- length : usize
513- ) -> ( usize , usize ) {
514- let raw_buffer = buffer. as_ptr ( ) ;
515- let value_offsets: & [ OffsetSize ] = unsafe {
516- let value_offsets = RawPtrBox :: < OffsetSize > :: new ( raw_buffer) ;
517- std:: slice:: from_raw_parts (
518- value_offsets. as_ptr ( ) . add ( offset) ,
519- length + 1 ,
520- )
521- } ;
522- let start = value_offsets[ 0 ] ;
523- let end = value_offsets[ length - 1 ] ;
524- ( start. to_usize ( ) . unwrap ( ) , end. to_usize ( ) . unwrap ( ) )
525- }
526-
527489impl PartialEq for ArrayData {
528490 fn eq ( & self , other : & Self ) -> bool {
529491 equal ( self , other)
0 commit comments