vortex_array/arrays/decimal/compute/
scalar_at.rs

1use vortex_error::VortexResult;
2use vortex_scalar::Scalar;
3
4use crate::arrays::{DecimalArray, DecimalEncoding};
5use crate::compute::ScalarAtFn;
6use crate::{Array, match_each_decimal_value_type};
7
8impl ScalarAtFn<&DecimalArray> for DecimalEncoding {
9    fn scalar_at(&self, array: &DecimalArray, index: usize) -> VortexResult<Scalar> {
10        let scalar = match_each_decimal_value_type!(array.values_type(), |($D, $CTor)| {
11           Scalar::decimal(
12                $CTor(array.buffer::<$D>()[index]),
13                array.decimal_dtype(),
14                array.dtype().nullability(),
15            )
16        });
17        Ok(scalar)
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use vortex_buffer::buffer;
24    use vortex_dtype::{DecimalDType, Nullability};
25    use vortex_scalar::{DecimalValue, Scalar};
26
27    use crate::arrays::DecimalArray;
28    use crate::compute::scalar_at;
29    use crate::validity::Validity;
30
31    #[test]
32    fn test_scalar_at() {
33        let array = DecimalArray::new(
34            buffer![100i128],
35            DecimalDType::new(3, 2),
36            Validity::NonNullable,
37        );
38
39        assert_eq!(
40            scalar_at(&array, 0).unwrap(),
41            Scalar::decimal(
42                DecimalValue::I128(100),
43                DecimalDType::new(3, 2),
44                Nullability::NonNullable
45            )
46        );
47    }
48}