|
1 | 1 | mod invert; |
2 | 2 |
|
| 3 | +use arrow_buffer::BooleanBuffer; |
3 | 4 | use vortex_array::array::BoolArray; |
4 | 5 | use vortex_array::compute::{slice, ComputeVTable, InvertFn, ScalarAtFn, SliceFn, TakeFn}; |
5 | 6 | use vortex_array::variants::PrimitiveArrayTrait; |
6 | | -use vortex_array::{ArrayDType, ArrayData, ArrayLen, IntoArrayData, IntoArrayVariant, ToArrayData}; |
| 7 | +use vortex_array::{ArrayDType, ArrayData, ArrayLen, IntoArrayData, IntoArrayVariant}; |
7 | 8 | use vortex_dtype::match_each_integer_ptype; |
8 | 9 | use vortex_error::{vortex_bail, VortexResult}; |
9 | 10 | use vortex_scalar::Scalar; |
@@ -53,10 +54,15 @@ impl TakeFn<RunEndBoolArray> for RunEndBoolEncoding { |
53 | 54 | .collect::<VortexResult<Vec<_>>>()? |
54 | 55 | }); |
55 | 56 | let start = array.start(); |
56 | | - Ok( |
57 | | - BoolArray::from_iter(physical_indices.iter().map(|&it| value_at_index(it, start))) |
58 | | - .to_array(), |
| 57 | + BoolArray::try_new( |
| 58 | + BooleanBuffer::from_iter( |
| 59 | + physical_indices |
| 60 | + .into_iter() |
| 61 | + .map(|it| value_at_index(it, start)), |
| 62 | + ), |
| 63 | + array.validity().take(indices)?, |
59 | 64 | ) |
| 65 | + .map(|a| a.into_array()) |
60 | 66 | } |
61 | 67 | } |
62 | 68 |
|
@@ -90,9 +96,11 @@ impl SliceFn<RunEndBoolArray> for RunEndBoolEncoding { |
90 | 96 |
|
91 | 97 | #[cfg(test)] |
92 | 98 | mod tests { |
93 | | - use vortex_array::compute::{scalar_at, slice}; |
| 99 | + use arrow_buffer::BooleanBuffer; |
| 100 | + use vortex_array::array::PrimitiveArray; |
| 101 | + use vortex_array::compute::{scalar_at, slice, take}; |
94 | 102 | use vortex_array::validity::Validity; |
95 | | - use vortex_array::{ArrayLen, IntoArrayData}; |
| 103 | + use vortex_array::{ArrayDType, ArrayLen, IntoArrayData, IntoArrayVariant}; |
96 | 104 | use vortex_dtype::Nullability; |
97 | 105 | use vortex_scalar::Scalar; |
98 | 106 |
|
@@ -124,4 +132,24 @@ mod tests { |
124 | 132 | Scalar::bool(false, Nullability::Nullable) |
125 | 133 | ); |
126 | 134 | } |
| 135 | + |
| 136 | + #[test] |
| 137 | + fn take_nullable() { |
| 138 | + let re_array = RunEndBoolArray::try_new( |
| 139 | + vec![7_u64, 10].into_array(), |
| 140 | + false, |
| 141 | + Validity::from(BooleanBuffer::from(vec![ |
| 142 | + false, false, true, true, true, true, true, true, false, false, |
| 143 | + ])), |
| 144 | + ) |
| 145 | + .unwrap(); |
| 146 | + |
| 147 | + let taken = take(&re_array, PrimitiveArray::from(vec![6, 9])).unwrap(); |
| 148 | + let taken_bool = taken.into_bool().unwrap(); |
| 149 | + assert_eq!(taken_bool.dtype(), re_array.dtype()); |
| 150 | + assert_eq!( |
| 151 | + taken_bool.boolean_buffer(), |
| 152 | + BooleanBuffer::from(vec![false, true]) |
| 153 | + ); |
| 154 | + } |
127 | 155 | } |
0 commit comments