vortex_array/arrays/varbinview/
serde.rs1use 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}