Skip to content

Commit 83c466d

Browse files
committed
Use Columnar lengths in VarBin takes
Signed-off-by: Daniel King <dan@spiraldb.com>
1 parent fcbee26 commit 83c466d

2 files changed

Lines changed: 39 additions & 17 deletions

File tree

vortex-array/src/arrays/varbin/compute/take.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,23 @@ use vortex_buffer::BufferMut;
77
use vortex_buffer::ByteBufferMut;
88
use vortex_error::VortexExpect;
99
use vortex_error::VortexResult;
10+
use vortex_error::vortex_bail;
1011
use vortex_error::vortex_ensure;
1112
use vortex_error::vortex_err;
1213
use vortex_error::vortex_panic;
1314
use vortex_mask::Mask;
1415

1516
use crate::ArrayRef;
17+
use crate::Canonical;
18+
use crate::Columnar;
1619
use crate::IntoArray;
1720
use crate::array::ArrayView;
1821
use crate::arrays::PiecewiseSequence;
1922
use crate::arrays::PrimitiveArray;
2023
use crate::arrays::VarBin;
2124
use crate::arrays::VarBinArray;
2225
use crate::arrays::dict::TakeExecute;
23-
use crate::arrays::piecewise_sequence::ConstantOrArray;
26+
use crate::arrays::piecewise_sequence::constant_unsigned_usize;
2427
use crate::arrays::piecewise_sequence::maybe_contiguous_slices;
2528
use crate::arrays::primitive::PrimitiveArrayExt;
2629
use crate::arrays::varbin::VarBinArrayExt;
@@ -143,23 +146,32 @@ fn take_contiguous_ranges(
143146
let dtype = array.dtype().clone();
144147
let output_len = indices_ref.len();
145148

146-
let result = match &lengths {
147-
ConstantOrArray::Constant(length) => gather_slices_constant_dispatch(
148-
&starts,
149-
*length,
150-
&offsets,
151-
data,
152-
output_len,
153-
out_offset_ptype,
154-
)?,
155-
ConstantOrArray::Array(lengths) => gather_slices_dispatch(
149+
let result = match lengths {
150+
Columnar::Constant(lengths) => {
151+
let length = constant_unsigned_usize(&lengths)?;
152+
gather_slices_constant_dispatch(
153+
&starts,
154+
length,
155+
&offsets,
156+
data,
157+
output_len,
158+
out_offset_ptype,
159+
)?
160+
}
161+
Columnar::Canonical(Canonical::Primitive(lengths)) => gather_slices_dispatch(
156162
&starts,
157-
lengths,
163+
&lengths,
158164
&offsets,
159165
data,
160166
output_len,
161167
out_offset_ptype,
162168
)?,
169+
Columnar::Canonical(lengths) => {
170+
vortex_bail!(
171+
"PiecewiseSequenceArray lengths must be primitive or constant, got {}",
172+
lengths.dtype()
173+
)
174+
}
163175
};
164176

165177
let validity = array.validity()?.take(indices_ref)?;

vortex-array/src/arrays/varbinview/compute/take.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,23 @@ use num_traits::AsPrimitive;
99
use vortex_buffer::Buffer;
1010
use vortex_buffer::BufferMut;
1111
use vortex_error::VortexResult;
12+
use vortex_error::vortex_bail;
1213
use vortex_error::vortex_ensure;
1314
use vortex_error::vortex_err;
1415
use vortex_mask::AllOr;
1516
use vortex_mask::Mask;
1617

1718
use crate::ArrayRef;
19+
use crate::Canonical;
20+
use crate::Columnar;
1821
use crate::IntoArray;
1922
use crate::array::ArrayView;
2023
use crate::arrays::PiecewiseSequence;
2124
use crate::arrays::PrimitiveArray;
2225
use crate::arrays::VarBinView;
2326
use crate::arrays::VarBinViewArray;
2427
use crate::arrays::dict::TakeExecute;
25-
use crate::arrays::piecewise_sequence::ConstantOrArray;
28+
use crate::arrays::piecewise_sequence::constant_unsigned_usize;
2629
use crate::arrays::piecewise_sequence::maybe_contiguous_slices;
2730
use crate::arrays::varbinview::BinaryView;
2831
use crate::buffer::BufferHandle;
@@ -83,18 +86,19 @@ fn take_contiguous_ranges(
8386
};
8487
let source = array.views();
8588
let output_len = indices_ref.len();
86-
let views = match &lengths {
87-
ConstantOrArray::Constant(length) => {
89+
let views = match lengths {
90+
Columnar::Constant(lengths) => {
91+
let length = constant_unsigned_usize(&lengths)?;
8892
match_each_unsigned_integer_ptype!(starts.ptype(), |S| {
8993
gather_view_slices_constant_length(
9094
source,
9195
starts.as_slice::<S>(),
92-
*length,
96+
length,
9397
output_len,
9498
)?
9599
})
96100
}
97-
ConstantOrArray::Array(lengths) => {
101+
Columnar::Canonical(Canonical::Primitive(lengths)) => {
98102
match_each_unsigned_integer_ptype!(starts.ptype(), |S| {
99103
match_each_unsigned_integer_ptype!(lengths.ptype(), |L| {
100104
gather_view_slices(
@@ -106,6 +110,12 @@ fn take_contiguous_ranges(
106110
})
107111
})
108112
}
113+
Columnar::Canonical(lengths) => {
114+
vortex_bail!(
115+
"PiecewiseSequenceArray lengths must be primitive or constant, got {}",
116+
lengths.dtype()
117+
)
118+
}
109119
};
110120
let validity = array.validity()?.take(indices_ref)?;
111121

0 commit comments

Comments
 (0)