datafusion_python/expr/
unnest.rs1use std::fmt::{self, Display, Formatter};
19
20use datafusion::logical_expr::logical_plan::Unnest;
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 = "Unnest",
32 module = "datafusion.expr",
33 subclass
34)]
35#[derive(Clone)]
36pub struct PyUnnest {
37 unnest_: Unnest,
38}
39
40impl From<Unnest> for PyUnnest {
41 fn from(unnest_: Unnest) -> PyUnnest {
42 PyUnnest { unnest_ }
43 }
44}
45
46impl From<PyUnnest> for Unnest {
47 fn from(unnest_: PyUnnest) -> Self {
48 unnest_.unnest_
49 }
50}
51
52impl Display for PyUnnest {
53 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
54 write!(
55 f,
56 "Unnest
57 Inputs: {:?}
58 Schema: {:?}",
59 &self.unnest_.input, &self.unnest_.schema,
60 )
61 }
62}
63
64#[pymethods]
65impl PyUnnest {
66 fn input(&self) -> PyResult<Vec<PyLogicalPlan>> {
68 Ok(Self::inputs(self))
69 }
70
71 fn schema(&self) -> PyResult<PyDFSchema> {
73 Ok(self.unnest_.schema.as_ref().clone().into())
74 }
75
76 fn __repr__(&self) -> PyResult<String> {
77 Ok(format!("Unnest({self})"))
78 }
79
80 fn __name__(&self) -> PyResult<String> {
81 Ok("Unnest".to_string())
82 }
83}
84
85impl LogicalNode for PyUnnest {
86 fn inputs(&self) -> Vec<PyLogicalPlan> {
87 vec![PyLogicalPlan::from((*self.unnest_.input).clone())]
88 }
89
90 fn to_variant<'py>(&self, py: Python<'py>) -> PyResult<Bound<'py, PyAny>> {
91 self.clone().into_bound_py_any(py)
92 }
93}