use datafusion::logical_expr::{BinaryExpr, Expr as DFExpr, Operator as DFOperator};
use hamelin_lib::func::defs::{
CalendarIntervalDivideInt, CalendarIntervalMinusCalendarInterval, CalendarIntervalMultiplyInt,
CalendarIntervalPlusCalendarInterval, CalendarIntervalPlusTimestamp,
IntMultiplyCalendarInterval, IntervalDivideNumeric, IntervalMinusInterval,
IntervalMultiplyNumeric, IntervalPlusInterval, IntervalPlusTimestamp, NumericMultiplyInterval,
TimestampMinusCalendarInterval, TimestampMinusInterval, TimestampMinusTimestamp,
TimestampPlusCalendarInterval, TimestampPlusInterval,
};
use super::DataFusionTranslationRegistry;
use crate::udf::{from_millis_udf, from_months_udf, to_millis_udf, to_months_udf};
pub fn register(registry: &mut DataFusionTranslationRegistry) {
registry.register::<IntervalPlusInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Plus,
Box::new(right),
)))
});
registry.register::<IntervalMinusInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Minus,
Box::new(right),
)))
});
registry.register::<IntervalMultiplyNumeric>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
let millis = to_millis_udf().call(vec![left]);
let product = DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(millis),
DFOperator::Multiply,
Box::new(right),
));
Ok(from_millis_udf().call(vec![product]))
});
registry.register::<NumericMultiplyInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
let millis = to_millis_udf().call(vec![right]);
let product = DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Multiply,
Box::new(millis),
));
Ok(from_millis_udf().call(vec![product]))
});
registry.register::<IntervalDivideNumeric>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
let millis = to_millis_udf().call(vec![left]);
let quotient = DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(millis),
DFOperator::Divide,
Box::new(right),
));
Ok(from_millis_udf().call(vec![quotient]))
});
registry.register::<CalendarIntervalPlusCalendarInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Plus,
Box::new(right),
)))
});
registry.register::<CalendarIntervalMinusCalendarInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Minus,
Box::new(right),
)))
});
registry.register::<CalendarIntervalMultiplyInt>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
let months = to_months_udf().call(vec![left]);
let product = DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(months),
DFOperator::Multiply,
Box::new(right),
));
Ok(from_months_udf().call(vec![product]))
});
registry.register::<IntMultiplyCalendarInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
let months = to_months_udf().call(vec![right]);
let product = DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Multiply,
Box::new(months),
));
Ok(from_months_udf().call(vec![product]))
});
registry.register::<CalendarIntervalDivideInt>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
let months = to_months_udf().call(vec![left]);
let quotient = DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(months),
DFOperator::Divide,
Box::new(right),
));
Ok(from_months_udf().call(vec![quotient]))
});
registry.register::<TimestampPlusInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Plus,
Box::new(right),
)))
});
registry.register::<IntervalPlusTimestamp>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Plus,
Box::new(right),
)))
});
registry.register::<TimestampMinusInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Minus,
Box::new(right),
)))
});
registry.register::<TimestampMinusTimestamp>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Minus,
Box::new(right),
)))
});
registry.register::<TimestampPlusCalendarInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Plus,
Box::new(right),
)))
});
registry.register::<CalendarIntervalPlusTimestamp>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Plus,
Box::new(right),
)))
});
registry.register::<TimestampMinusCalendarInterval>(|mut params| {
let left = params.take_by_name("left")?.expr;
let right = params.take_by_name("right")?.expr;
Ok(DFExpr::BinaryExpr(BinaryExpr::new(
Box::new(left),
DFOperator::Minus,
Box::new(right),
)))
});
}