use vortex_error::VortexResult;
use crate::ArrayRef;
use crate::ExecutionCtx;
use crate::array::ArrayView;
use crate::array::VTable;
use crate::arrays::scalar_fn::ExactScalarFn;
use crate::arrays::scalar_fn::ScalarFnArrayView;
use crate::kernel::ExecuteParentKernel;
use crate::optimizer::rules::ArrayParentReduceRule;
use crate::scalar_fn::fns::not::Not as NotExpr;
pub trait NotReduce: VTable {
fn invert(array: ArrayView<'_, Self>) -> VortexResult<Option<ArrayRef>>;
}
pub trait NotKernel: VTable {
fn invert(array: ArrayView<'_, Self>, ctx: &mut ExecutionCtx)
-> VortexResult<Option<ArrayRef>>;
}
#[derive(Default, Debug)]
pub struct NotReduceAdaptor<V>(pub V);
impl<V> ArrayParentReduceRule<V> for NotReduceAdaptor<V>
where
V: NotReduce,
{
type Parent = ExactScalarFn<NotExpr>;
fn reduce_parent(
&self,
array: ArrayView<'_, V>,
_parent: ScalarFnArrayView<'_, NotExpr>,
_child_idx: usize,
) -> VortexResult<Option<ArrayRef>> {
<V as NotReduce>::invert(array)
}
}
#[derive(Default, Debug)]
pub struct NotExecuteAdaptor<V>(pub V);
impl<V> ExecuteParentKernel<V> for NotExecuteAdaptor<V>
where
V: NotKernel,
{
type Parent = ExactScalarFn<NotExpr>;
fn execute_parent(
&self,
array: ArrayView<'_, V>,
_parent: ScalarFnArrayView<'_, NotExpr>,
_child_idx: usize,
ctx: &mut ExecutionCtx,
) -> VortexResult<Option<ArrayRef>> {
<V as NotKernel>::invert(array, ctx)
}
}