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