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