use vortex_error::VortexResult;
use super::Dict;
use super::DictArray;
use crate::ArrayRef;
use crate::Canonical;
use crate::ExecutionCtx;
use crate::IntoArray;
use crate::array::ArrayView;
use crate::arrays::ConstantArray;
use crate::arrays::dict::DictArrayExt;
use crate::arrays::dict::DictArraySlotsExt;
use crate::builtins::ArrayBuiltins;
use crate::scalar_fn::fns::binary::CompareKernel;
use crate::scalar_fn::fns::operators::CompareOperator;
use crate::scalar_fn::fns::operators::Operator;
impl CompareKernel for Dict {
fn compare(
lhs: ArrayView<'_, Dict>,
rhs: &ArrayRef,
operator: CompareOperator,
ctx: &mut ExecutionCtx,
) -> VortexResult<Option<ArrayRef>> {
if lhs.values().len() > lhs.codes().len() {
return Ok(None);
}
if let Some(rhs) = rhs.as_constant() {
let compare_result = lhs.values().clone().binary(
ConstantArray::new(rhs, lhs.values().len()).into_array(),
Operator::from(operator),
)?;
let result = unsafe {
DictArray::new_unchecked(lhs.codes().clone(), compare_result)
.set_all_values_referenced(lhs.has_all_values_referenced())
.into_array()
};
return Ok(Some(result.execute::<Canonical>(ctx)?.into_array()));
}
Ok(None)
}
}