This is an automated email from the ASF dual-hosted git repository.
xudong963 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 5e1214c55e allow min max dictionary (#15827)
5e1214c55e is described below
commit 5e1214c55e37d198d732667b770943cfba4fe5c3
Author: Xiangpeng Hao <[email protected]>
AuthorDate: Tue Apr 29 01:15:37 2025 -0400
allow min max dictionary (#15827)
---
datafusion/functions-aggregate/src/min_max.rs | 60 +++++++++++++++++++++------
1 file changed, 47 insertions(+), 13 deletions(-)
diff --git a/datafusion/functions-aggregate/src/min_max.rs
b/datafusion/functions-aggregate/src/min_max.rs
index ea4cad5488..e10f9fbc61 100644
--- a/datafusion/functions-aggregate/src/min_max.rs
+++ b/datafusion/functions-aggregate/src/min_max.rs
@@ -21,15 +21,16 @@
mod min_max_bytes;
use arrow::array::{
- ArrayRef, BinaryArray, BinaryViewArray, BooleanArray, Date32Array,
Date64Array,
- Decimal128Array, Decimal256Array, DurationMicrosecondArray,
DurationMillisecondArray,
- DurationNanosecondArray, DurationSecondArray, Float16Array, Float32Array,
- Float64Array, Int16Array, Int32Array, Int64Array, Int8Array,
IntervalDayTimeArray,
- IntervalMonthDayNanoArray, IntervalYearMonthArray, LargeBinaryArray,
- LargeStringArray, StringArray, StringViewArray, Time32MillisecondArray,
- Time32SecondArray, Time64MicrosecondArray, Time64NanosecondArray,
- TimestampMicrosecondArray, TimestampMillisecondArray,
TimestampNanosecondArray,
- TimestampSecondArray, UInt16Array, UInt32Array, UInt64Array, UInt8Array,
+ ArrayRef, AsArray as _, BinaryArray, BinaryViewArray, BooleanArray,
Date32Array,
+ Date64Array, Decimal128Array, Decimal256Array, DurationMicrosecondArray,
+ DurationMillisecondArray, DurationNanosecondArray, DurationSecondArray,
Float16Array,
+ Float32Array, Float64Array, Int16Array, Int32Array, Int64Array, Int8Array,
+ IntervalDayTimeArray, IntervalMonthDayNanoArray, IntervalYearMonthArray,
+ LargeBinaryArray, LargeStringArray, StringArray, StringViewArray,
+ Time32MillisecondArray, Time32SecondArray, Time64MicrosecondArray,
+ Time64NanosecondArray, TimestampMicrosecondArray,
TimestampMillisecondArray,
+ TimestampNanosecondArray, TimestampSecondArray, UInt16Array, UInt32Array,
+ UInt64Array, UInt8Array,
};
use arrow::compute;
use arrow::datatypes::{
@@ -610,6 +611,10 @@ fn min_batch(values: &ArrayRef) -> Result<ScalarValue> {
min_binary_view
)
}
+ DataType::Dictionary(_, _) => {
+ let values = values.as_any_dictionary().values();
+ min_batch(values)?
+ }
_ => min_max_batch!(values, min),
})
}
@@ -653,6 +658,10 @@ pub fn max_batch(values: &ArrayRef) -> Result<ScalarValue>
{
max_binary
)
}
+ DataType::Dictionary(_, _) => {
+ let values = values.as_any_dictionary().values();
+ max_batch(values)?
+ }
_ => min_max_batch!(values, max),
})
}
@@ -1627,8 +1636,11 @@ make_udaf_expr_and_func!(
#[cfg(test)]
mod tests {
use super::*;
- use arrow::datatypes::{
- IntervalDayTimeType, IntervalMonthDayNanoType, IntervalYearMonthType,
+ use arrow::{
+ array::DictionaryArray,
+ datatypes::{
+ IntervalDayTimeType, IntervalMonthDayNanoType,
IntervalYearMonthType,
+ },
};
use std::sync::Arc;
@@ -1854,9 +1866,31 @@ mod tests {
#[test]
fn test_get_min_max_return_type_coerce_dictionary() -> Result<()> {
let data_type =
- DataType::Dictionary(Box::new(DataType::Utf8),
Box::new(DataType::Int32));
+ DataType::Dictionary(Box::new(DataType::Int32),
Box::new(DataType::Utf8));
let result = get_min_max_result_type(&[data_type])?;
- assert_eq!(result, vec![DataType::Int32]);
+ assert_eq!(result, vec![DataType::Utf8]);
+ Ok(())
+ }
+
+ #[test]
+ fn test_min_max_dictionary() -> Result<()> {
+ let values = StringArray::from(vec!["b", "c", "a", "🦀", "d"]);
+ let keys = Int32Array::from(vec![Some(0), Some(1), Some(2), None,
Some(4)]);
+ let dict_array =
+ DictionaryArray::try_new(keys, Arc::new(values) as
ArrayRef).unwrap();
+ let dict_array_ref = Arc::new(dict_array) as ArrayRef;
+ let rt_type =
+
get_min_max_result_type(&[dict_array_ref.data_type().clone()])?[0].clone();
+
+ let mut min_acc = MinAccumulator::try_new(&rt_type)?;
+ min_acc.update_batch(&[Arc::clone(&dict_array_ref)])?;
+ let min_result = min_acc.evaluate()?;
+ assert_eq!(min_result, ScalarValue::Utf8(Some("a".to_string())));
+
+ let mut max_acc = MaxAccumulator::try_new(&rt_type)?;
+ max_acc.update_batch(&[Arc::clone(&dict_array_ref)])?;
+ let max_result = max_acc.evaluate()?;
+ assert_eq!(max_result, ScalarValue::Utf8(Some("🦀".to_string())));
Ok(())
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]