Skip to content

Commit 31d660d

Browse files
committed
add unit tests for primitive group values.
1 parent 0258c36 commit 31d660d

File tree

1 file changed

+83
-0
lines changed
  • datafusion/physical-plan/src/aggregates/group_values/single_group_by

1 file changed

+83
-0
lines changed

datafusion/physical-plan/src/aggregates/group_values/single_group_by/primitive.rs

+83
Original file line numberDiff line numberDiff line change
@@ -408,3 +408,86 @@ where
408408
Ok(())
409409
}
410410
}
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

Comments
 (0)