Path: blob/main/crates/polars-arrow/src/array/struct_/builder.rs
6939 views
use polars_utils::IdxSize;12use super::StructArray;3use crate::array::builder::{ArrayBuilder, ShareStrategy, StaticArrayBuilder};4use crate::bitmap::OptBitmapBuilder;5use crate::datatypes::ArrowDataType;67pub struct StructArrayBuilder {8dtype: ArrowDataType,9length: usize,10inner_builders: Vec<Box<dyn ArrayBuilder>>,11validity: OptBitmapBuilder,12}1314impl StructArrayBuilder {15pub fn new(dtype: ArrowDataType, inner_builders: Vec<Box<dyn ArrayBuilder>>) -> Self {16Self {17dtype,18length: 0,19inner_builders,20validity: OptBitmapBuilder::default(),21}22}23}2425impl StaticArrayBuilder for StructArrayBuilder {26type Array = StructArray;2728fn dtype(&self) -> &ArrowDataType {29&self.dtype30}3132fn reserve(&mut self, additional: usize) {33for builder in &mut self.inner_builders {34builder.reserve(additional);35}36self.validity.reserve(additional);37}3839fn freeze(self) -> StructArray {40let values = self41.inner_builders42.into_iter()43.map(|b| b.freeze())44.collect();45let validity = self.validity.into_opt_validity();46StructArray::new(self.dtype, self.length, values, validity)47}4849fn freeze_reset(&mut self) -> Self::Array {50let values = self51.inner_builders52.iter_mut()53.map(|b| b.freeze_reset())54.collect();55let validity = core::mem::take(&mut self.validity).into_opt_validity();56let out = StructArray::new(self.dtype.clone(), self.length, values, validity);57self.length = 0;58out59}6061fn len(&self) -> usize {62self.length63}6465fn extend_nulls(&mut self, length: usize) {66for builder in &mut self.inner_builders {67builder.extend_nulls(length);68}69self.validity.extend_constant(length, false);70self.length += length;71}7273fn subslice_extend(74&mut self,75other: &StructArray,76start: usize,77length: usize,78share: ShareStrategy,79) {80for (builder, other_values) in self.inner_builders.iter_mut().zip(other.values()) {81builder.subslice_extend(&**other_values, start, length, share);82}83self.validity84.subslice_extend_from_opt_validity(other.validity(), start, length);85self.length += length.min(other.len().saturating_sub(start));86}8788fn subslice_extend_each_repeated(89&mut self,90other: &StructArray,91start: usize,92length: usize,93repeats: usize,94share: ShareStrategy,95) {96for (builder, other_values) in self.inner_builders.iter_mut().zip(other.values()) {97builder.subslice_extend_each_repeated(&**other_values, start, length, repeats, share);98}99self.validity100.subslice_extend_from_opt_validity(other.validity(), start, length);101self.length += length.min(other.len().saturating_sub(start)) * repeats;102}103104unsafe fn gather_extend(105&mut self,106other: &StructArray,107idxs: &[IdxSize],108share: ShareStrategy,109) {110for (builder, other_values) in self.inner_builders.iter_mut().zip(other.values()) {111builder.gather_extend(&**other_values, idxs, share);112}113self.validity114.gather_extend_from_opt_validity(other.validity(), idxs);115self.length += idxs.len();116}117118fn opt_gather_extend(&mut self, other: &StructArray, idxs: &[IdxSize], share: ShareStrategy) {119for (builder, other_values) in self.inner_builders.iter_mut().zip(other.values()) {120builder.opt_gather_extend(&**other_values, idxs, share);121}122self.validity123.opt_gather_extend_from_opt_validity(other.validity(), idxs, other.len());124self.length += idxs.len();125}126}127128129