use std::sync::Arc;
use crate::expressions::{binary, BinaryExpr, Literal};
use crate::PhysicalExpr;
use arrow_schema::Schema;
use datafusion_common::{DataFusionError, ScalarValue};
use datafusion_expr::Operator;
#[allow(clippy::too_many_arguments)]
pub fn gen_conjunctive_numerical_expr(
left_col: Arc<dyn PhysicalExpr>,
right_col: Arc<dyn PhysicalExpr>,
op: (Operator, Operator, Operator, Operator),
a: ScalarValue,
b: ScalarValue,
c: ScalarValue,
d: ScalarValue,
bounds: (Operator, Operator),
) -> Arc<dyn PhysicalExpr> {
let (op_1, op_2, op_3, op_4) = op;
let left_and_1 = Arc::new(BinaryExpr::new(
left_col.clone(),
op_1,
Arc::new(Literal::new(a)),
));
let left_and_2 = Arc::new(BinaryExpr::new(
right_col.clone(),
op_2,
Arc::new(Literal::new(b)),
));
let right_and_1 =
Arc::new(BinaryExpr::new(left_col, op_3, Arc::new(Literal::new(c))));
let right_and_2 =
Arc::new(BinaryExpr::new(right_col, op_4, Arc::new(Literal::new(d))));
let (greater_op, less_op) = bounds;
let left_expr = Arc::new(BinaryExpr::new(left_and_1, greater_op, left_and_2));
let right_expr = Arc::new(BinaryExpr::new(right_and_1, less_op, right_and_2));
Arc::new(BinaryExpr::new(left_expr, Operator::And, right_expr))
}
#[allow(clippy::too_many_arguments)]
pub fn gen_conjunctive_temporal_expr(
left_col: Arc<dyn PhysicalExpr>,
right_col: Arc<dyn PhysicalExpr>,
op_1: Operator,
op_2: Operator,
op_3: Operator,
op_4: Operator,
a: ScalarValue,
b: ScalarValue,
c: ScalarValue,
d: ScalarValue,
schema: &Schema,
) -> Result<Arc<dyn PhysicalExpr>, DataFusionError> {
let left_and_1 = binary(left_col.clone(), op_1, Arc::new(Literal::new(a)), schema)?;
let left_and_2 = binary(right_col.clone(), op_2, Arc::new(Literal::new(b)), schema)?;
let right_and_1 = binary(left_col, op_3, Arc::new(Literal::new(c)), schema)?;
let right_and_2 = binary(right_col, op_4, Arc::new(Literal::new(d)), schema)?;
let left_expr = Arc::new(BinaryExpr::new(left_and_1, Operator::Gt, left_and_2));
let right_expr = Arc::new(BinaryExpr::new(right_and_1, Operator::Lt, right_and_2));
Ok(Arc::new(BinaryExpr::new(
left_expr,
Operator::And,
right_expr,
)))
}