Skip to content

Commit f72c86e

Browse files
committed
Only slice into structs
1 parent 02347bb commit f72c86e

File tree

1 file changed

+19
-57
lines changed

1 file changed

+19
-57
lines changed

arrow/src/array/data.rs

Lines changed: 19 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121
use std::mem;
2222
use std::sync::Arc;
2323

24-
use crate::{array::raw_pointer::RawPtrBox, datatypes::{DataType, IntervalUnit}};
24+
use crate::datatypes::{DataType, IntervalUnit};
2525
use crate::{bitmap::Bitmap, datatypes::ArrowNativeType};
2626
use 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]
3434
pub(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-
527489
impl PartialEq for ArrayData {
528490
fn eq(&self, other: &Self) -> bool {
529491
equal(self, other)

0 commit comments

Comments
 (0)