Skip to content

Commit ba96f77

Browse files
committed
feat(min_max): update min_max_batch_generic to handle raw values from DictionaryArray
- Removed redundant commentary in `min_max.rs` regarding dictionary arrays. - Improved handling of dictionary array values by explicitly extracting and processing raw values. - Added assertions in unit tests to validate the results when operating on raw values from the dictionary.
1 parent a34ddf1 commit ba96f77

1 file changed

Lines changed: 6 additions & 5 deletions

File tree

  • datafusion/functions-aggregate-common/src

datafusion/functions-aggregate-common/src/min_max.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -823,10 +823,6 @@ pub fn min_batch(values: &ArrayRef) -> Result<ScalarValue> {
823823
}
824824

825825
/// Finds the min/max by scanning logical rows via `ScalarValue::try_from_array`.
826-
///
827-
/// Callers are responsible for routing dictionary arrays to this helper.
828-
/// Passing `dictionary.values()` is semantically incorrect because it can
829-
/// include unreferenced dictionary entries and ignore null key positions.
830826
fn min_max_batch_generic(values: &ArrayRef, ordering: Ordering) -> Result<ScalarValue> {
831827
let mut index = 0;
832828
let mut extreme = loop {
@@ -911,7 +907,7 @@ pub fn max_batch(values: &ArrayRef) -> Result<ScalarValue> {
911907
#[cfg(test)]
912908
mod tests {
913909
use super::*;
914-
use arrow::array::DictionaryArray;
910+
use arrow::array::{AsArray, DictionaryArray};
915911
use std::sync::Arc;
916912

917913
#[test]
@@ -997,9 +993,12 @@ mod tests {
997993
let keys = Int8Array::from(vec![Some(1), None, Some(1), Some(1)]);
998994
let values = Arc::new(StringArray::from(vec!["zzz", "bbb", "aaa"]));
999995
let array = Arc::new(DictionaryArray::new(keys, values)) as ArrayRef;
996+
let raw_values = array.as_any_dictionary().values();
1000997

1001998
let min = min_batch(&array)?;
1002999
let max = max_batch(&array)?;
1000+
let raw_min = min_batch(raw_values)?;
1001+
let raw_max = max_batch(raw_values)?;
10031002

10041003
let expected = ScalarValue::Dictionary(
10051004
Box::new(DataType::Int8),
@@ -1008,6 +1007,8 @@ mod tests {
10081007

10091008
assert_eq!(min, expected);
10101009
assert_eq!(max, expected);
1010+
assert_eq!(raw_min, ScalarValue::Utf8(Some("aaa".to_string())));
1011+
assert_eq!(raw_max, ScalarValue::Utf8(Some("zzz".to_string())));
10111012

10121013
Ok(())
10131014
}

0 commit comments

Comments
 (0)