vortex_bytebool/
serde.rs

1use vortex_array::serde::ArrayParts;
2use vortex_array::validity::Validity;
3use vortex_array::vtable::EncodingVTable;
4use vortex_array::{
5    Array, ArrayBufferVisitor, ArrayChildVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl,
6    EmptyMetadata, EncodingId,
7};
8use vortex_dtype::DType;
9use vortex_error::{VortexResult, vortex_bail};
10
11use crate::{ByteBoolArray, ByteBoolEncoding};
12
13impl EncodingVTable for ByteBoolEncoding {
14    fn id(&self) -> EncodingId {
15        EncodingId::new_ref("vortex.bytebool")
16    }
17
18    fn decode(
19        &self,
20        parts: &ArrayParts,
21        ctx: &ArrayContext,
22        dtype: DType,
23        len: usize,
24    ) -> VortexResult<ArrayRef> {
25        let validity = if parts.nchildren() == 0 {
26            Validity::from(dtype.nullability())
27        } else if parts.nchildren() == 1 {
28            let validity = parts.child(0).decode(ctx, Validity::DTYPE, len)?;
29            Validity::Array(validity)
30        } else {
31            vortex_bail!("Expected 0 or 1 child, got {}", parts.nchildren());
32        };
33
34        if parts.nbuffers() != 1 {
35            vortex_bail!("Expected 1 buffer, got {}", parts.nbuffers());
36        }
37        let buffer = parts.buffer(0)?;
38
39        Ok(ByteBoolArray::new(buffer, validity).into_array())
40    }
41}
42
43impl ArrayVisitorImpl<EmptyMetadata> for ByteBoolArray {
44    fn _visit_buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
45        visitor.visit_buffer(self.buffer());
46    }
47
48    fn _visit_children(&self, visitor: &mut dyn ArrayChildVisitor) {
49        visitor.visit_validity(self.validity(), self.len());
50    }
51
52    fn _metadata(&self) -> EmptyMetadata {
53        EmptyMetadata
54    }
55}