vortex_array/arrays/varbin/
serde.rs

1use std::fmt::Debug;
2
3use vortex_dtype::{DType, Nullability, PType};
4use vortex_error::{VortexExpect, VortexResult, vortex_bail};
5
6use crate::arrays::{VarBinArray, VarBinEncoding};
7use crate::serde::ArrayParts;
8use crate::validity::Validity;
9use crate::vtable::SerdeVTable;
10use crate::{
11    Array, ArrayBufferVisitor, ArrayChildVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl,
12    DeserializeMetadata, RkyvMetadata,
13};
14
15#[derive(Debug, Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
16pub struct VarBinMetadata {
17    pub(crate) offsets_ptype: PType,
18}
19
20impl ArrayVisitorImpl<RkyvMetadata<VarBinMetadata>> for VarBinArray {
21    fn _buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
22        visitor.visit_buffer(self.bytes()); // TODO(ngates): sliced bytes?
23    }
24
25    fn _children(&self, visitor: &mut dyn ArrayChildVisitor) {
26        visitor.visit_child("offsets", self.offsets());
27        visitor.visit_validity(self.validity(), self.len());
28    }
29
30    fn _metadata(&self) -> RkyvMetadata<VarBinMetadata> {
31        RkyvMetadata(VarBinMetadata {
32            offsets_ptype: PType::try_from(self.offsets().dtype())
33                .vortex_expect("Must be a valid PType"),
34        })
35    }
36}
37
38impl SerdeVTable<&VarBinArray> for VarBinEncoding {
39    fn decode(
40        &self,
41        parts: &ArrayParts,
42        ctx: &ArrayContext,
43        dtype: DType,
44        len: usize,
45    ) -> VortexResult<ArrayRef> {
46        let metadata = RkyvMetadata::<VarBinMetadata>::deserialize(parts.metadata())?;
47
48        let validity = if parts.nchildren() == 1 {
49            Validity::from(dtype.nullability())
50        } else if parts.nchildren() == 2 {
51            let validity = parts.child(1).decode(ctx, Validity::DTYPE, len)?;
52            Validity::Array(validity)
53        } else {
54            vortex_bail!("Expected 1 or 2 children, got {}", parts.nchildren());
55        };
56
57        let offsets = parts.child(0).decode(
58            ctx,
59            DType::Primitive(metadata.offsets_ptype, Nullability::NonNullable),
60            len + 1,
61        )?;
62
63        if parts.nbuffers() != 1 {
64            vortex_bail!("Expected 1 buffer, got {}", parts.nbuffers());
65        }
66        let bytes = parts.buffer(0)?;
67
68        Ok(VarBinArray::try_new(offsets, bytes, dtype, validity)?.into_array())
69    }
70}