Skip to content

Commit 2100a5b

Browse files
committed
improve tests to cover BlockedNullState.
1 parent 2cd5ea9 commit 2100a5b

File tree

1 file changed

+67
-13
lines changed
  • datafusion/functions-aggregate-common/src/aggregate/groups_accumulator

1 file changed

+67
-13
lines changed

datafusion/functions-aggregate-common/src/aggregate/groups_accumulator/accumulate.rs

+67-13
Original file line numberDiff line numberDiff line change
@@ -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\naccumulated_values:{accumulated_values:#?}\n\nexpected_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

Comments
 (0)