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