vortex_array/arrays/varbinview/
accessor.rs1use std::iter;
5
6use crate::ToCanonical;
7use crate::accessor::ArrayAccessor;
8use crate::arrays::varbinview::VarBinViewArray;
9use crate::validity::Validity;
10use crate::vtable::ValidityHelper;
11
12impl ArrayAccessor<[u8]> for VarBinViewArray {
13 fn with_iterator<F: for<'a> FnOnce(&mut dyn Iterator<Item = Option<&'a [u8]>>) -> R, R>(
14 &self,
15 f: F,
16 ) -> R {
17 let bytes = (0..self.nbuffers())
18 .map(|i| self.buffer(i))
19 .collect::<Vec<_>>();
20
21 let views = self.views();
22
23 match self.validity() {
24 Validity::NonNullable | Validity::AllValid => {
25 let mut iter = views.iter().map(|view| {
26 if view.is_inlined() {
27 Some(view.as_inlined().value())
28 } else {
29 Some(
30 &bytes[view.as_view().buffer_index as usize][view.as_view().as_range()],
31 )
32 }
33 });
34 f(&mut iter)
35 }
36 Validity::AllInvalid => f(&mut iter::repeat_n(None, views.len())),
37 Validity::Array(v) => {
38 let validity = v.to_bool();
39 let mut iter = views
40 .iter()
41 .zip(validity.bit_buffer())
42 .map(|(view, valid)| {
43 if valid {
44 if view.is_inlined() {
45 Some(view.as_inlined().value())
46 } else {
47 Some(
48 &bytes[view.as_view().buffer_index as usize]
49 [view.as_view().as_range()],
50 )
51 }
52 } else {
53 None
54 }
55 });
56 f(&mut iter)
57 }
58 }
59 }
60}
61
62impl ArrayAccessor<[u8]> for &VarBinViewArray {
63 fn with_iterator<F, R>(&self, f: F) -> R
64 where
65 F: for<'a> FnOnce(&mut dyn Iterator<Item = Option<&'a [u8]>>) -> R,
66 {
67 <VarBinViewArray as ArrayAccessor<[u8]>>::with_iterator(*self, f)
68 }
69}