vortex_array/arrays/constant/
serde.rs

1use vortex_buffer::ByteBufferMut;
2use vortex_dtype::DType;
3use vortex_error::{VortexResult, vortex_bail};
4use vortex_scalar::{Scalar, ScalarValue};
5
6use crate::arrays::{ConstantArray, ConstantEncoding};
7use crate::serde::ArrayParts;
8use crate::vtable::SerdeVTable;
9use crate::{Array, ArrayBufferVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl, EmptyMetadata};
10
11impl ArrayVisitorImpl for ConstantArray {
12    fn _buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
13        let buffer = self.scalar.value().to_flexbytes::<ByteBufferMut>().freeze();
14        visitor.visit_buffer(&buffer);
15    }
16
17    fn _metadata(&self) -> EmptyMetadata {
18        EmptyMetadata
19    }
20}
21
22impl SerdeVTable<&ConstantArray> for ConstantEncoding {
23    fn decode(
24        &self,
25        parts: &ArrayParts,
26        _ctx: &ArrayContext,
27        dtype: DType,
28        len: usize,
29    ) -> VortexResult<ArrayRef> {
30        if parts.nbuffers() != 1 {
31            vortex_bail!("Expected 1 buffer, got {}", parts.nbuffers());
32        }
33        let sv = ScalarValue::from_flexbytes(&parts.buffer(0)?)?;
34        let scalar = Scalar::new(dtype, sv);
35        Ok(ConstantArray::new(scalar, len).into_array())
36    }
37}