vortex_array/arrays/varbin/
serde.rs1use 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()); }
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}