vortex_sparse/compute/
binary_numeric.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_array::Array;
5use vortex_array::ArrayRef;
6use vortex_array::IntoArray;
7use vortex_array::arrays::ConstantArray;
8use vortex_array::compute::NumericKernel;
9use vortex_array::compute::NumericKernelAdapter;
10use vortex_array::compute::numeric;
11use vortex_array::register_kernel;
12use vortex_error::VortexResult;
13use vortex_error::vortex_err;
14use vortex_scalar::NumericOperator;
15
16use crate::SparseArray;
17use crate::SparseVTable;
18
19impl NumericKernel for SparseVTable {
20    fn numeric(
21        &self,
22        array: &SparseArray,
23        rhs: &dyn Array,
24        op: NumericOperator,
25    ) -> VortexResult<Option<ArrayRef>> {
26        let Some(rhs_scalar) = rhs.as_constant() else {
27            return Ok(None);
28        };
29
30        let new_patches = array.patches().clone().map_values(|values| {
31            let rhs_const_array = ConstantArray::new(rhs_scalar.clone(), values.len()).into_array();
32
33            numeric(&values, &rhs_const_array, op)
34        })?;
35        let new_fill_value = array
36            .fill_scalar()
37            .as_primitive()
38            .checked_binary_numeric(&rhs_scalar.as_primitive(), op)
39            .ok_or_else(|| vortex_err!("numeric overflow"))?
40            .into();
41        Ok(Some(
42            SparseArray::try_new_from_patches(new_patches, new_fill_value)?.into_array(),
43        ))
44    }
45}
46
47register_kernel!(NumericKernelAdapter(SparseVTable).lift());