vortex_array/arrays/varbinview/vtable/
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::VarBinViewVTable;
11use crate::EmptyMetadata;
12use crate::arrays::binary_view::BinaryView;
13use crate::arrays::{VarBinViewArray, VarBinViewEncoding};
14use crate::serde::ArrayChildren;
15use crate::validity::Validity;
16use crate::vtable::SerdeVTable;
17
18impl SerdeVTable<VarBinViewVTable> for VarBinViewVTable {
19    type Metadata = EmptyMetadata;
20
21    fn metadata(_array: &VarBinViewArray) -> VortexResult<Option<Self::Metadata>> {
22        Ok(Some(EmptyMetadata))
23    }
24
25    fn build(
26        _encoding: &VarBinViewEncoding,
27        dtype: &DType,
28        len: usize,
29        _metadata: &Self::Metadata,
30        buffers: &[ByteBuffer],
31        children: &dyn ArrayChildren,
32    ) -> VortexResult<VarBinViewArray> {
33        if buffers.is_empty() {
34            vortex_bail!("Expected at least 1 buffer, got {}", buffers.len());
35        }
36        let mut buffers: Vec<ByteBuffer> = buffers.to_vec();
37        let views = buffers.pop().vortex_expect("buffers non-empty");
38
39        let views = Buffer::<BinaryView>::from_byte_buffer(views);
40
41        if views.len() != len {
42            vortex_bail!("Expected {} views, got {}", len, views.len());
43        }
44
45        let validity = if children.is_empty() {
46            Validity::from(dtype.nullability())
47        } else if children.len() == 1 {
48            let validity = children.get(0, &Validity::DTYPE, len)?;
49            Validity::Array(validity)
50        } else {
51            vortex_bail!("Expected 0 or 1 children, got {}", children.len());
52        };
53
54        VarBinViewArray::try_new(views, Arc::from(buffers), dtype.clone(), validity)
55    }
56}