vortex_array/arrays/varbinview/
accessor.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}