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