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 super::ConstantEncoding;
7use crate::arrays::ConstantArray;
8use crate::compute::scalar_at;
9use crate::serde::ArrayParts;
10use crate::vtable::EncodingVTable;
11use crate::{
12    Array, ArrayBufferVisitor, ArrayContext, ArrayRef, ArrayVisitorImpl, EmptyMetadata, EncodingId,
13};
14
15impl EncodingVTable for ConstantEncoding {
16    fn id(&self) -> EncodingId {
17        EncodingId::new_ref("vortex.constant")
18    }
19
20    fn decode(
21        &self,
22        parts: &ArrayParts,
23        _ctx: &ArrayContext,
24        dtype: DType,
25        len: usize,
26    ) -> VortexResult<ArrayRef> {
27        if parts.nbuffers() != 1 {
28            vortex_bail!("Expected 1 buffer, got {}", parts.nbuffers());
29        }
30        let sv = ScalarValue::from_flexbytes(&parts.buffer(0)?)?;
31        let scalar = Scalar::new(dtype, sv);
32        Ok(ConstantArray::new(scalar, len).into_array())
33    }
34
35    fn encode(
36        &self,
37        input: &crate::Canonical,
38        _like: Option<&dyn Array>,
39    ) -> VortexResult<Option<ArrayRef>> {
40        let array_ref = input.as_ref();
41        if array_ref.is_constant() {
42            let scalar = scalar_at(array_ref, 0)?;
43            Ok(Some(
44                ConstantArray::new(scalar, array_ref.len()).into_array(),
45            ))
46        } else {
47            Ok(None)
48        }
49    }
50}
51
52impl ArrayVisitorImpl for ConstantArray {
53    fn _visit_buffers(&self, visitor: &mut dyn ArrayBufferVisitor) {
54        let buffer = self.scalar.value().to_flexbytes::<ByteBufferMut>().freeze();
55        visitor.visit_buffer(&buffer);
56    }
57
58    fn _metadata(&self) -> EmptyMetadata {
59        EmptyMetadata
60    }
61}