@@ -159,6 +159,44 @@ fn array_slice(array: PyExpr, begin: PyExpr, end: PyExpr, stride: Option<PyExpr>
159159 . into ( )
160160}
161161
162+ /// Create a lambda expression from a list of parameter names and a body
163+ /// expression. The body should reference the parameters via [`lambda_var`].
164+ /// Exposed to Python as `lambda_` because `lambda` is a reserved keyword.
165+ #[ pyfunction]
166+ #[ pyo3( name = "lambda_" ) ]
167+ fn py_lambda ( params : Vec < String > , body : PyExpr ) -> PyExpr {
168+ datafusion:: logical_expr:: lambda ( params, body. into ( ) ) . into ( )
169+ }
170+
171+ /// Create an unresolved lambda variable reference by name. The owning
172+ /// higher-order function resolves it against its lambda parameters during
173+ /// planning.
174+ #[ pyfunction]
175+ fn lambda_var ( name : String ) -> PyExpr {
176+ datafusion:: logical_expr:: lambda_var ( name) . into ( )
177+ }
178+
179+ /// Higher-order function: apply `transform` (a lambda) to each element of
180+ /// `array`, returning a new array of the results.
181+ #[ pyfunction]
182+ fn array_transform ( array : PyExpr , transform : PyExpr ) -> PyExpr {
183+ datafusion:: functions_nested:: expr_fn:: array_transform ( array. into ( ) , transform. into ( ) ) . into ( )
184+ }
185+
186+ /// Higher-order function: return true if any element of `array` satisfies
187+ /// `predicate` (a lambda returning a boolean).
188+ #[ pyfunction]
189+ fn array_any_match ( array : PyExpr , predicate : PyExpr ) -> PyExpr {
190+ datafusion:: functions_nested:: expr_fn:: array_any_match ( array. into ( ) , predicate. into ( ) ) . into ( )
191+ }
192+
193+ /// Higher-order function: keep the elements of `array` for which `predicate`
194+ /// (a lambda returning a boolean) is true, returning a new filtered array.
195+ #[ pyfunction]
196+ fn array_filter ( array : PyExpr , predicate : PyExpr ) -> PyExpr {
197+ datafusion:: functions_nested:: expr_fn:: array_filter ( array. into ( ) , predicate. into ( ) ) . into ( )
198+ }
199+
162200/// Computes a binary hash of the given data. type is the algorithm to use.
163201/// Standard algorithms are md5, sha224, sha256, sha384, sha512, blake2s, blake2b, and blake3.
164202// #[pyfunction(value, method)]
@@ -1082,6 +1120,13 @@ pub(crate) fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
10821120 m. add_wrapped ( wrap_pyfunction ! ( encode) ) ?;
10831121 m. add_wrapped ( wrap_pyfunction ! ( decode) ) ?;
10841122
1123+ // Lambda / higher-order functions
1124+ m. add_wrapped ( wrap_pyfunction ! ( py_lambda) ) ?;
1125+ m. add_wrapped ( wrap_pyfunction ! ( lambda_var) ) ?;
1126+ m. add_wrapped ( wrap_pyfunction ! ( array_transform) ) ?;
1127+ m. add_wrapped ( wrap_pyfunction ! ( array_any_match) ) ?;
1128+ m. add_wrapped ( wrap_pyfunction ! ( array_filter) ) ?;
1129+
10851130 // Array Functions
10861131 m. add_wrapped ( wrap_pyfunction ! ( array_append) ) ?;
10871132 m. add_wrapped ( wrap_pyfunction ! ( array_concat) ) ?;
0 commit comments