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;
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}