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