vortex_array/arrays/constant/compute/
min_max.rs1use vortex_error::VortexResult;
5
6use crate::arrays::ConstantArray;
7use crate::arrays::ConstantVTable;
8use crate::compute::MinMaxKernel;
9use crate::compute::MinMaxKernelAdapter;
10use crate::compute::MinMaxResult;
11use crate::register_kernel;
12
13impl MinMaxKernel for ConstantVTable {
14 fn min_max(&self, array: &ConstantArray) -> VortexResult<Option<MinMaxResult>> {
15 let scalar = array.scalar();
16 if scalar.is_null() || scalar.as_primitive_opt().is_some_and(|p| p.is_nan()) {
17 return Ok(None);
18 }
19 let non_nullable_dtype = scalar.dtype().as_nonnullable();
20 Ok(Some(MinMaxResult {
21 min: scalar.cast(&non_nullable_dtype)?,
22 max: scalar.cast(&non_nullable_dtype)?,
23 }))
24 }
25}
26
27register_kernel!(MinMaxKernelAdapter(ConstantVTable).lift());
28
29#[cfg(test)]
30mod test {
31 use vortex_dtype::Nullability;
32 use vortex_dtype::half::f16;
33 use vortex_scalar::Scalar;
34
35 use crate::arrays::ConstantArray;
36 use crate::compute::min_max;
37
38 #[test]
39 fn test_min_max_nan() {
40 let scalar = Scalar::primitive(f16::NAN, Nullability::NonNullable);
41 let array = ConstantArray::new(scalar, 2).to_array();
42 let result = min_max(&array).unwrap();
43 assert_eq!(result, None);
44 }
45}