Skip to content

Commit d66a2bc

Browse files
refactor: simplify run boundary computation by removing unused types and functions
1 parent f848a0e commit d66a2bc

1 file changed

Lines changed: 18 additions & 113 deletions

File tree

arrow-cast/src/cast/run_array.rs

Lines changed: 18 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,12 @@
1818
use crate::cast::*;
1919
use arrow_array::cast::AsArray;
2020
use arrow_array::types::{
21-
ArrowDictionaryKeyType, ArrowPrimitiveType, Date32Type, Date64Type, Decimal128Type,
22-
Decimal256Type, DurationMicrosecondType, DurationMillisecondType, DurationNanosecondType,
23-
DurationSecondType, Float16Type, Float32Type, Float64Type, Int8Type, Int16Type, Int32Type,
24-
Int64Type, IntervalDayTimeType, IntervalMonthDayNanoType, IntervalYearMonthType,
25-
Time32MillisecondType, Time32SecondType, Time64MicrosecondType, Time64NanosecondType,
26-
TimestampMicrosecondType, TimestampMillisecondType, TimestampNanosecondType,
27-
TimestampSecondType, UInt8Type, UInt16Type, UInt32Type, UInt64Type,
21+
ArrowDictionaryKeyType, ArrowPrimitiveType, Int8Type, Int16Type, Int32Type, Int64Type,
22+
UInt8Type, UInt16Type, UInt32Type, UInt64Type,
2823
};
2924
use arrow_array::{
30-
Array, ArrayRef, BinaryViewArray, BooleanArray, DictionaryArray, FixedSizeBinaryArray,
31-
GenericBinaryArray, GenericStringArray, PrimitiveArray, StringViewArray,
25+
Array, ArrayRef, BooleanArray, DictionaryArray, FixedSizeBinaryArray, GenericBinaryArray,
26+
GenericStringArray, OffsetSizeTrait, PrimitiveArray, downcast_primitive_array,
3227
};
3328

3429
/// Attempts to cast a `RunArray` with index type K into
@@ -182,75 +177,17 @@ fn compute_run_boundaries(array: &ArrayRef) -> (Vec<usize>, Vec<usize>) {
182177
return (Vec::new(), Vec::new());
183178
}
184179

185-
use arrow_schema::{DataType::*, IntervalUnit, TimeUnit};
180+
use arrow_schema::DataType::*;
186181

187-
match array.data_type() {
182+
let array = array.as_ref();
183+
downcast_primitive_array! {
184+
array => runs_for_primitive(array),
188185
Null => (vec![array.len()], vec![0]),
189186
Boolean => runs_for_boolean(array.as_boolean()),
190-
Int8 => runs_for_primitive(array.as_primitive::<Int8Type>()),
191-
Int16 => runs_for_primitive(array.as_primitive::<Int16Type>()),
192-
Int32 => runs_for_primitive(array.as_primitive::<Int32Type>()),
193-
Int64 => runs_for_primitive(array.as_primitive::<Int64Type>()),
194-
UInt8 => runs_for_primitive(array.as_primitive::<UInt8Type>()),
195-
UInt16 => runs_for_primitive(array.as_primitive::<UInt16Type>()),
196-
UInt32 => runs_for_primitive(array.as_primitive::<UInt32Type>()),
197-
UInt64 => runs_for_primitive(array.as_primitive::<UInt64Type>()),
198-
Float16 => runs_for_primitive(array.as_primitive::<Float16Type>()),
199-
Float32 => runs_for_primitive(array.as_primitive::<Float32Type>()),
200-
Float64 => runs_for_primitive(array.as_primitive::<Float64Type>()),
201-
Date32 => runs_for_primitive(array.as_primitive::<Date32Type>()),
202-
Date64 => runs_for_primitive(array.as_primitive::<Date64Type>()),
203-
Time32(TimeUnit::Second) => runs_for_primitive(array.as_primitive::<Time32SecondType>()),
204-
Time32(TimeUnit::Millisecond) => {
205-
runs_for_primitive(array.as_primitive::<Time32MillisecondType>())
206-
}
207-
Time64(TimeUnit::Microsecond) => {
208-
runs_for_primitive(array.as_primitive::<Time64MicrosecondType>())
209-
}
210-
Time64(TimeUnit::Nanosecond) => {
211-
runs_for_primitive(array.as_primitive::<Time64NanosecondType>())
212-
}
213-
Duration(TimeUnit::Second) => {
214-
runs_for_primitive(array.as_primitive::<DurationSecondType>())
215-
}
216-
Duration(TimeUnit::Millisecond) => {
217-
runs_for_primitive(array.as_primitive::<DurationMillisecondType>())
218-
}
219-
Duration(TimeUnit::Microsecond) => {
220-
runs_for_primitive(array.as_primitive::<DurationMicrosecondType>())
221-
}
222-
Duration(TimeUnit::Nanosecond) => {
223-
runs_for_primitive(array.as_primitive::<DurationNanosecondType>())
224-
}
225-
Timestamp(TimeUnit::Second, _) => {
226-
runs_for_primitive(array.as_primitive::<TimestampSecondType>())
227-
}
228-
Timestamp(TimeUnit::Millisecond, _) => {
229-
runs_for_primitive(array.as_primitive::<TimestampMillisecondType>())
230-
}
231-
Timestamp(TimeUnit::Microsecond, _) => {
232-
runs_for_primitive(array.as_primitive::<TimestampMicrosecondType>())
233-
}
234-
Timestamp(TimeUnit::Nanosecond, _) => {
235-
runs_for_primitive(array.as_primitive::<TimestampNanosecondType>())
236-
}
237-
Interval(IntervalUnit::YearMonth) => {
238-
runs_for_primitive(array.as_primitive::<IntervalYearMonthType>())
239-
}
240-
Interval(IntervalUnit::DayTime) => {
241-
runs_for_primitive(array.as_primitive::<IntervalDayTimeType>())
242-
}
243-
Interval(IntervalUnit::MonthDayNano) => {
244-
runs_for_primitive(array.as_primitive::<IntervalMonthDayNanoType>())
245-
}
246-
Decimal128(_, _) => runs_for_primitive(array.as_primitive::<Decimal128Type>()),
247-
Decimal256(_, _) => runs_for_primitive(array.as_primitive::<Decimal256Type>()),
248-
Utf8 => runs_for_string_i32(array.as_string::<i32>()),
249-
LargeUtf8 => runs_for_string_i64(array.as_string::<i64>()),
250-
Utf8View => runs_for_string_view(array.as_string_view()),
251-
Binary => runs_for_binary_i32(array.as_binary::<i32>()),
252-
LargeBinary => runs_for_binary_i64(array.as_binary::<i64>()),
253-
BinaryView => runs_for_binary_view(array.as_binary_view()),
187+
Utf8 => runs_for_string(array.as_string::<i32>()),
188+
LargeUtf8 => runs_for_string(array.as_string::<i64>()),
189+
Binary => runs_for_binary(array.as_binary::<i32>()),
190+
LargeBinary => runs_for_binary(array.as_binary::<i64>()),
254191
FixedSizeBinary(_) => runs_for_fixed_size_binary(array.as_fixed_size_binary()),
255192
Dictionary(key_type, _) => match key_type.as_ref() {
256193
Int8 => runs_for_dictionary::<Int8Type>(array.as_dictionary()),
@@ -261,9 +198,9 @@ fn compute_run_boundaries(array: &ArrayRef) -> (Vec<usize>, Vec<usize>) {
261198
UInt16 => runs_for_dictionary::<UInt16Type>(array.as_dictionary()),
262199
UInt32 => runs_for_dictionary::<UInt32Type>(array.as_dictionary()),
263200
UInt64 => runs_for_dictionary::<UInt64Type>(array.as_dictionary()),
264-
_ => runs_generic(array.as_ref()),
201+
_ => runs_generic(array),
265202
},
266-
_ => runs_generic(array.as_ref()),
203+
_ => runs_generic(array),
267204
}
268205
}
269206

@@ -361,20 +298,8 @@ fn runs_for_primitive<T: ArrowPrimitiveType>(
361298
finalize_runs(run_boundaries, len)
362299
}
363300

364-
fn runs_for_binary_i32(array: &GenericBinaryArray<i32>) -> (Vec<usize>, Vec<usize>) {
365-
let mut to_usize = |v: i32| v as usize;
366-
runs_for_binary_like(
367-
array.len(),
368-
array.null_count(),
369-
array.value_offsets(),
370-
array.value_data(),
371-
|idx| array.is_valid(idx),
372-
&mut to_usize,
373-
)
374-
}
375-
376-
fn runs_for_binary_i64(array: &GenericBinaryArray<i64>) -> (Vec<usize>, Vec<usize>) {
377-
let mut to_usize = |v: i64| v as usize;
301+
fn runs_for_binary<O: OffsetSizeTrait>(array: &GenericBinaryArray<O>) -> (Vec<usize>, Vec<usize>) {
302+
let mut to_usize = |v: O| v.as_usize();
378303
runs_for_binary_like(
379304
array.len(),
380305
array.null_count(),
@@ -449,8 +374,8 @@ fn runs_for_binary_like<T: Copy>(
449374
finalize_runs(run_boundaries, len)
450375
}
451376

452-
fn runs_for_string_i32(array: &GenericStringArray<i32>) -> (Vec<usize>, Vec<usize>) {
453-
let mut to_usize = |v: i32| v as usize;
377+
fn runs_for_string<O: OffsetSizeTrait>(array: &GenericStringArray<O>) -> (Vec<usize>, Vec<usize>) {
378+
let mut to_usize = |v: O| v.as_usize();
454379
runs_for_binary_like(
455380
array.len(),
456381
array.null_count(),
@@ -461,26 +386,6 @@ fn runs_for_string_i32(array: &GenericStringArray<i32>) -> (Vec<usize>, Vec<usiz
461386
)
462387
}
463388

464-
fn runs_for_string_i64(array: &GenericStringArray<i64>) -> (Vec<usize>, Vec<usize>) {
465-
let mut to_usize = |v: i64| v as usize;
466-
runs_for_binary_like(
467-
array.len(),
468-
array.null_count(),
469-
array.value_offsets(),
470-
array.value_data(),
471-
|idx| array.is_valid(idx),
472-
&mut to_usize,
473-
)
474-
}
475-
476-
fn runs_for_string_view(array: &StringViewArray) -> (Vec<usize>, Vec<usize>) {
477-
runs_generic(array)
478-
}
479-
480-
fn runs_for_binary_view(array: &BinaryViewArray) -> (Vec<usize>, Vec<usize>) {
481-
runs_generic(array)
482-
}
483-
484389
fn runs_for_fixed_size_binary(array: &FixedSizeBinaryArray) -> (Vec<usize>, Vec<usize>) {
485390
let len = array.len();
486391
if let Some(runs) = trivial_runs(len) {

0 commit comments

Comments
 (0)