Skip to content

Commit 48ecaa5

Browse files
Address review comments II
1 parent 892126a commit 48ecaa5

File tree

3 files changed

+23
-26
lines changed

3 files changed

+23
-26
lines changed

datafusion/functions-aggregate/src/min_max.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ fn min_batch(values: &ArrayRef) -> Result<ScalarValue> {
574574
}
575575

576576
/// dynamically-typed max(array) -> ScalarValue
577-
fn max_batch(values: &ArrayRef) -> Result<ScalarValue> {
577+
pub fn max_batch(values: &ArrayRef) -> Result<ScalarValue> {
578578
Ok(match values.data_type() {
579579
DataType::Utf8 => {
580580
typed_min_max_batch_string!(values, StringArray, Utf8, max_string)

datafusion/functions-nested/src/max.rs

+9-24
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@
1616
// under the License.
1717

1818
//! [`ScalarUDFImpl`] definitions for array_max function.
19-
use crate::sort::array_sort_inner;
2019
use crate::utils::make_scalar_function;
21-
use arrow_array::{Array, ArrayRef, StringArray};
20+
use arrow_array::{Array, ArrayRef};
2221
use arrow_schema::DataType;
2322
use arrow_schema::DataType::{FixedSizeList, LargeList, List};
2423
use datafusion_common::cast::as_list_array;
2524
use datafusion_common::exec_err;
2625
use datafusion_doc::Documentation;
2726
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
27+
use datafusion_functions::utils::take_function_args;
28+
use datafusion_functions_aggregate::min_max;
2829
use datafusion_macros::user_doc;
2930
use std::any::Any;
30-
use std::sync::Arc;
3131

3232
make_udf_expr_and_func!(
3333
ArrayMax,
@@ -124,29 +124,14 @@ impl ScalarUDFImpl for ArrayMax {
124124
/// For example:
125125
/// > array_max(\[1, 3, 2]) -> 3
126126
pub fn array_max_inner(args: &[ArrayRef]) -> datafusion_common::Result<ArrayRef> {
127-
if args.len() != 1 {
128-
return exec_err!("array_max needs one argument");
129-
}
127+
let [arg1] = take_function_args("array_max", args)?;
130128

131-
match &args[0].data_type() {
129+
match arg1.data_type() {
132130
List(_) | LargeList(_) | FixedSizeList(_, _) => {
133-
let new_args = vec![
134-
Arc::<dyn Array>::clone(&args[0]),
135-
Arc::new(StringArray::from_iter(vec![Some("DESC")])),
136-
Arc::new(StringArray::from_iter(vec![Some("NULLS LAST")])),
137-
];
138-
array_max_internal(&new_args)
131+
let input_array = as_list_array(&arg1)?.value(0);
132+
let max_result = min_max::max_batch(&input_array);
133+
max_result?.to_array()
139134
}
140-
_ => exec_err!("array_max does not support type: {:?}", args[0].data_type()),
141-
}
142-
}
143-
144-
fn array_max_internal(args: &[ArrayRef]) -> datafusion_common::Result<ArrayRef> {
145-
let sorted_array = array_sort_inner(args)?;
146-
let result_array = as_list_array(&sorted_array)?.value(0);
147-
if result_array.is_empty() {
148-
return exec_err!("array_max needs one argument as non-empty array");
135+
_ => exec_err!("array_max does not support type: {:?}", arg1.data_type()),
149136
}
150-
let max_result = result_array.slice(0, 1);
151-
Ok(max_result)
152137
}

datafusion/sqllogictest/test_files/array.slt

+13-1
Original file line numberDiff line numberDiff line change
@@ -1491,8 +1491,20 @@ select array_max(make_array(NULL, TIMESTAMP '1996-10-01', TIMESTAMP '1995-06-01'
14911491
----
14921492
1996-10-01T00:00:00
14931493

1494-
query error Execution error: array_max needs one argument as non-empty array
1494+
query R
1495+
select array_max(make_array(5.1, -3.2, 6.3, 4.9));
1496+
----
1497+
6.3
1498+
1499+
query I
14951500
select array_max(make_array());
1501+
----
1502+
NULL
1503+
1504+
# Testing with empty arguments should result in an error
1505+
query error DataFusion error: Error during planning: 'array_max' does not support zero arguments.
1506+
select array_max();
1507+
14961508

14971509
## array_pop_back (aliases: `list_pop_back`)
14981510

0 commit comments

Comments
 (0)