use crate::arrow::array::{ArrayRef, BooleanArray, RecordBatch};
use crate::expressions::{
Expression, OpaqueExpressionOp, OpaquePredicateOp, Predicate, Scalar, ScalarExpressionEvaluator,
};
use crate::kernel_predicates::{
DirectDataSkippingPredicateEvaluator, DirectPredicateEvaluator,
IndirectDataSkippingPredicateEvaluator,
};
use crate::schema::DataType;
use crate::{DeltaResult, DynPartialEq};
pub trait ArrowOpaqueExpressionOp: DynPartialEq + std::fmt::Debug {
fn eval_expr(
&self,
args: &[Expression],
batch: &RecordBatch,
result_type: Option<&DataType>,
) -> DeltaResult<ArrayRef>;
fn name(&self) -> &str;
fn eval_expr_scalar(
&self,
eval_expr: &ScalarExpressionEvaluator<'_>,
exprs: &[Expression],
) -> DeltaResult<Scalar>;
}
pub trait ArrowOpaquePredicateOp: DynPartialEq + std::fmt::Debug {
fn eval_pred(
&self,
args: &[Expression],
batch: &RecordBatch,
inverted: bool,
) -> DeltaResult<BooleanArray>;
fn name(&self) -> &str;
fn eval_pred_scalar(
&self,
eval_expr: &ScalarExpressionEvaluator<'_>,
eval_pred: &DirectPredicateEvaluator<'_>,
exprs: &[Expression],
inverted: bool,
) -> DeltaResult<Option<bool>>;
fn eval_as_data_skipping_predicate(
&self,
predicate_evaluator: &DirectDataSkippingPredicateEvaluator<'_>,
exprs: &[Expression],
inverted: bool,
) -> Option<bool>;
fn as_data_skipping_predicate(
&self,
predicate_evaluator: &IndirectDataSkippingPredicateEvaluator<'_>,
exprs: &[Expression],
inverted: bool,
) -> Option<Predicate>;
}
pub trait ArrowOpaqueExpression {
fn arrow_opaque(
op: impl ArrowOpaqueExpressionOp,
exprs: impl IntoIterator<Item = Expression>,
) -> Expression;
}
impl ArrowOpaqueExpression for Expression {
fn arrow_opaque(
op: impl ArrowOpaqueExpressionOp,
exprs: impl IntoIterator<Item = Expression>,
) -> Expression {
Expression::opaque(ArrowOpaqueExpressionOpAdaptor(Box::new(op)), exprs)
}
}
pub trait ArrowOpaquePredicate {
fn arrow_opaque<T: ArrowOpaquePredicateOp>(
op: T,
exprs: impl IntoIterator<Item = Expression>,
) -> Predicate;
}
impl ArrowOpaquePredicate for Predicate {
fn arrow_opaque<T: ArrowOpaquePredicateOp>(
op: T,
exprs: impl IntoIterator<Item = Expression>,
) -> Predicate {
Predicate::opaque(ArrowOpaquePredicateOpAdaptor(Box::new(op)), exprs)
}
}
#[derive(Debug)]
pub(crate) struct ArrowOpaqueExpressionOpAdaptor(Box<dyn ArrowOpaqueExpressionOp>);
impl std::ops::Deref for ArrowOpaqueExpressionOpAdaptor {
type Target = dyn ArrowOpaqueExpressionOp;
fn deref(&self) -> &Self::Target {
self.0.deref()
}
}
impl PartialEq for ArrowOpaqueExpressionOpAdaptor {
fn eq(&self, other: &Self) -> bool {
(**self).dyn_eq(other.any_ref())
}
}
impl OpaqueExpressionOp for ArrowOpaqueExpressionOpAdaptor {
fn name(&self) -> &str {
(**self).name()
}
fn eval_expr_scalar(
&self,
eval_expr: &ScalarExpressionEvaluator<'_>,
exprs: &[Expression],
) -> DeltaResult<Scalar> {
(**self).eval_expr_scalar(eval_expr, exprs)
}
}
#[derive(Debug)]
pub(crate) struct ArrowOpaquePredicateOpAdaptor(Box<dyn ArrowOpaquePredicateOp>);
impl std::ops::Deref for ArrowOpaquePredicateOpAdaptor {
type Target = dyn ArrowOpaquePredicateOp;
fn deref(&self) -> &Self::Target {
self.0.deref()
}
}
impl PartialEq for ArrowOpaquePredicateOpAdaptor {
fn eq(&self, other: &Self) -> bool {
(**self).dyn_eq(other.any_ref())
}
}
impl OpaquePredicateOp for ArrowOpaquePredicateOpAdaptor {
fn name(&self) -> &str {
(**self).name()
}
fn eval_pred_scalar(
&self,
eval_expr: &ScalarExpressionEvaluator<'_>,
eval_pred: &DirectPredicateEvaluator<'_>,
exprs: &[Expression],
inverted: bool,
) -> DeltaResult<Option<bool>> {
(**self).eval_pred_scalar(eval_expr, eval_pred, exprs, inverted)
}
fn eval_as_data_skipping_predicate(
&self,
predicate_evaluator: &DirectDataSkippingPredicateEvaluator<'_>,
exprs: &[Expression],
inverted: bool,
) -> Option<bool> {
(**self).eval_as_data_skipping_predicate(predicate_evaluator, exprs, inverted)
}
fn as_data_skipping_predicate(
&self,
predicate_evaluator: &IndirectDataSkippingPredicateEvaluator<'_>,
exprs: &[Expression],
inverted: bool,
) -> Option<Predicate> {
(**self).as_data_skipping_predicate(predicate_evaluator, exprs, inverted)
}
}