@@ -956,12 +956,13 @@ mod test {
956
956
} )
957
957
. collect ( ) ;
958
958
959
+ // Test flat style
959
960
Fixture {
960
961
group_indices,
961
962
values,
962
963
values_with_nulls,
963
964
filter,
964
- block_size : None ,
965
+ block_size : 3 ,
965
966
}
966
967
. run ( )
967
968
}
@@ -989,8 +990,8 @@ mod test {
989
990
/// filter (defaults to None)
990
991
filter : BooleanArray ,
991
992
992
- ///
993
- block_size : Option < usize > ,
993
+ /// block size for testing [`BlockedNullState`]
994
+ block_size : usize ,
994
995
}
995
996
996
997
impl Fixture {
@@ -1007,6 +1008,9 @@ mod test {
1007
1008
1008
1009
let values: Vec < u32 > = ( 0 ..num_values) . map ( |_| rng. gen ( ) ) . collect ( ) ;
1009
1010
1011
+ // random block size
1012
+ let block_size = rng. gen_range ( 1 ..num_groups) ;
1013
+
1010
1014
// 10% chance of false
1011
1015
// 10% change of null
1012
1016
// 80% chance of true
@@ -1042,7 +1046,7 @@ mod test {
1042
1046
values,
1043
1047
values_with_nulls,
1044
1048
filter,
1045
- block_size : None ,
1049
+ block_size,
1046
1050
}
1047
1051
}
1048
1052
@@ -1111,17 +1115,27 @@ mod test {
1111
1115
values : & UInt32Array ,
1112
1116
opt_filter : Option < & BooleanArray > ,
1113
1117
total_num_groups : usize ,
1114
- block_size : Option < usize > ,
1118
+ block_size : usize ,
1115
1119
) {
1120
+ // Test `accumulate` of `FlatNullState`
1116
1121
Self :: accumulate_values_test (
1117
1122
group_indices,
1118
1123
values,
1119
1124
opt_filter,
1120
1125
total_num_groups,
1121
- block_size ,
1126
+ None ,
1122
1127
) ;
1123
- Self :: accumulate_indices_test ( group_indices, values. nulls ( ) , opt_filter) ;
1124
1128
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`
1125
1139
// Convert values into a boolean array (anything above the
1126
1140
// average is true, otherwise false)
1127
1141
let avg: usize = values. iter ( ) . filter_map ( |v| v. map ( |v| v as usize ) ) . sum ( ) ;
@@ -1132,7 +1146,20 @@ mod test {
1132
1146
& boolean_values,
1133
1147
opt_filter,
1134
1148
total_num_groups,
1149
+ None ,
1135
1150
) ;
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) ;
1136
1163
}
1137
1164
1138
1165
/// This is effectively a different implementation of
@@ -1285,17 +1312,44 @@ mod test {
1285
1312
values : & BooleanArray ,
1286
1313
opt_filter : Option < & BooleanArray > ,
1287
1314
total_num_groups : usize ,
1315
+ block_size : Option < usize > ,
1288
1316
) {
1289
1317
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
+ } ;
1291
1343
1292
1344
null_state. accumulate_boolean (
1293
- group_indices ,
1345
+ & acc_group_indices ,
1294
1346
values,
1295
1347
opt_filter,
1296
1348
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) ) ;
1299
1353
} ,
1300
1354
) ;
1301
1355
@@ -1332,13 +1386,13 @@ mod test {
1332
1386
assert_eq ! ( accumulated_values, expected_values,
1333
1387
"\n \n accumulated_values:{accumulated_values:#?}\n \n expected_values:{expected_values:#?}" ) ;
1334
1388
1335
- let seen_values = null_state. seen_values . builder . finish_cloned ( ) ;
1389
+ let seen_values = null_state. build_cloned_seen_values ( ) ;
1336
1390
mock. validate_seen_values ( & seen_values) ;
1337
1391
1338
1392
// Validate the final buffer (one value per group)
1339
1393
let expected_null_buffer = mock. expected_null_buffer ( total_num_groups) ;
1340
1394
1341
- let null_buffer = null_state. build ( EmitTo :: All ) ;
1395
+ let null_buffer = null_state. build_all_in_once ( ) ;
1342
1396
1343
1397
assert_eq ! ( null_buffer, expected_null_buffer) ;
1344
1398
}
0 commit comments