vortex_array/arrays/varbinview/compute/
is_constant.rs

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