diff --git a/datafusion/__init__.py b/datafusion/__init__.py index 748a29113..2a81a4d68 100644 --- a/datafusion/__init__.py +++ b/datafusion/__init__.py @@ -53,6 +53,7 @@ ScalarVariable, Sort, TableScan, + GetIndexedField, Not, IsNotNull, IsTrue, @@ -91,6 +92,7 @@ "SimilarTo", "ScalarVariable", "Alias", + "GetIndexedField", "Not", "IsNotNull", "IsTrue", diff --git a/datafusion/tests/test_imports.py b/datafusion/tests/test_imports.py index 683b0618e..ccdfeff47 100644 --- a/datafusion/tests/test_imports.py +++ b/datafusion/tests/test_imports.py @@ -49,6 +49,7 @@ 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 56f1633a2..3d184fa12 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::()?; m.add_class::()?; m.add_class::()?; + m.add_class::()?; // operators m.add_class::()?; m.add_class::()?; diff --git a/src/expr/empty_relation.rs b/src/expr/empty_relation.rs index f3008d1f7..8b2621da5 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 000000000..c98607712 --- /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 for GetIndexedField { + fn from(indexed_field: PyGetIndexedField) -> Self { + indexed_field.indexed_field + } +} + +impl From 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 { + Ok((*self.indexed_field.expr).clone().into()) + } + + fn key(&self) -> PyResult { + Ok(self.indexed_field.key.clone().into()) + } + + /// Get a String representation of this column + fn __repr__(&self) -> String { + format!("{}", self) + } +}