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