vortex_array/arrays/varbinview/
accessor.rs

1use std::iter;
2
3use vortex_error::VortexResult;
4
5use crate::ToCanonical;
6use crate::accessor::ArrayAccessor;
7use crate::arrays::varbinview::VarBinViewArray;
8use crate::validity::Validity;
9use crate::vtable::ValidityHelper;
10
11impl ArrayAccessor<[u8]> for VarBinViewArray {
12    fn with_iterator<F: for<'a> FnOnce(&mut dyn Iterator<Item = Option<&'a [u8]>>) -> R, R>(
13        &self,
14        f: F,
15    ) -> VortexResult<R> {
16        let bytes = (0..self.nbuffers())
17            .map(|i| self.buffer(i))
18            .collect::<Vec<_>>();
19
20        let views = self.views();
21
22        match self.validity() {
23            Validity::NonNullable | Validity::AllValid => {
24                let mut iter = views.iter().map(|view| {
25                    if view.is_inlined() {
26                        Some(view.as_inlined().value())
27                    } else {
28                        Some(
29                            &bytes[view.as_view().buffer_index() as usize]
30                                [view.as_view().to_range()],
31                        )
32                    }
33                });
34                Ok(f(&mut iter))
35            }
36            Validity::AllInvalid => Ok(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.boolean_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().to_range()],
50                                )
51                            }
52                        } else {
53                            None
54                        }
55                    });
56                Ok(f(&mut iter))
57            }
58        }
59    }
60}