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 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}