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 4c7b14c  add bit_and,bit_or,bit_xor,bool_add,bool_or (#496)
4c7b14c is described below

commit 4c7b14c6e4da99a7e52fddaf6fed9ae51ca2c66e
Author: zhenxing jiang <[email protected]>
AuthorDate: Thu Oct 12 10:22:27 2023 -0500

    add bit_and,bit_or,bit_xor,bool_add,bool_or (#496)
    
    * add bit_and,bit_or,bit_xor,bool_add,bool_or
    
    * Update datafusion/tests/test_aggregation.py
    
    Co-authored-by: Liang-Chi Hsieh <[email protected]>
    
    ---------
    
    Co-authored-by: Liang-Chi Hsieh <[email protected]>
---
 datafusion/tests/test_aggregation.py | 38 ++++++++++++++++++++++++++++++++++--
 src/functions.rs                     | 10 ++++++++++
 2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/datafusion/tests/test_aggregation.py 
b/datafusion/tests/test_aggregation.py
index 2c8c064..0a6c90c 100644
--- a/datafusion/tests/test_aggregation.py
+++ b/datafusion/tests/test_aggregation.py
@@ -33,8 +33,9 @@ def df():
             pa.array([1, 2, 3]),
             pa.array([4, 4, 6]),
             pa.array([9, 8, 5]),
+            pa.array([True, True, False]),
         ],
-        names=["a", "b", "c"],
+        names=["a", "b", "c", "d"],
     )
     return ctx.create_dataframe([[batch]])
 
@@ -73,7 +74,7 @@ def test_built_in_aggregation(df):
         ],
     )
     result = agg_df.collect()[0]
-    values_a, values_b, values_c = df.collect()[0]
+    values_a, values_b, values_c, values_d = df.collect()[0]
 
     assert result.column(0) == pa.array([2], type=pa.uint64())
     assert result.column(1) == pa.array([4])
@@ -125,3 +126,36 @@ def test_built_in_aggregation(df):
     np.testing.assert_array_almost_equal(
         result.column(21), np.var(values_c, ddof=1)
     )
+
+
+def test_bit_add_or_xor(df):
+
+    df = df.aggregate(
+        [],
+        [
+            f.bit_and(column("a")),
+            f.bit_or(column("b")),
+            f.bit_xor(column("c")),
+        ],
+    )
+
+    result = df.collect()
+    result = result[0]
+    assert result.column(0) == pa.array([0])
+    assert result.column(1) == pa.array([6])
+    assert result.column(2) == pa.array([4])
+
+
+def test_bool_and_or(df):
+
+    df = df.aggregate(
+        [],
+        [
+            f.bool_and(column("d")),
+            f.bool_or(column("d")),
+        ],
+    )
+    result = df.collect()
+    result = result[0]
+    assert result.column(0) == pa.array([False])
+    assert result.column(1) == pa.array([True])
diff --git a/src/functions.rs b/src/functions.rs
index ef26240..eed2815 100644
--- a/src/functions.rs
+++ b/src/functions.rs
@@ -362,6 +362,11 @@ aggregate_function!(stddev_samp, Stddev);
 aggregate_function!(var, Variance);
 aggregate_function!(var_pop, VariancePop);
 aggregate_function!(var_samp, Variance);
+aggregate_function!(bit_and, BitAnd);
+aggregate_function!(bit_or, BitOr);
+aggregate_function!(bit_xor, BitXor);
+aggregate_function!(bool_and, BoolAnd);
+aggregate_function!(bool_or, BoolOr);
 
 pub(crate) fn init_module(m: &PyModule) -> PyResult<()> {
     m.add_wrapped(wrap_pyfunction!(abs))?;
@@ -489,6 +494,11 @@ 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!(bit_and))?;
+    m.add_wrapped(wrap_pyfunction!(bit_or))?;
+    m.add_wrapped(wrap_pyfunction!(bit_xor))?;
+    m.add_wrapped(wrap_pyfunction!(bool_and))?;
+    m.add_wrapped(wrap_pyfunction!(bool_or))?;
 
     //Binary String Functions
     m.add_wrapped(wrap_pyfunction!(encode))?;

Reply via email to