@@ -408,3 +408,86 @@ where
408
408
Ok ( ( ) )
409
409
}
410
410
}
411
+
412
+ #[ cfg( test) ]
413
+ mod tests {
414
+ use std:: collections:: { BTreeMap , HashMap } ;
415
+ use std:: sync:: Arc ;
416
+
417
+ use crate :: aggregates:: group_values:: single_group_by:: primitive:: GroupValuesPrimitive ;
418
+ use crate :: aggregates:: group_values:: GroupValues ;
419
+ use arrow:: array:: { ArrayRef , AsArray , Int64Array , NullBufferBuilder , UInt32Array } ;
420
+ use arrow:: datatypes:: { DataType , Int64Type , UInt32Type } ;
421
+ use datafusion_expr:: EmitTo ;
422
+
423
+ #[ test]
424
+ fn test_flat_primitive_group_values ( ) {
425
+ // Will cover such insert cases:
426
+ // 1.1 Non-null row + distinct
427
+ // 1.2 Null row + distinct
428
+ // 1.3 Non-null row + non-distinct
429
+ // 1.4 Null row + non-distinct
430
+ //
431
+ // Will cover such emit cases:
432
+ // 2.1 Emit first n
433
+ // 2.2 Emit all
434
+ // 2.3 Insert again + emit
435
+ let mut group_values = GroupValuesPrimitive :: < UInt32Type > :: new ( DataType :: UInt32 ) ;
436
+ let mut group_indices = vec ! [ ] ;
437
+
438
+ let data1 = Arc :: new ( UInt32Array :: from ( vec ! [
439
+ Some ( 1 ) ,
440
+ None ,
441
+ Some ( 1 ) ,
442
+ None ,
443
+ Some ( 2 ) ,
444
+ Some ( 3 ) ,
445
+ ] ) ) ;
446
+ let data2 = Arc :: new ( UInt32Array :: from ( vec ! [ Some ( 3 ) , None , Some ( 4 ) , Some ( 5 ) ] ) ) ;
447
+
448
+ // Insert case 1.1, 1.3, 1.4 + Emit case 2.1
449
+ group_values
450
+ . intern ( & vec ! [ data1. clone( ) as _] , & mut group_indices)
451
+ . unwrap ( ) ;
452
+
453
+ let mut expected = BTreeMap :: new ( ) ;
454
+ for ( & group_index, value) in group_indices. iter ( ) . zip ( data1. iter ( ) ) {
455
+ expected. insert ( group_index, value) ;
456
+ }
457
+
458
+ let emit_result = group_values. emit ( EmitTo :: First ( 3 ) ) . unwrap ( ) ;
459
+ for ( group_idx, actual_val) in emit_result[ 0 ]
460
+ . as_primitive :: < UInt32Type > ( )
461
+ . iter ( )
462
+ . enumerate ( )
463
+ {
464
+ assert ! ( group_idx < expected. len( ) - 1 ) ;
465
+ let expected_val = * expected. get ( & group_idx) . unwrap ( ) ;
466
+ assert_eq ! ( actual_val, expected_val) ;
467
+ }
468
+
469
+ // Insert case 1.1~1.3 + Emit case 2.2~2.3
470
+ group_values
471
+ . intern ( & vec ! [ data2. clone( ) as _] , & mut group_indices)
472
+ . unwrap ( ) ;
473
+
474
+ let ( _, remain_val) = expected. pop_last ( ) . unwrap ( ) ;
475
+ let mut expected = BTreeMap :: new ( ) ;
476
+ for ( & group_index, value) in group_indices. iter ( ) . zip ( data2. iter ( ) ) {
477
+ if group_index == 0 {
478
+ assert_eq ! ( remain_val, value) ;
479
+ }
480
+ expected. insert ( group_index, value) ;
481
+ }
482
+
483
+ let emit_result = group_values. emit ( EmitTo :: All ) . unwrap ( ) ;
484
+ for ( group_idx, actual_val) in emit_result[ 0 ]
485
+ . as_primitive :: < UInt32Type > ( )
486
+ . iter ( )
487
+ . enumerate ( )
488
+ {
489
+ let expected_val = * expected. get ( & group_idx) . unwrap ( ) ;
490
+ assert_eq ! ( actual_val, expected_val) ;
491
+ }
492
+ }
493
+ }
0 commit comments