This is an automated email from the ASF dual-hosted git repository.

agrove pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion-python.git


The following commit(s) were added to refs/heads/main by this push:
     new a91188c  add first_value last_value (#498)
a91188c is described below

commit a91188c51019a1f9c190a6596970914763415965
Author: zhenxing jiang <[email protected]>
AuthorDate: Fri Oct 13 17:18:55 2023 -0500

    add first_value last_value (#498)
    
    Co-authored-by: Andy Grove <[email protected]>
---
 datafusion/tests/test_functions.py | 23 +++++++++++++++++++++++
 src/functions.rs                   |  4 ++++
 2 files changed, 27 insertions(+)

diff --git a/datafusion/tests/test_functions.py 
b/datafusion/tests/test_functions.py
index f1f64c3..e504cc4 100644
--- a/datafusion/tests/test_functions.py
+++ b/datafusion/tests/test_functions.py
@@ -479,6 +479,29 @@ def test_case(df):
     assert result.column(2) == pa.array(["Hola", "Mundo", None])
 
 
+def test_first_last_value(df):
+    df = df.aggregate(
+        [],
+        [
+            f.first_value(column("a")),
+            f.first_value(column("b")),
+            f.first_value(column("d")),
+            f.last_value(column("a")),
+            f.last_value(column("b")),
+            f.last_value(column("d")),
+        ],
+    )
+
+    result = df.collect()
+    result = result[0]
+    assert result.column(0) == pa.array(["Hello"])
+    assert result.column(1) == pa.array([4])
+    assert result.column(2) == pa.array([datetime(2022, 12, 31)])
+    assert result.column(3) == pa.array(["!"])
+    assert result.column(4) == pa.array([6])
+    assert result.column(5) == pa.array([datetime(2020, 7, 2)])
+
+
 def test_binary_string_functions(df):
     df = df.select(
         f.encode(column("a"), literal("base64")),
diff --git a/src/functions.rs b/src/functions.rs
index eed2815..2f2f34e 100644
--- a/src/functions.rs
+++ b/src/functions.rs
@@ -362,6 +362,8 @@ aggregate_function!(stddev_samp, Stddev);
 aggregate_function!(var, Variance);
 aggregate_function!(var_pop, VariancePop);
 aggregate_function!(var_samp, Variance);
+aggregate_function!(first_value, FirstValue);
+aggregate_function!(last_value, LastValue);
 aggregate_function!(bit_and, BitAnd);
 aggregate_function!(bit_or, BitOr);
 aggregate_function!(bit_xor, BitXor);
@@ -494,6 +496,8 @@ pub(crate) fn init_module(m: &PyModule) -> PyResult<()> {
     m.add_wrapped(wrap_pyfunction!(var_pop))?;
     m.add_wrapped(wrap_pyfunction!(var_samp))?;
     m.add_wrapped(wrap_pyfunction!(window))?;
+    m.add_wrapped(wrap_pyfunction!(first_value))?;
+    m.add_wrapped(wrap_pyfunction!(last_value))?;
     m.add_wrapped(wrap_pyfunction!(bit_and))?;
     m.add_wrapped(wrap_pyfunction!(bit_or))?;
     m.add_wrapped(wrap_pyfunction!(bit_xor))?;

Reply via email to