Skip to content

Commit 3fd8b16

Browse files
timsaucerclaude
andcommitted
Add missing array/list functions and aliases (#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 5be412b commit 3fd8b16

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 {
@@ -661,6 +677,12 @@ array_fn!(array_intersect, first_array second_array);
661677
array_fn!(array_union, array1 array2);
662678
array_fn!(array_except, first_array second_array);
663679
array_fn!(array_resize, array size value);
680+
array_fn!(array_any_value, array);
681+
array_fn!(array_max, array);
682+
array_fn!(array_min, array);
683+
array_fn!(array_reverse, array);
684+
array_fn!(string_to_array, string delimiter null_string);
685+
array_fn!(gen_series, start stop step);
664686
array_fn!(cardinality, array);
665687
array_fn!(flatten, array);
666688
array_fn!(range, start stop step);
@@ -1121,6 +1143,14 @@ pub(crate) fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
11211143
m.add_wrapped(wrap_pyfunction!(array_replace_all))?;
11221144
m.add_wrapped(wrap_pyfunction!(array_sort))?;
11231145
m.add_wrapped(wrap_pyfunction!(array_slice))?;
1146+
m.add_wrapped(wrap_pyfunction!(array_any_value))?;
1147+
m.add_wrapped(wrap_pyfunction!(array_distance))?;
1148+
m.add_wrapped(wrap_pyfunction!(array_max))?;
1149+
m.add_wrapped(wrap_pyfunction!(array_min))?;
1150+
m.add_wrapped(wrap_pyfunction!(array_reverse))?;
1151+
m.add_wrapped(wrap_pyfunction!(arrays_zip))?;
1152+
m.add_wrapped(wrap_pyfunction!(string_to_array))?;
1153+
m.add_wrapped(wrap_pyfunction!(gen_series))?;
11241154
m.add_wrapped(wrap_pyfunction!(flatten))?;
11251155
m.add_wrapped(wrap_pyfunction!(cardinality))?;
11261156

0 commit comments

Comments
 (0)