vortex_array/arrays/varbinview/
serde.rs

1use vortex_buffer::{Buffer, ByteBuffer};
2use vortex_dtype::DType;
3use vortex_error::{VortexExpect, VortexResult, vortex_bail};
4
5use super::{BinaryView, VarBinViewVTable};
6use crate::arrays::{VarBinViewArray, VarBinViewEncoding};
7use crate::serde::ArrayChildren;
8use crate::validity::Validity;
9use crate::vtable::{SerdeVTable, ValidityHelper, VisitorVTable};
10use crate::{ArrayBufferVisitor, ArrayChildVisitor, EmptyMetadata};
11
12impl SerdeVTable<VarBinViewVTable> for VarBinViewVTable {
13    type Metadata = EmptyMetadata;
14
15    fn metadata(_array: &VarBinViewArray) -> VortexResult<Option<Self::Metadata>> {
16        Ok(Some(EmptyMetadata))
17    }
18
19    fn build(
20        _encoding: &VarBinViewEncoding,
21        dtype: &DType,
22        len: usize,
23        _metadata: &Self::Metadata,
24        buffers: &[ByteBuffer],
25        children: &dyn ArrayChildren,
26    ) -> VortexResult<VarBinViewArray> {
27        if buffers.is_empty() {
28            vortex_bail!("Expected at least 1 buffer, got {}", buffers.len());
29        }
30        let mut buffers: Vec<ByteBuffer> = buffers.to_vec();
31
32        let views =
33            Buffer::<BinaryView>::from_byte_buffer(buffers.pop().vortex_expect("checked above"));
34
35        if views.len() != len {
36            vortex_bail!("Expected {} views, got {}", len, views.len());
37        }
38
39        let validity = if children.is_empty() {
40            Validity::from(dtype.nullability())
41        } else if children.len() == 1 {
42            let validity = children.get(0, &Validity::DTYPE, len)?;
43            Validity::Array(validity)
44        } else {
45            vortex_bail!("Expected 0 or 1 children, got {}", children.len());
46        };
47
48        VarBinViewArray::try_new(views, buffers, dtype.clone(), validity)
49    }
50}
51
52impl VisitorVTable<VarBinViewVTable> for VarBinViewVTable {
53    fn visit_buffers(array: &VarBinViewArray, visitor: &mut dyn ArrayBufferVisitor) {
54        for buffer in array.buffers() {
55            visitor.visit_buffer(buffer);
56        }
57        visitor.visit_buffer(&array.views().clone().into_byte_buffer());
58    }
59
60    fn visit_children(array: &VarBinViewArray, visitor: &mut dyn ArrayChildVisitor) {
61        visitor.visit_validity(array.validity(), array.len())
62    }
63}