vortex_array/arrays/varbinview/compute/
is_constant.rs1use 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 if first_value.is_inlined() {
23 let first_value = first_value.as_inlined();
24
25 for view in views_iter {
26 if !view.is_inlined() || view.as_inlined() != first_value {
28 return Ok(Some(false));
29 }
30 }
31 } else {
32 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 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());