vortex_array/arrays/varbinview/compute/
is_constant.rs1use vortex_error::VortexExpect;
5use vortex_error::VortexResult;
6use vortex_vector::binaryview::Ref;
7
8use crate::arrays::VarBinViewArray;
9use crate::arrays::VarBinViewVTable;
10use crate::compute::IsConstantKernel;
11use crate::compute::IsConstantKernelAdapter;
12use crate::compute::IsConstantOpts;
13use crate::register_kernel;
14
15impl IsConstantKernel for VarBinViewVTable {
16 fn is_constant(
17 &self,
18 array: &VarBinViewArray,
19 _opts: &IsConstantOpts,
20 ) -> VortexResult<Option<bool>> {
21 let mut views_iter = array.views().iter();
22 let first_value = views_iter
23 .next()
24 .vortex_expect("Must have at least one value");
25
26 if first_value.is_inlined() {
28 let first_value = first_value.as_inlined();
29
30 for view in views_iter {
31 if !view.is_inlined() || view.as_inlined() != first_value {
33 return Ok(Some(false));
34 }
35 }
36 } else {
37 let ref_bytes = |view_ref: &Ref| {
39 &array.buffer(view_ref.buffer_index as usize).as_slice()[view_ref.as_range()]
40 };
41
42 let first_view_ref = first_value.as_view();
43 let first_value_bytes = ref_bytes(first_view_ref);
44
45 for view in views_iter {
46 if view.is_inlined() || view.len() != first_value.len() {
48 return Ok(Some(false));
49 }
50
51 let view_ref = view.as_view();
52 let value = ref_bytes(view_ref);
53 if value != first_value_bytes {
54 return Ok(Some(false));
55 }
56 }
57 }
58
59 Ok(Some(true))
60 }
61}
62
63register_kernel!(IsConstantKernelAdapter(VarBinViewVTable).lift());