@@ -180,6 +180,7 @@ impl<T: ArrowPrimitiveType, const NULLABLE: bool> GroupColumn
180
180
all_non_null : bool ,
181
181
) {
182
182
let arr = array. as_primitive :: < T > ( ) ;
183
+
183
184
match ( NULLABLE , all_non_null) {
184
185
( true , true ) => {
185
186
self . nulls . append_n ( rows. len ( ) , false ) ;
@@ -280,7 +281,7 @@ where
280
281
}
281
282
}
282
283
283
- fn append_batch_inner < B > (
284
+ fn vectorized_append_inner < B > (
284
285
& mut self ,
285
286
array : & ArrayRef ,
286
287
rows : & [ usize ] ,
@@ -293,7 +294,7 @@ where
293
294
if all_non_null {
294
295
self . nulls . append_n ( rows. len ( ) , false ) ;
295
296
for & row in rows {
296
- self . append_value ( arr, row) ;
297
+ self . do_append_val_inner ( arr, row) ;
297
298
}
298
299
} else {
299
300
for & row in rows {
@@ -304,7 +305,7 @@ where
304
305
self . offsets . push ( O :: usize_as ( offset) ) ;
305
306
} else {
306
307
self . nulls . append ( false ) ;
307
- self . append_value ( arr, row) ;
308
+ self . do_append_val_inner ( arr, row) ;
308
309
}
309
310
}
310
311
}
@@ -322,11 +323,11 @@ where
322
323
self . offsets . push ( O :: usize_as ( offset) ) ;
323
324
} else {
324
325
self . nulls . append ( false ) ;
325
- self . append_value ( arr, row) ;
326
+ self . do_append_val_inner ( arr, row) ;
326
327
}
327
328
}
328
329
329
- fn append_value < B > ( & mut self , array : & GenericByteArray < B > , row : usize )
330
+ fn do_append_val_inner < B > ( & mut self , array : & GenericByteArray < B > , row : usize )
330
331
where
331
332
B : ByteArrayType ,
332
333
{
@@ -340,6 +341,40 @@ where
340
341
B : ByteArrayType ,
341
342
{
342
343
let array = array. as_bytes :: < B > ( ) ;
344
+ self . do_equal_to_inner ( lhs_row, array, rhs_row)
345
+ }
346
+
347
+ fn vectorized_equal_to_inner < B > (
348
+ & self ,
349
+ group_indices : & [ usize ] ,
350
+ array : & ArrayRef ,
351
+ rows : & [ usize ] ,
352
+ equal_to_results : & mut [ bool ] ,
353
+ ) where
354
+ B : ByteArrayType ,
355
+ {
356
+ let array = array. as_bytes :: < B > ( ) ;
357
+
358
+ for ( idx, & lhs_row) in group_indices. iter ( ) . enumerate ( ) {
359
+ // Has found not equal to, don't need to check
360
+ if !equal_to_results[ idx] {
361
+ continue ;
362
+ }
363
+
364
+ let rhs_row = rows[ idx] ;
365
+ equal_to_results[ idx] = self . do_equal_to_inner ( lhs_row, array, rhs_row) ;
366
+ }
367
+ }
368
+
369
+ fn do_equal_to_inner < B > (
370
+ & self ,
371
+ lhs_row : usize ,
372
+ array : & GenericByteArray < B > ,
373
+ rhs_row : usize ,
374
+ ) -> bool
375
+ where
376
+ B : ByteArrayType ,
377
+ {
343
378
let exist_null = self . nulls . is_null ( lhs_row) ;
344
379
let input_null = array. is_null ( rhs_row) ;
345
380
if let Some ( result) = nulls_equal_to ( exist_null, input_null) {
@@ -411,7 +446,34 @@ where
411
446
rows : & [ usize ] ,
412
447
equal_to_results : & mut [ bool ] ,
413
448
) {
414
- todo ! ( )
449
+ // Sanity array type
450
+ match self . output_type {
451
+ OutputType :: Binary => {
452
+ debug_assert ! ( matches!(
453
+ array. data_type( ) ,
454
+ DataType :: Binary | DataType :: LargeBinary
455
+ ) ) ;
456
+ self . vectorized_equal_to_inner :: < GenericBinaryType < O > > (
457
+ group_indices,
458
+ array,
459
+ rows,
460
+ equal_to_results,
461
+ ) ;
462
+ }
463
+ OutputType :: Utf8 => {
464
+ debug_assert ! ( matches!(
465
+ array. data_type( ) ,
466
+ DataType :: Utf8 | DataType :: LargeUtf8
467
+ ) ) ;
468
+ self . vectorized_equal_to_inner :: < GenericStringType < O > > (
469
+ group_indices,
470
+ array,
471
+ rows,
472
+ equal_to_results,
473
+ ) ;
474
+ }
475
+ _ => unreachable ! ( "View types should use `ArrowBytesViewMap`" ) ,
476
+ }
415
477
}
416
478
417
479
fn vectorized_append (
@@ -426,7 +488,7 @@ where
426
488
column. data_type( ) ,
427
489
DataType :: Binary | DataType :: LargeBinary
428
490
) ) ;
429
- self . append_batch_inner :: < GenericBinaryType < O > > (
491
+ self . vectorized_append_inner :: < GenericBinaryType < O > > (
430
492
column,
431
493
rows,
432
494
all_non_null,
@@ -437,7 +499,7 @@ where
437
499
column. data_type( ) ,
438
500
DataType :: Utf8 | DataType :: LargeUtf8
439
501
) ) ;
440
- self . append_batch_inner :: < GenericStringType < O > > (
502
+ self . vectorized_append_inner :: < GenericStringType < O > > (
441
503
column,
442
504
rows,
443
505
all_non_null,
@@ -606,7 +668,7 @@ impl<B: ByteViewType> ByteViewGroupValueBuilder<B> {
606
668
self
607
669
}
608
670
609
- fn append_batch_inner (
671
+ fn vectorized_append_inner (
610
672
& mut self ,
611
673
array : & ArrayRef ,
612
674
rows : & [ usize ] ,
@@ -693,6 +755,26 @@ impl<B: ByteViewType> ByteViewGroupValueBuilder<B> {
693
755
self . do_equal_to_inner ( lhs_row, array, rhs_row)
694
756
}
695
757
758
+ fn vectorized_equal_to_inner (
759
+ & self ,
760
+ group_indices : & [ usize ] ,
761
+ array : & ArrayRef ,
762
+ rows : & [ usize ] ,
763
+ equal_to_results : & mut [ bool ] ,
764
+ ) {
765
+ let array = array. as_byte_view :: < B > ( ) ;
766
+
767
+ for ( idx, & lhs_row) in group_indices. iter ( ) . enumerate ( ) {
768
+ // Has found not equal to, don't need to check
769
+ if !equal_to_results[ idx] {
770
+ continue ;
771
+ }
772
+
773
+ let rhs_row = rows[ idx] ;
774
+ equal_to_results[ idx] = self . do_equal_to_inner ( lhs_row, array, rhs_row) ;
775
+ }
776
+ }
777
+
696
778
fn do_equal_to_inner (
697
779
& self ,
698
780
lhs_row : usize ,
@@ -992,7 +1074,7 @@ impl<B: ByteViewType> GroupColumn for ByteViewGroupValueBuilder<B> {
992
1074
rows : & [ usize ] ,
993
1075
all_non_null : bool ,
994
1076
) {
995
- self . append_batch_inner ( array, rows, all_non_null) ;
1077
+ self . vectorized_append_inner ( array, rows, all_non_null) ;
996
1078
}
997
1079
998
1080
fn len ( & self ) -> usize {
0 commit comments