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 f23a1a3  Add bindings for GetIndexedField (#227)
f23a1a3 is described below

commit f23a1a33780bff07ad1c906dabbd3cdc3bc1e9a2
Author: Jeremy Dyer <[email protected]>
AuthorDate: Thu Feb 23 16:35:56 2023 -0500

    Add bindings for GetIndexedField (#227)
    
    * Add bindings for GetIndexedField
    
    * Fix unfinished merge conflicts
    
    * pytest fixes
---
 datafusion/__init__.py           |  2 ++
 datafusion/tests/test_imports.py |  2 ++
 src/expr.rs                      |  2 ++
 src/expr/empty_relation.rs       |  4 +--
 src/expr/indexed_field.rs        | 69 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/datafusion/__init__.py b/datafusion/__init__.py
index 748a291..2a81a4d 100644
--- a/datafusion/__init__.py
+++ b/datafusion/__init__.py
@@ -53,6 +53,7 @@ from .expr import (
     ScalarVariable,
     Sort,
     TableScan,
+    GetIndexedField,
     Not,
     IsNotNull,
     IsTrue,
@@ -91,6 +92,7 @@ __all__ = [
     "SimilarTo",
     "ScalarVariable",
     "Alias",
+    "GetIndexedField",
     "Not",
     "IsNotNull",
     "IsTrue",
diff --git a/datafusion/tests/test_imports.py b/datafusion/tests/test_imports.py
index 683b061..ccdfeff 100644
--- a/datafusion/tests/test_imports.py
+++ b/datafusion/tests/test_imports.py
@@ -49,6 +49,7 @@ from datafusion.expr import (
     SimilarTo,
     ScalarVariable,
     Alias,
+    GetIndexedField,
     Not,
     IsNotNull,
     IsTrue,
@@ -97,6 +98,7 @@ def test_class_module_is_datafusion():
         SimilarTo,
         ScalarVariable,
         Alias,
+        GetIndexedField,
         Not,
         IsNotNull,
         IsTrue,
diff --git a/src/expr.rs b/src/expr.rs
index 56f1633..3d184fa 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -47,6 +47,7 @@ pub mod bool_expr;
 pub mod column;
 pub mod empty_relation;
 pub mod filter;
+pub mod indexed_field;
 pub mod like;
 pub mod limit;
 pub mod literal;
@@ -232,6 +233,7 @@ pub(crate) fn init_module(m: &PyModule) -> PyResult<()> {
     m.add_class::<PyScalarVariable>()?;
     m.add_class::<alias::PyAlias>()?;
     m.add_class::<between::PyBetween>()?;
+    m.add_class::<indexed_field::PyGetIndexedField>()?;
     // operators
     m.add_class::<table_scan::PyTableScan>()?;
     m.add_class::<projection::PyProjection>()?;
diff --git a/src/expr/empty_relation.rs b/src/expr/empty_relation.rs
index f3008d1..8b2621d 100644
--- a/src/expr/empty_relation.rs
+++ b/src/expr/empty_relation.rs
@@ -43,8 +43,8 @@ impl Display for PyEmptyRelation {
         write!(
             f,
             "Empty Relation
-            \nProduce One Row: {:?}
-            \nSchema: {:?}",
+            Produce One Row: {:?}
+            Schema: {:?}",
             &self.empty.produce_one_row, &self.empty.schema
         )
     }
diff --git a/src/expr/indexed_field.rs b/src/expr/indexed_field.rs
new file mode 100644
index 0000000..c986077
--- /dev/null
+++ b/src/expr/indexed_field.rs
@@ -0,0 +1,69 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use crate::expr::PyExpr;
+use datafusion_expr::expr::GetIndexedField;
+use pyo3::prelude::*;
+use std::fmt::{Display, Formatter};
+
+use super::literal::PyLiteral;
+
+#[pyclass(name = "GetIndexedField", module = "datafusion.expr", subclass)]
+#[derive(Clone)]
+pub struct PyGetIndexedField {
+    indexed_field: GetIndexedField,
+}
+
+impl From<PyGetIndexedField> for GetIndexedField {
+    fn from(indexed_field: PyGetIndexedField) -> Self {
+        indexed_field.indexed_field
+    }
+}
+
+impl From<GetIndexedField> for PyGetIndexedField {
+    fn from(indexed_field: GetIndexedField) -> PyGetIndexedField {
+        PyGetIndexedField { indexed_field }
+    }
+}
+
+impl Display for PyGetIndexedField {
+    fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
+        write!(
+            f,
+            "GetIndexedField
+            Expr: {:?}
+            Key: {:?}",
+            &self.indexed_field.expr, &self.indexed_field.key
+        )
+    }
+}
+
+#[pymethods]
+impl PyGetIndexedField {
+    fn expr(&self) -> PyResult<PyExpr> {
+        Ok((*self.indexed_field.expr).clone().into())
+    }
+
+    fn key(&self) -> PyResult<PyLiteral> {
+        Ok(self.indexed_field.key.clone().into())
+    }
+
+    /// Get a String representation of this column
+    fn __repr__(&self) -> String {
+        format!("{}", self)
+    }
+}

Reply via email to