vortex_compute/take/vector/
binaryview.rs1use num_traits::AsPrimitive;
12use vortex_buffer::Buffer;
13use vortex_dtype::UnsignedPType;
14use vortex_vector::VectorOps;
15use vortex_vector::binaryview::BinaryView;
16use vortex_vector::binaryview::BinaryViewType;
17use vortex_vector::binaryview::BinaryViewVector;
18use vortex_vector::primitive::PVector;
19
20use crate::take::Take;
21
22impl<T: BinaryViewType, I: UnsignedPType> Take<PVector<I>> for &BinaryViewVector<T> {
23 type Output = BinaryViewVector<T>;
24
25 fn take(self, indices: &PVector<I>) -> BinaryViewVector<T> {
26 if indices.validity().all_true() {
27 self.take(indices.elements().as_slice())
28 } else {
29 take_nullable(self, indices)
30 }
31 }
32}
33
34impl<T: BinaryViewType, I: UnsignedPType> Take<[I]> for &BinaryViewVector<T> {
35 type Output = BinaryViewVector<T>;
36
37 fn take(self, indices: &[I]) -> BinaryViewVector<T> {
38 let taken_views = take_views(self.views(), indices);
39 let taken_validity = self.validity().take(indices);
40
41 debug_assert_eq!(taken_views.len(), taken_validity.len());
42
43 unsafe {
47 BinaryViewVector::new_unchecked(taken_views, self.buffers().clone(), taken_validity)
48 }
49 }
50}
51
52fn take_nullable<T: BinaryViewType, I: UnsignedPType>(
53 binary_view: &BinaryViewVector<T>,
54 indices: &PVector<I>,
55) -> BinaryViewVector<T> {
56 let taken_views = take_views(binary_view.views(), indices.elements().as_slice());
59
60 let taken_validity = binary_view.validity().take(indices);
62
63 debug_assert_eq!(taken_views.len(), taken_validity.len());
64
65 unsafe {
69 BinaryViewVector::new_unchecked(taken_views, binary_view.buffers().clone(), taken_validity)
70 }
71}
72
73fn take_views<I: AsPrimitive<usize>>(
75 views: &Buffer<BinaryView>,
76 indices: &[I],
77) -> Buffer<BinaryView> {
78 Buffer::<BinaryView>::from_trusted_len_iter(indices.iter().map(|i| views[i.as_()]))
79}