vortex_dict/compute/
binary_numeric.rs1use vortex_array::arrays::ConstantArray;
2use vortex_array::compute::{BinaryNumericFn, binary_numeric};
3use vortex_array::{Array, ArrayRef};
4use vortex_error::VortexResult;
5use vortex_scalar::BinaryNumericOperator;
6
7use crate::{DictArray, DictEncoding};
8
9impl BinaryNumericFn<&DictArray> for DictEncoding {
10 fn binary_numeric(
11 &self,
12 array: &DictArray,
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 let rhs_const_array = ConstantArray::new(rhs_scalar, array.values().len()).into_array();
20
21 Ok(Some(
22 DictArray::try_new(
23 array.codes().clone(),
24 binary_numeric(array.values(), &rhs_const_array, op)?,
25 )?
26 .into_array(),
27 ))
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use vortex_array::ArrayRef;
34 use vortex_array::arrays::PrimitiveArray;
35 use vortex_array::compute::slice;
36 use vortex_array::compute::test_harness::test_binary_numeric;
37
38 use crate::builders::dict_encode;
39
40 fn sliced_dict_array() -> ArrayRef {
41 let reference = PrimitiveArray::from_option_iter([
42 Some(42),
43 Some(-9),
44 None,
45 Some(42),
46 Some(1),
47 Some(5),
48 ]);
49 let dict = dict_encode(&reference).unwrap();
50 slice(&dict, 1, 4).unwrap()
51 }
52
53 #[test]
54 fn test_dict_binary_numeric() {
55 let array = sliced_dict_array();
56 test_binary_numeric::<i32>(array)
57 }
58}