Skip to main content

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