@@ -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+
261281fn 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
270286fn 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
281294fn 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
290300fn 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
299306fn 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
308311fn 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
317316fn 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
326322fn 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-
371346fn 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