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