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