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