@@ -956,12 +956,13 @@ mod test {
956956 } )
957957 . collect ( ) ;
958958
959+ // Test flat style
959960 Fixture {
960961 group_indices,
961962 values,
962963 values_with_nulls,
963964 filter,
964- block_size : None ,
965+ block_size : 3 ,
965966 }
966967 . run ( )
967968 }
@@ -989,8 +990,8 @@ mod test {
989990 /// filter (defaults to None)
990991 filter : BooleanArray ,
991992
992- ///
993- block_size : Option < usize > ,
993+ /// block size for testing [`BlockedNullState`]
994+ block_size : usize ,
994995 }
995996
996997 impl Fixture {
@@ -1007,6 +1008,9 @@ mod test {
10071008
10081009 let values: Vec < u32 > = ( 0 ..num_values) . map ( |_| rng. gen ( ) ) . collect ( ) ;
10091010
1011+ // random block size
1012+ let block_size = rng. gen_range ( 1 ..num_groups) ;
1013+
10101014 // 10% chance of false
10111015 // 10% change of null
10121016 // 80% chance of true
@@ -1042,7 +1046,7 @@ mod test {
10421046 values,
10431047 values_with_nulls,
10441048 filter,
1045- block_size : None ,
1049+ block_size,
10461050 }
10471051 }
10481052
@@ -1111,17 +1115,27 @@ mod test {
11111115 values : & UInt32Array ,
11121116 opt_filter : Option < & BooleanArray > ,
11131117 total_num_groups : usize ,
1114- block_size : Option < usize > ,
1118+ block_size : usize ,
11151119 ) {
1120+ // Test `accumulate` of `FlatNullState`
11161121 Self :: accumulate_values_test (
11171122 group_indices,
11181123 values,
11191124 opt_filter,
11201125 total_num_groups,
1121- block_size ,
1126+ None ,
11221127 ) ;
1123- Self :: accumulate_indices_test ( group_indices, values. nulls ( ) , opt_filter) ;
11241128
1129+ // Test `accumulate` of `BlockedNullState`
1130+ Self :: accumulate_values_test (
1131+ group_indices,
1132+ values,
1133+ opt_filter,
1134+ total_num_groups,
1135+ Some ( block_size) ,
1136+ ) ;
1137+
1138+ // Test `accumulate_boolean` of `FlatNullState`
11251139 // Convert values into a boolean array (anything above the
11261140 // average is true, otherwise false)
11271141 let avg: usize = values. iter ( ) . filter_map ( |v| v. map ( |v| v as usize ) ) . sum ( ) ;
@@ -1132,7 +1146,20 @@ mod test {
11321146 & boolean_values,
11331147 opt_filter,
11341148 total_num_groups,
1149+ None ,
11351150 ) ;
1151+
1152+ // Test `accumulate_boolean` of `BlockedNullState`
1153+ Self :: accumulate_boolean_test (
1154+ group_indices,
1155+ & boolean_values,
1156+ opt_filter,
1157+ total_num_groups,
1158+ Some ( block_size) ,
1159+ ) ;
1160+
1161+ // Test `accumulate_indices`
1162+ Self :: accumulate_indices_test ( group_indices, values. nulls ( ) , opt_filter) ;
11361163 }
11371164
11381165 /// This is effectively a different implementation of
@@ -1285,17 +1312,44 @@ mod test {
12851312 values : & BooleanArray ,
12861313 opt_filter : Option < & BooleanArray > ,
12871314 total_num_groups : usize ,
1315+ block_size : Option < usize > ,
12881316 ) {
12891317 let mut accumulated_values = vec ! [ ] ;
1290- let mut null_state = FlatNullState :: new ( ) ;
1318+ let ( mut null_state, block_size, acc_group_indices) = if let Some ( blk_size) =
1319+ block_size
1320+ {
1321+ let acc_group_indices = group_indices
1322+ . iter ( )
1323+ . copied ( )
1324+ . map ( |index| {
1325+ let block_id = ( index / blk_size) as u32 ;
1326+ let block_offset = ( index % blk_size) as u64 ;
1327+ BlockedGroupIndexOperations :: pack_index ( block_id, block_offset)
1328+ as usize
1329+ } )
1330+ . collect :: < Vec < _ > > ( ) ;
1331+ (
1332+ NullStateAdapter :: new ( Some ( blk_size) ) ,
1333+ blk_size,
1334+ acc_group_indices,
1335+ )
1336+ } else {
1337+ (
1338+ NullStateAdapter :: new ( None ) ,
1339+ 0 ,
1340+ group_indices. iter ( ) . copied ( ) . collect ( ) ,
1341+ )
1342+ } ;
12911343
12921344 null_state. accumulate_boolean (
1293- group_indices ,
1345+ & acc_group_indices ,
12941346 values,
12951347 opt_filter,
12961348 total_num_groups,
1297- |_, group_index, value| {
1298- accumulated_values. push ( ( group_index as usize , value) ) ;
1349+ |block_id, block_offset, value| {
1350+ let flatten_index =
1351+ ( ( block_id as u64 * block_size as u64 ) + block_offset) as usize ;
1352+ accumulated_values. push ( ( flatten_index as usize , value) ) ;
12991353 } ,
13001354 ) ;
13011355
@@ -1332,13 +1386,13 @@ mod test {
13321386 assert_eq ! ( accumulated_values, expected_values,
13331387 "\n \n accumulated_values:{accumulated_values:#?}\n \n expected_values:{expected_values:#?}" ) ;
13341388
1335- let seen_values = null_state. seen_values . builder . finish_cloned ( ) ;
1389+ let seen_values = null_state. build_cloned_seen_values ( ) ;
13361390 mock. validate_seen_values ( & seen_values) ;
13371391
13381392 // Validate the final buffer (one value per group)
13391393 let expected_null_buffer = mock. expected_null_buffer ( total_num_groups) ;
13401394
1341- let null_buffer = null_state. build ( EmitTo :: All ) ;
1395+ let null_buffer = null_state. build_all_in_once ( ) ;
13421396
13431397 assert_eq ! ( null_buffer, expected_null_buffer) ;
13441398 }
0 commit comments