use crate::logical_plan::producer::SubstraitProducer;
use datafusion::common::DFSchemaRef;
use datafusion::logical_expr::Case;
use substrait::proto::Expression;
use substrait::proto::expression::if_then::IfClause;
use substrait::proto::expression::{IfThen, RexType};
pub fn from_case(
producer: &mut impl SubstraitProducer,
case: &Case,
schema: &DFSchemaRef,
) -> datafusion::common::Result<Expression> {
let Case {
expr,
when_then_expr,
else_expr,
} = case;
let mut ifs: Vec<IfClause> = vec![];
if let Some(e) = expr {
ifs.push(IfClause {
r#if: Some(producer.handle_expr(e, schema)?),
then: None,
});
}
for (r#if, then) in when_then_expr {
ifs.push(IfClause {
r#if: Some(producer.handle_expr(r#if, schema)?),
then: Some(producer.handle_expr(then, schema)?),
});
}
let r#else: Option<Box<Expression>> = match else_expr {
Some(e) => Some(Box::new(producer.handle_expr(e, schema)?)),
None => None,
};
Ok(Expression {
rex_type: Some(RexType::IfThen(Box::new(IfThen { ifs, r#else }))),
})
}