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