Skip to content

Commit b9d5f65

Browse files
timsaucerclaude
andcommitted
Add missing array/list functions and aliases (apache#1452)
Add new array functions from upstream DataFusion v53: array_any_value, array_distance, array_max, array_min, array_reverse, arrays_zip, string_to_array, and gen_series. Add corresponding list_* aliases and missing list_* aliases for existing functions (list_empty, list_pop_back, list_pop_front, list_has, list_has_all, list_has_any). Also add array_contains/list_contains as aliases for array_has, generate_series as alias for gen_series, and string_to_list as alias for string_to_array. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 645d261 commit b9d5f65

File tree

2 files changed

+323
-1
lines changed

2 files changed

+323
-1
lines changed

crates/core/src/functions.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,22 @@ fn array_cat(exprs: Vec<PyExpr>) -> PyExpr {
9393
array_concat(exprs)
9494
}
9595

96+
#[pyfunction]
97+
fn array_distance(array1: PyExpr, array2: PyExpr) -> PyExpr {
98+
let args = vec![array1.into(), array2.into()];
99+
Expr::ScalarFunction(datafusion::logical_expr::expr::ScalarFunction::new_udf(
100+
datafusion::functions_nested::distance::array_distance_udf(),
101+
args,
102+
))
103+
.into()
104+
}
105+
106+
#[pyfunction]
107+
fn arrays_zip(exprs: Vec<PyExpr>) -> PyExpr {
108+
let exprs = exprs.into_iter().map(|x| x.into()).collect();
109+
datafusion::functions_nested::expr_fn::arrays_zip(exprs).into()
110+
}
111+
96112
#[pyfunction]
97113
#[pyo3(signature = (array, element, index=None))]
98114
fn array_position(array: PyExpr, element: PyExpr, index: Option<i64>) -> PyExpr {
@@ -667,6 +683,12 @@ array_fn!(array_intersect, first_array second_array);
667683
array_fn!(array_union, array1 array2);
668684
array_fn!(array_except, first_array second_array);
669685
array_fn!(array_resize, array size value);
686+
array_fn!(array_any_value, array);
687+
array_fn!(array_max, array);
688+
array_fn!(array_min, array);
689+
array_fn!(array_reverse, array);
690+
array_fn!(string_to_array, string delimiter null_string);
691+
array_fn!(gen_series, start stop step);
670692
array_fn!(cardinality, array);
671693
array_fn!(flatten, array);
672694
array_fn!(range, start stop step);
@@ -1129,6 +1151,14 @@ pub(crate) fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
11291151
m.add_wrapped(wrap_pyfunction!(array_replace_all))?;
11301152
m.add_wrapped(wrap_pyfunction!(array_sort))?;
11311153
m.add_wrapped(wrap_pyfunction!(array_slice))?;
1154+
m.add_wrapped(wrap_pyfunction!(array_any_value))?;
1155+
m.add_wrapped(wrap_pyfunction!(array_distance))?;
1156+
m.add_wrapped(wrap_pyfunction!(array_max))?;
1157+
m.add_wrapped(wrap_pyfunction!(array_min))?;
1158+
m.add_wrapped(wrap_pyfunction!(array_reverse))?;
1159+
m.add_wrapped(wrap_pyfunction!(arrays_zip))?;
1160+
m.add_wrapped(wrap_pyfunction!(string_to_array))?;
1161+
m.add_wrapped(wrap_pyfunction!(gen_series))?;
11321162
m.add_wrapped(wrap_pyfunction!(flatten))?;
11331163
m.add_wrapped(wrap_pyfunction!(cardinality))?;
11341164

0 commit comments

Comments
 (0)