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