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