datafusion_python/expr/
empty_relation.rs1use crate::{common::df_schema::PyDFSchema, sql::logical::PyLogicalPlan};
19use datafusion::logical_expr::EmptyRelation;
20use pyo3::{prelude::*, IntoPyObjectExt};
21use std::fmt::{self, Display, Formatter};
22
23use super::logical_node::LogicalNode;
24
25#[pyclass(name = "EmptyRelation", module = "datafusion.expr", subclass)]
26#[derive(Clone)]
27pub struct PyEmptyRelation {
28 empty: EmptyRelation,
29}
30
31impl From<PyEmptyRelation> for EmptyRelation {
32 fn from(empty_relation: PyEmptyRelation) -> Self {
33 empty_relation.empty
34 }
35}
36
37impl From<EmptyRelation> for PyEmptyRelation {
38 fn from(empty: EmptyRelation) -> PyEmptyRelation {
39 PyEmptyRelation { empty }
40 }
41}
42
43impl Display for PyEmptyRelation {
44 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
45 write!(
46 f,
47 "Empty Relation
48 Produce One Row: {:?}
49 Schema: {:?}",
50 &self.empty.produce_one_row, &self.empty.schema
51 )
52 }
53}
54
55#[pymethods]
56impl PyEmptyRelation {
57 fn produce_one_row(&self) -> PyResult<bool> {
58 Ok(self.empty.produce_one_row)
59 }
60
61 fn schema(&self) -> PyResult<PyDFSchema> {
63 Ok((*self.empty.schema).clone().into())
64 }
65
66 fn __repr__(&self) -> String {
68 format!("{}", self)
69 }
70
71 fn __name__(&self) -> PyResult<String> {
72 Ok("EmptyRelation".to_string())
73 }
74}
75
76impl LogicalNode for PyEmptyRelation {
77 fn inputs(&self) -> Vec<PyLogicalPlan> {
78 vec![]
80 }
81
82 fn to_variant<'py>(&self, py: Python<'py>) -> PyResult<Bound<'py, PyAny>> {
83 self.clone().into_bound_py_any(py)
84 }
85}