vortex_sparse/compute/
binary_numeric.rs1use 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());