vortex_array/arrays/varbinview/compute/
is_constant.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::{VortexExpect, VortexResult};
5
6use crate::arrays::{Ref, VarBinViewArray, VarBinViewVTable};
7use crate::compute::{IsConstantKernel, IsConstantKernelAdapter, IsConstantOpts};
8use crate::register_kernel;
9
10impl IsConstantKernel for VarBinViewVTable {
11    fn is_constant(
12        &self,
13        array: &VarBinViewArray,
14        _opts: &IsConstantOpts,
15    ) -> VortexResult<Option<bool>> {
16        let mut views_iter = array.views().iter();
17        let first_value = views_iter
18            .next()
19            .vortex_expect("Must have at least one value");
20
21        // For the array to be constant, all views must be of the same type
22        if first_value.is_inlined() {
23            let first_value = first_value.as_inlined();
24
25            for view in views_iter {
26                // Short circuit if the view is of the wrong type, then if both are inlined they must be equal.
27                if !view.is_inlined() || view.as_inlined() != first_value {
28                    return Ok(Some(false));
29                }
30            }
31        } else {
32            // Directly fetch the values for a `Ref`
33            let ref_bytes = |view_ref: &Ref| {
34                &array.buffer(view_ref.buffer_index() as usize).as_slice()[view_ref.to_range()]
35            };
36
37            let first_view_ref = first_value.as_view();
38            let first_value_bytes = ref_bytes(first_view_ref);
39
40            for view in views_iter {
41                // Short circuit if the view is of the wrong type
42                if view.is_inlined() || view.len() != first_value.len() {
43                    return Ok(Some(false));
44                }
45
46                let view_ref = view.as_view();
47                let value = ref_bytes(view_ref);
48                if value != first_value_bytes {
49                    return Ok(Some(false));
50                }
51            }
52        }
53
54        Ok(Some(true))
55    }
56}
57
58register_kernel!(IsConstantKernelAdapter(VarBinViewVTable).lift());