vortex_array/arrays/varbinview/
serde.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_buffer::{Buffer, ByteBuffer};
5use vortex_dtype::DType;
6use vortex_error::{VortexExpect, VortexResult, vortex_bail};
7
8use super::{BinaryView, VarBinViewVTable};
9use crate::arrays::{VarBinViewArray, VarBinViewEncoding};
10use crate::serde::ArrayChildren;
11use crate::validity::Validity;
12use crate::vtable::{SerdeVTable, ValidityHelper, VisitorVTable};
13use crate::{ArrayBufferVisitor, ArrayChildVisitor, EmptyMetadata};
14
15impl SerdeVTable<VarBinViewVTable> for VarBinViewVTable {
16    type Metadata = EmptyMetadata;
17
18    fn metadata(_array: &VarBinViewArray) -> VortexResult<Option<Self::Metadata>> {
19        Ok(Some(EmptyMetadata))
20    }
21
22    fn build(
23        _encoding: &VarBinViewEncoding,
24        dtype: &DType,
25        len: usize,
26        _metadata: &Self::Metadata,
27        buffers: &[ByteBuffer],
28        children: &dyn ArrayChildren,
29    ) -> VortexResult<VarBinViewArray> {
30        if buffers.is_empty() {
31            vortex_bail!("Expected at least 1 buffer, got {}", buffers.len());
32        }
33        let mut buffers: Vec<ByteBuffer> = buffers.to_vec();
34
35        let views =
36            Buffer::<BinaryView>::from_byte_buffer(buffers.pop().vortex_expect("checked above"));
37
38        if views.len() != len {
39            vortex_bail!("Expected {} views, got {}", len, views.len());
40        }
41
42        let validity = if children.is_empty() {
43            Validity::from(dtype.nullability())
44        } else if children.len() == 1 {
45            let validity = children.get(0, &Validity::DTYPE, len)?;
46            Validity::Array(validity)
47        } else {
48            vortex_bail!("Expected 0 or 1 children, got {}", children.len());
49        };
50
51        VarBinViewArray::try_new(views, buffers, dtype.clone(), validity)
52    }
53}
54
55impl VisitorVTable<VarBinViewVTable> for VarBinViewVTable {
56    fn visit_buffers(array: &VarBinViewArray, visitor: &mut dyn ArrayBufferVisitor) {
57        for buffer in array.buffers() {
58            visitor.visit_buffer(buffer);
59        }
60        visitor.visit_buffer(&array.views().clone().into_byte_buffer());
61    }
62
63    fn visit_children(array: &VarBinViewArray, visitor: &mut dyn ArrayChildVisitor) {
64        visitor.visit_validity(array.validity(), array.len())
65    }
66}