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