vortex_array/builders/
extension.rs1use std::any::Any;
2use std::sync::Arc;
3
4use vortex_dtype::{DType, ExtDType};
5use vortex_error::{VortexResult, vortex_bail};
6use vortex_mask::Mask;
7use vortex_scalar::ExtScalar;
8
9use crate::arrays::ExtensionArray;
10use crate::builders::{ArrayBuilder, ArrayBuilderExt, builder_with_capacity};
11use crate::{Array, ArrayRef, Canonical};
12
13pub struct ExtensionBuilder {
14 storage: Box<dyn ArrayBuilder>,
15 dtype: DType,
16}
17
18impl ExtensionBuilder {
19 pub fn new(ext_dtype: Arc<ExtDType>) -> Self {
20 Self::with_capacity(ext_dtype, 1024)
21 }
22
23 pub fn with_capacity(ext_dtype: Arc<ExtDType>, capacity: usize) -> Self {
24 Self {
25 storage: builder_with_capacity(ext_dtype.storage_dtype(), capacity),
26 dtype: DType::Extension(ext_dtype),
27 }
28 }
29
30 pub fn append_value(&mut self, value: ExtScalar) -> VortexResult<()> {
31 self.storage.append_scalar(&value.storage())
32 }
33
34 pub fn append_option(&mut self, value: Option<ExtScalar>) -> VortexResult<()> {
35 match value {
36 Some(value) => self.append_value(value),
37 None => {
38 self.append_nulls(1);
39 Ok(())
40 }
41 }
42 }
43
44 fn ext_dtype(&self) -> Arc<ExtDType> {
45 if let DType::Extension(ext_dtype) = &self.dtype {
46 ext_dtype.clone()
47 } else {
48 unreachable!()
49 }
50 }
51}
52
53impl ArrayBuilder for ExtensionBuilder {
54 fn as_any(&self) -> &dyn Any {
55 self
56 }
57
58 fn as_any_mut(&mut self) -> &mut dyn Any {
59 self
60 }
61
62 fn dtype(&self) -> &DType {
63 &self.dtype
64 }
65
66 fn len(&self) -> usize {
67 self.storage.len()
68 }
69
70 fn append_zeros(&mut self, n: usize) {
71 self.storage.append_zeros(n)
72 }
73
74 fn append_nulls(&mut self, n: usize) {
75 self.storage.append_nulls(n)
76 }
77
78 fn extend_from_array(&mut self, array: &dyn Array) -> VortexResult<()> {
79 let array = array.to_canonical()?;
80 let Canonical::Extension(array) = array else {
81 vortex_bail!("Expected Extension array, got {:?}", array);
82 };
83 array.storage().append_to_builder(self.storage.as_mut())
84 }
85
86 fn ensure_capacity(&mut self, capacity: usize) {
87 self.storage.ensure_capacity(capacity)
88 }
89
90 fn set_validity(&mut self, validity: Mask) {
91 self.storage.set_validity(validity);
92 }
93
94 fn finish(&mut self) -> ArrayRef {
95 let storage = self.storage.finish();
96 ExtensionArray::new(self.ext_dtype(), storage).into_array()
97 }
98}