datafusion_python/expr/
conditional_expr.rs1use datafusion::logical_expr::conditional_expressions::CaseBuilder;
19use datafusion::prelude::Expr;
20use pyo3::prelude::*;
21
22use crate::errors::PyDataFusionResult;
23use crate::expr::PyExpr;
24
25#[derive(Clone, Debug)]
27#[pyclass(name = "CaseBuilder", module = "datafusion.expr", subclass, frozen)]
28pub struct PyCaseBuilder {
29 expr: Option<Expr>,
30 when: Vec<Expr>,
31 then: Vec<Expr>,
32}
33
34#[pymethods]
35impl PyCaseBuilder {
36 #[new]
37 pub fn new(expr: Option<PyExpr>) -> Self {
38 Self {
39 expr: expr.map(Into::into),
40 when: vec![],
41 then: vec![],
42 }
43 }
44
45 pub fn when(&self, when: PyExpr, then: PyExpr) -> PyCaseBuilder {
46 let mut case_builder = self.clone();
47 case_builder.when.push(when.into());
48 case_builder.then.push(then.into());
49
50 case_builder
51 }
52
53 fn otherwise(&self, else_expr: PyExpr) -> PyDataFusionResult<PyExpr> {
54 let case_builder = CaseBuilder::new(
55 self.expr.clone().map(Box::new),
56 self.when.clone(),
57 self.then.clone(),
58 Some(Box::new(else_expr.into())),
59 );
60
61 let expr = case_builder.end()?;
62
63 Ok(expr.into())
64 }
65
66 fn end(&self) -> PyDataFusionResult<PyExpr> {
67 let case_builder = CaseBuilder::new(
68 self.expr.clone().map(Box::new),
69 self.when.clone(),
70 self.then.clone(),
71 None,
72 );
73
74 let expr = case_builder.end()?;
75
76 Ok(expr.into())
77 }
78}