Skip to content

Commit 8b04dc2

Browse files
Addressing review comments
1 parent aefefab commit 8b04dc2

File tree

3 files changed

+21
-25
lines changed

3 files changed

+21
-25
lines changed

datafusion/functions-aggregate/src/min_max.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ macro_rules! min_max_batch {
531531
}
532532

533533
/// dynamically-typed min(array) -> ScalarValue
534-
fn min_batch(values: &ArrayRef) -> Result<ScalarValue> {
534+
pub fn min_batch(values: &ArrayRef) -> Result<ScalarValue> {
535535
Ok(match values.data_type() {
536536
DataType::Utf8 => {
537537
typed_min_max_batch_string!(values, StringArray, Utf8, min_string)

datafusion/functions-nested/src/min.rs

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@
1717

1818
//! [`ScalarUDFImpl`] definitions for array_min function.
1919
20-
use crate::sort::array_sort_inner;
2120
use crate::utils::make_scalar_function;
22-
use arrow_array::{Array, ArrayRef, StringArray};
21+
use arrow_array::ArrayRef;
2322
use arrow_schema::DataType;
2423
use arrow_schema::DataType::{FixedSizeList, LargeList, List};
2524
use datafusion_common::cast::as_list_array;
2625
use datafusion_common::exec_err;
2726
use datafusion_doc::Documentation;
2827
use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
28+
use datafusion_functions::utils::take_function_args;
29+
use datafusion_functions_aggregate::min_max;
2930
use datafusion_macros::user_doc;
3031
use std::any::Any;
31-
use std::sync::Arc;
3232

3333
make_udf_expr_and_func!(
3434
ArrayMin,
@@ -125,29 +125,14 @@ impl ScalarUDFImpl for ArrayMin {
125125
/// For example:
126126
/// > array_min(\[3, 1, 2]) -> 1
127127
pub fn array_min_inner(args: &[ArrayRef]) -> datafusion_common::Result<ArrayRef> {
128-
if args.len() != 1 {
129-
return exec_err!("array_min needs one argument");
130-
}
128+
let [arg1] = take_function_args("array_min", args)?;
131129

132-
match &args[0].data_type() {
130+
match &arg1.data_type() {
133131
List(_) | LargeList(_) | FixedSizeList(_, _) => {
134-
let new_args = vec![
135-
Arc::<dyn Array>::clone(&args[0]),
136-
Arc::new(StringArray::from_iter(vec![Some("ASC")])),
137-
Arc::new(StringArray::from_iter(vec![Some("NULLS LAST")])),
138-
];
139-
array_min_internal(&new_args)
132+
let input_array = as_list_array(&arg1)?.value(0);
133+
let min_result = min_max::min_batch(&input_array);
134+
min_result?.to_array()
140135
}
141136
_ => exec_err!("array_min does not support type: {:?}", args[0].data_type()),
142137
}
143138
}
144-
145-
fn array_min_internal(args: &[ArrayRef]) -> datafusion_common::Result<ArrayRef> {
146-
let sorted_array = array_sort_inner(args)?;
147-
let result_array = as_list_array(&sorted_array)?.value(0);
148-
if result_array.is_empty() {
149-
return exec_err!("array_min needs one argument as non-empty array");
150-
}
151-
let min_result = result_array.slice(0, 1);
152-
Ok(min_result)
153-
}

datafusion/sqllogictest/test_files/array.slt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1485,13 +1485,24 @@ select array_min(make_array(TIMESTAMP '1992-09-01', TIMESTAMP '1984-10-01', TIME
14851485
----
14861486
1984-10-01T00:00:00
14871487

1488+
query R
1489+
select array_min(make_array(5.1, -3.2, 6.3, 4.9));
1490+
----
1491+
-3.2
1492+
14881493
query P
14891494
select array_min(make_array(NULL, TIMESTAMP '1996-10-01', TIMESTAMP '1995-06-01'));
14901495
----
14911496
1995-06-01T00:00:00
14921497

1493-
query error Execution error: array_min needs one argument as non-empty array
1498+
query I
14941499
select array_min(make_array());
1500+
----
1501+
NULL
1502+
1503+
# Testing with empty arguments should result in an error
1504+
query error DataFusion error: Error during planning: 'array_min' does not support zero arguments
1505+
select array_min();
14951506

14961507
## array_pop_back (aliases: `list_pop_back`)
14971508

0 commit comments

Comments
 (0)