vortex_array/arrays/varbinview/
serde.rs

1use itertools::Itertools;
2use vortex_buffer::{Buffer, ByteBuffer};
3use vortex_dtype::DType;
4use vortex_error::{VortexExpect, VortexResult, vortex_bail};
5
6use super::{BinaryView, VarBinViewEncoding};
7use crate::arrays::VarBinViewArray;
8use crate::serde::ArrayParts;
9use crate::validity::Validity;
10use crate::vtable::EncodingVTable;
11use crate::{
12    Array, ArrayBufferVisitor, ArrayChildVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl,
13    EmptyMetadata, EncodingId,
14};
15
16impl EncodingVTable for VarBinViewEncoding {
17    fn id(&self) -> EncodingId {
18        EncodingId::new_ref("vortex.varbinview")
19    }
20
21    fn decode(
22        &self,
23        parts: &ArrayParts,
24        ctx: &ArrayContext,
25        dtype: DType,
26        len: usize,
27    ) -> VortexResult<ArrayRef> {
28        let mut buffers: Vec<ByteBuffer> = (0..parts.nbuffers())
29            .map(|i| parts.buffer(i))
30            .try_collect()?;
31        let views = Buffer::<BinaryView>::from_byte_buffer(
32            buffers.pop().vortex_expect("Missing views buffer"),
33        );
34
35        if views.len() != len {
36            vortex_bail!("Expected {} views, got {}", len, views.len());
37        }
38
39        let validity = if parts.nchildren() == 0 {
40            Validity::from(dtype.nullability())
41        } else if parts.nchildren() == 1 {
42            let validity = parts.child(0).decode(ctx, Validity::DTYPE, len)?;
43            Validity::Array(validity)
44        } else {
45            vortex_bail!("Expected 0 or 1 children, got {}", parts.nchildren());
46        };
47
48        Ok(VarBinViewArray::try_new(views, buffers, dtype, validity)?.into_array())
49    }
50}
51
52impl ArrayVisitorImpl<EmptyMetadata> for VarBinViewArray {
53    fn _visit_buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
54        for buffer in self.buffers() {
55            visitor.visit_buffer(buffer);
56        }
57        visitor.visit_buffer(&self.views().clone().into_byte_buffer());
58    }
59
60    fn _visit_children(&self, visitor: &mut dyn ArrayChildVisitor) {
61        visitor.visit_validity(self.validity(), self.len())
62    }
63
64    fn _metadata(&self) -> EmptyMetadata {
65        EmptyMetadata
66    }
67}