arrow_data/transform/
fixed_size_list.rs1use crate::ArrayData;
19use arrow_schema::{ArrowError, DataType};
20
21use super::{_MutableArrayData, Extend};
22
23pub(super) fn build_extend(array: &ArrayData) -> Extend<'_> {
24 let size = match array.data_type() {
25 DataType::FixedSizeList(_, i) => *i as usize,
26 _ => unreachable!(),
27 };
28 let offset = array.offset();
29
30 Box::new(
31 move |mutable: &mut _MutableArrayData, index: usize, start: usize, len: usize| {
32 let start = start.checked_add(offset).ok_or_else(|| {
33 ArrowError::InvalidArgumentError(format!(
34 "fixed size list offset {offset} with start {start} overflows usize"
35 ))
36 })?;
37 let end = start.checked_add(len).ok_or_else(|| {
38 ArrowError::InvalidArgumentError(format!(
39 "fixed size list start {start} with length {len} overflows usize"
40 ))
41 })?;
42 let (child_start, child_end) = start
43 .checked_mul(size)
44 .zip(end.checked_mul(size))
45 .ok_or_else(|| {
46 ArrowError::InvalidArgumentError(format!(
47 "fixed size list range {start}..{end} with size {size} overflows usize"
48 ))
49 })?;
50 for child in &mut mutable.child_data {
51 child.try_extend(index, child_start, child_end)?;
52 }
53 Ok(())
54 },
55 )
56}
57
58pub(super) fn extend_nulls(mutable: &mut _MutableArrayData, len: usize) -> Result<(), ArrowError> {
59 let size = match mutable.data_type {
60 DataType::FixedSizeList(_, i) => i as usize,
61 _ => unreachable!(),
62 };
63
64 for child in &mut mutable.child_data {
65 child.try_extend_nulls(len * size)?;
66 }
67 Ok(())
68}