vortex_array/arrays/constant/compute/
min_max.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}