vortex_array/arrays/varbinview/
serde.rs

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