Skip to content

Commit a6198b8

Browse files
committed
refactor: replace build_runs_with_nulls with runs_using_eq macro for run computations
1 parent 3a4be19 commit a6198b8

File tree

1 file changed

+38
-63
lines changed

1 file changed

+38
-63
lines changed

arrow-cast/src/cast/run_array.rs

Lines changed: 38 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -258,69 +258,65 @@ fn runs_for_null(len: usize) -> (Vec<usize>, Vec<usize>) {
258258
(vec![len], vec![0])
259259
}
260260

261+
macro_rules! runs_using_eq {
262+
($array:expr, $equal:expr) => {{
263+
let array = $array;
264+
let has_nulls = array.null_count() > 0;
265+
build_runs(array.len(), |lhs, rhs| {
266+
if has_nulls {
267+
let lhs_valid = array.is_valid(lhs);
268+
let rhs_valid = array.is_valid(rhs);
269+
if lhs_valid && rhs_valid {
270+
($equal)(&array, lhs, rhs)
271+
} else {
272+
lhs_valid == rhs_valid
273+
}
274+
} else {
275+
($equal)(&array, lhs, rhs)
276+
}
277+
})
278+
}};
279+
}
280+
261281
fn runs_for_boolean(array: &BooleanArray) -> (Vec<usize>, Vec<usize>) {
262-
build_runs_with_nulls(
263-
array.len(),
264-
array.null_count() > 0,
265-
|idx| array.is_valid(idx),
266-
|idx| array.value(idx),
267-
)
282+
runs_using_eq!(array, |array: &BooleanArray, lhs, rhs| array.value(lhs)
283+
== array.value(rhs))
268284
}
269285

270286
fn runs_for_primitive<T: ArrowPrimitiveType>(
271287
array: &PrimitiveArray<T>,
272288
) -> (Vec<usize>, Vec<usize>) {
273-
build_runs_with_nulls(
274-
array.len(),
275-
array.null_count() > 0,
276-
|idx| array.is_valid(idx),
277-
|idx| array.value(idx),
278-
)
289+
runs_using_eq!(array, |array: &PrimitiveArray<T>, lhs, rhs| array
290+
.value(lhs)
291+
== array.value(rhs))
279292
}
280293

281294
fn runs_for_binary<O: OffsetSizeTrait>(array: &GenericBinaryArray<O>) -> (Vec<usize>, Vec<usize>) {
282-
build_runs_with_nulls(
283-
array.len(),
284-
array.null_count() > 0,
285-
|idx| array.is_valid(idx),
286-
|idx| array.value(idx),
287-
)
295+
runs_using_eq!(array, |array: &GenericBinaryArray<O>, lhs, rhs| array
296+
.value(lhs)
297+
== array.value(rhs))
288298
}
289299

290300
fn runs_for_string<O: OffsetSizeTrait>(array: &GenericStringArray<O>) -> (Vec<usize>, Vec<usize>) {
291-
build_runs_with_nulls(
292-
array.len(),
293-
array.null_count() > 0,
294-
|idx| array.is_valid(idx),
295-
|idx| array.value(idx),
296-
)
301+
runs_using_eq!(array, |array: &GenericStringArray<O>, lhs, rhs| array
302+
.value(lhs)
303+
== array.value(rhs))
297304
}
298305

299306
fn runs_for_binary_view(array: &BinaryViewArray) -> (Vec<usize>, Vec<usize>) {
300-
build_runs_with_nulls(
301-
array.len(),
302-
array.null_count() > 0,
303-
|idx| array.is_valid(idx),
304-
|idx| array.value(idx),
305-
)
307+
runs_using_eq!(array, |array: &BinaryViewArray, lhs, rhs| array.value(lhs)
308+
== array.value(rhs))
306309
}
307310

308311
fn runs_for_string_view(array: &StringViewArray) -> (Vec<usize>, Vec<usize>) {
309-
build_runs_with_nulls(
310-
array.len(),
311-
array.null_count() > 0,
312-
|idx| array.is_valid(idx),
313-
|idx| array.value(idx),
314-
)
312+
runs_using_eq!(array, |array: &StringViewArray, lhs, rhs| array.value(lhs)
313+
== array.value(rhs))
315314
}
316315

317316
fn runs_for_fixed_size_binary(array: &FixedSizeBinaryArray) -> (Vec<usize>, Vec<usize>) {
318-
build_runs_with_nulls(
319-
array.len(),
320-
array.null_count() > 0,
321-
|idx| array.is_valid(idx),
322-
|idx| array.value(idx),
323-
)
317+
runs_using_eq!(array, |array: &FixedSizeBinaryArray, lhs, rhs| array
318+
.value(lhs)
319+
== array.value(rhs))
324320
}
325321

326322
fn runs_for_dictionary<K: ArrowDictionaryKeyType>(
@@ -347,27 +343,6 @@ fn build_runs(len: usize, mut equal: impl FnMut(usize, usize) -> bool) -> (Vec<u
347343
(run_ends, values_indexes)
348344
}
349345

350-
fn build_runs_with_nulls<T: PartialEq>(
351-
len: usize,
352-
has_nulls: bool,
353-
mut is_valid: impl FnMut(usize) -> bool,
354-
mut value_at: impl FnMut(usize) -> T,
355-
) -> (Vec<usize>, Vec<usize>) {
356-
build_runs(len, |lhs, rhs| {
357-
if has_nulls {
358-
let lhs_valid = is_valid(lhs);
359-
let rhs_valid = is_valid(rhs);
360-
if lhs_valid && rhs_valid {
361-
value_at(lhs) == value_at(rhs)
362-
} else {
363-
lhs_valid == rhs_valid
364-
}
365-
} else {
366-
value_at(lhs) == value_at(rhs)
367-
}
368-
})
369-
}
370-
371346
fn runs_generic(array: &ArrayRef) -> (Vec<usize>, Vec<usize>) {
372347
let mut run_ends = Vec::new();
373348
let mut values_indexes = vec![0usize];

0 commit comments

Comments
 (0)