vortex_bytebool/
serde.rs

1use vortex_array::serde::ArrayChildren;
2use vortex_array::validity::Validity;
3use vortex_array::vtable::{SerdeVTable, ValidityHelper, VisitorVTable};
4use vortex_array::{ArrayBufferVisitor, ArrayChildVisitor, DeserializeMetadata, EmptyMetadata};
5use vortex_buffer::ByteBuffer;
6use vortex_dtype::DType;
7use vortex_error::{VortexResult, vortex_bail};
8
9use crate::{ByteBoolArray, ByteBoolEncoding, ByteBoolVTable};
10
11impl SerdeVTable<ByteBoolVTable> for ByteBoolVTable {
12    type Metadata = EmptyMetadata;
13
14    fn metadata(_array: &ByteBoolArray) -> VortexResult<Option<Self::Metadata>> {
15        Ok(Some(EmptyMetadata))
16    }
17
18    fn build(
19        _encoding: &ByteBoolEncoding,
20        dtype: &DType,
21        len: usize,
22        _metadata: &<Self::Metadata as DeserializeMetadata>::Output,
23        buffers: &[ByteBuffer],
24        children: &dyn ArrayChildren,
25    ) -> VortexResult<ByteBoolArray> {
26        let validity = if children.is_empty() {
27            Validity::from(dtype.nullability())
28        } else if children.len() == 1 {
29            let validity = children.get(0, &Validity::DTYPE, len)?;
30            Validity::Array(validity)
31        } else {
32            vortex_bail!("Expected 0 or 1 child, got {}", children.len());
33        };
34
35        if buffers.len() != 1 {
36            vortex_bail!("Expected 1 buffer, got {}", buffers.len());
37        }
38        let buffer = buffers[0].clone();
39
40        Ok(ByteBoolArray::new(buffer, validity))
41    }
42}
43
44impl VisitorVTable<ByteBoolVTable> for ByteBoolVTable {
45    fn visit_buffers(array: &ByteBoolArray, visitor: &mut dyn ArrayBufferVisitor) {
46        visitor.visit_buffer(array.buffer());
47    }
48
49    fn visit_children(array: &ByteBoolArray, visitor: &mut dyn ArrayChildVisitor) {
50        visitor.visit_validity(array.validity(), array.len());
51    }
52}