vortex_bytebool/
serde.rs

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