vortex_sparse/compute/
binary_numeric.rs

1use vortex_array::arrays::ConstantArray;
2use vortex_array::compute::{BinaryNumericFn, binary_numeric};
3use vortex_array::{Array, ArrayRef};
4use vortex_error::{VortexResult, vortex_err};
5use vortex_scalar::BinaryNumericOperator;
6
7use crate::{SparseArray, SparseEncoding};
8
9impl BinaryNumericFn<&SparseArray> for SparseEncoding {
10    fn binary_numeric(
11        &self,
12        array: &SparseArray,
13        rhs: &dyn Array,
14        op: BinaryNumericOperator,
15    ) -> VortexResult<Option<ArrayRef>> {
16        let Some(rhs_scalar) = rhs.as_constant() else {
17            return Ok(None);
18        };
19
20        let new_patches = array.patches().clone().map_values(|values| {
21            let rhs_const_array = ConstantArray::new(rhs_scalar.clone(), values.len()).into_array();
22
23            binary_numeric(&values, &rhs_const_array, op)
24        })?;
25        let new_fill_value = array
26            .fill_scalar()
27            .as_primitive()
28            .checked_binary_numeric(&rhs_scalar.as_primitive(), op)
29            .ok_or_else(|| vortex_err!("numeric overflow"))?
30            .into();
31        Ok(Some(
32            SparseArray::try_new_from_patches(new_patches, new_fill_value)?.into_array(),
33        ))
34    }
35}