vortex_sparse/compute/
binary_numeric.rs

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