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