arrow_data/transform/
union.rs1use super::{_MutableArrayData, Extend};
19use crate::ArrayData;
20use arrow_schema::{ArrowError, DataType};
21
22pub(super) fn build_extend_sparse(array: &ArrayData) -> Extend<'_> {
23 let type_ids = array.buffer::<i8>(0);
24
25 Box::new(
26 move |mutable: &mut _MutableArrayData, index: usize, start: usize, len: usize| {
27 mutable
29 .buffer1
30 .extend_from_slice(&type_ids[start..start + len]);
31
32 for child in mutable.child_data.iter_mut() {
33 child.try_extend(index, start, start + len)?;
34 }
35 Ok(())
36 },
37 )
38}
39
40pub(super) fn build_extend_dense(array: &ArrayData) -> Extend<'_> {
41 let type_ids = array.buffer::<i8>(0);
42 let offsets = array.buffer::<i32>(1);
43 let arrow_schema::DataType::Union(src_fields, _) = array.data_type() else {
44 unreachable!();
45 };
46
47 Box::new(
48 move |mutable: &mut _MutableArrayData, index: usize, start: usize, len: usize| {
49 mutable
51 .buffer1
52 .extend_from_slice(&type_ids[start..start + len]);
53
54 for i in start..start + len {
55 let type_id = type_ids[i];
56 let child_index = src_fields
57 .iter()
58 .position(|(r, _)| r == type_id)
59 .expect("invalid union type ID");
60 let src_offset = offsets[i] as usize;
61 let child_data = &mut mutable.child_data[child_index];
62 let dst_offset = child_data.len();
63
64 mutable.buffer2.push(dst_offset as i32);
66 mutable.child_data[child_index].try_extend(index, src_offset, src_offset + 1)?;
67 }
68 Ok(())
69 },
70 )
71}
72
73pub(super) fn extend_nulls_dense(
74 mutable: &mut _MutableArrayData,
75 len: usize,
76) -> Result<(), ArrowError> {
77 let DataType::Union(fields, _) = &mutable.data_type else {
78 unreachable!()
79 };
80 let first_type_id = fields
81 .iter()
82 .next()
83 .expect("union must have at least one field")
84 .0;
85
86 mutable.buffer1.extend_from_slice(&vec![first_type_id; len]);
88
89 let child_offset = mutable.child_data[0].len();
91 let (start, end) = (child_offset as i32, (child_offset + len) as i32);
92 mutable.buffer2.extend(start..end);
93 mutable.child_data[0].try_extend_nulls(len)?;
94 Ok(())
95}
96
97pub(super) fn extend_nulls_sparse(
98 mutable: &mut _MutableArrayData,
99 len: usize,
100) -> Result<(), ArrowError> {
101 let DataType::Union(fields, _) = &mutable.data_type else {
102 unreachable!()
103 };
104 let first_type_id = fields
105 .iter()
106 .next()
107 .expect("union must have at least one field")
108 .0;
109
110 mutable.buffer1.extend_from_slice(&vec![first_type_id; len]);
112
113 for child in mutable.child_data.iter_mut() {
115 child.try_extend_nulls(len)?;
116 }
117 Ok(())
118}