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