Skip to content

Commit

Permalink
chore(query): improve new filter execution (#14715)
Browse files Browse the repository at this point in the history
* improve new filter execution

* chore: refine code
  • Loading branch information
Dousir9 committed Feb 23, 2024
1 parent 5c46a27 commit bbcd702
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 46 deletions.
18 changes: 9 additions & 9 deletions src/query/expression/src/filter/select.rs
Expand Up @@ -95,7 +95,7 @@ impl<'a> Selector<'a> {
match left_data_type.remove_nullable() {
DataType::Number(ty) => {
with_number_mapped_type!(|T| match ty {
NumberDataType::T => self.select_type_values::<NumberType<T>>(
NumberDataType::T => self.select_type_values_cmp::<NumberType<T>>(
&op,
left,
right,
Expand All @@ -112,7 +112,7 @@ impl<'a> Selector<'a> {

DataType::Decimal(ty) => {
with_decimal_mapped_type!(|T| match ty {
DecimalDataType::T(_) => self.select_type_values::<DecimalType<T>>(
DecimalDataType::T(_) => self.select_type_values_cmp::<DecimalType<T>>(
&op,
left,
right,
Expand All @@ -126,7 +126,7 @@ impl<'a> Selector<'a> {
),
})
}
DataType::Date => self.select_type_values::<DateType>(
DataType::Date => self.select_type_values_cmp::<DateType>(
&op,
left,
right,
Expand All @@ -138,7 +138,7 @@ impl<'a> Selector<'a> {
select_strategy,
count,
),
DataType::Timestamp => self.select_type_values::<TimestampType>(
DataType::Timestamp => self.select_type_values_cmp::<TimestampType>(
&op,
left,
right,
Expand All @@ -150,7 +150,7 @@ impl<'a> Selector<'a> {
select_strategy,
count,
),
DataType::String => self.select_type_values::<StringType>(
DataType::String => self.select_type_values_cmp::<StringType>(
&op,
left,
right,
Expand All @@ -162,7 +162,7 @@ impl<'a> Selector<'a> {
select_strategy,
count,
),
DataType::Variant => self.select_type_values::<VariantType>(
DataType::Variant => self.select_type_values_cmp::<VariantType>(
&op,
left,
right,
Expand All @@ -174,7 +174,7 @@ impl<'a> Selector<'a> {
select_strategy,
count,
),
DataType::Boolean => self.select_type_values::<BooleanType>(
DataType::Boolean => self.select_type_values_cmp::<BooleanType>(
&op,
left,
right,
Expand All @@ -186,7 +186,7 @@ impl<'a> Selector<'a> {
select_strategy,
count,
),
DataType::EmptyArray => self.select_type_values::<EmptyArrayType>(
DataType::EmptyArray => self.select_type_values_cmp::<EmptyArrayType>(
&op,
left,
right,
Expand All @@ -198,7 +198,7 @@ impl<'a> Selector<'a> {
select_strategy,
count,
),
_ => self.select_type_values::<AnyType>(
_ => self.select_type_values_cmp::<AnyType>(
&op,
left,
right,
Expand Down
17 changes: 17 additions & 0 deletions src/query/expression/src/filter/select_op.rs
Expand Up @@ -53,3 +53,20 @@ impl SelectOp {
}
}
}

#[macro_export]
macro_rules! with_mapped_cmp_method {
( | $t:tt | $($tail:tt)* ) => {
match_template::match_template! {
$t = [
Equal => equal,
NotEqual => not_equal,
Gt => greater_than,
Lt => less_than,
Gte => greater_than_equal,
Lte => less_than_equal,
],
$($tail)*
}
}
}
56 changes: 45 additions & 11 deletions src/query/expression/src/filter/select_value/mod.rs
Expand Up @@ -17,6 +17,7 @@ use databend_common_exception::Result;

use crate::types::AnyType;
use crate::types::ValueType;
use crate::with_mapped_cmp_method;
use crate::SelectOp;
use crate::SelectStrategy;
use crate::Selector;
Expand All @@ -28,7 +29,7 @@ mod select_scalar;

impl<'a> Selector<'a> {
#[allow(clippy::too_many_arguments)]
pub(crate) fn select_type_values<T: ValueType>(
pub(crate) fn select_type_values_cmp<T: ValueType>(
&self,
op: &SelectOp,
left: Value<AnyType>,
Expand All @@ -40,11 +41,44 @@ impl<'a> Selector<'a> {
mutable_false_idx: &mut usize,
select_strategy: SelectStrategy,
count: usize,
) -> Result<usize> {
with_mapped_cmp_method!(|OP| match op {
SelectOp::OP => self.select_type_values::<T, _>(
T::OP,
left,
right,
validity,
true_selection,
false_selection,
mutable_true_idx,
mutable_false_idx,
select_strategy,
count,
),
})
}

#[allow(clippy::too_many_arguments)]
pub(crate) fn select_type_values<
T: ValueType,
C: Fn(T::ScalarRef<'_>, T::ScalarRef<'_>) -> bool,
>(
&self,
cmp: C,
left: Value<AnyType>,
right: Value<AnyType>,
validity: Option<Bitmap>,
true_selection: &mut [u32],
false_selection: (&mut [u32], bool),
mutable_true_idx: &mut usize,
mutable_false_idx: &mut usize,
select_strategy: SelectStrategy,
count: usize,
) -> Result<usize> {
let has_false = false_selection.1;
match (left, right) {
(Value::Scalar(left), Value::Scalar(right)) => self.select_scalars::<T>(
op,
(Value::Scalar(left), Value::Scalar(right)) => self.select_scalars::<T, C>(
cmp,
left,
right,
true_selection,
Expand All @@ -59,8 +93,8 @@ impl<'a> Selector<'a> {
let right = T::try_downcast_column(&right).unwrap();

if has_false {
self.select_columns::<T, true>(
op,
self.select_columns::<T, C, true>(
cmp,
left,
right,
validity,
Expand All @@ -72,8 +106,8 @@ impl<'a> Selector<'a> {
count,
)
} else {
self.select_columns::<T, false>(
op,
self.select_columns::<T, C, false>(
cmp,
left,
right,
validity,
Expand All @@ -93,8 +127,8 @@ impl<'a> Selector<'a> {
let scalar = T::try_downcast_scalar(&scalar).unwrap();

if has_false {
self.select_column_scalar::<T, true>(
op,
self.select_column_scalar::<T, C, true>(
cmp,
column,
scalar,
validity,
Expand All @@ -106,8 +140,8 @@ impl<'a> Selector<'a> {
count,
)
} else {
self.select_column_scalar::<T, false>(
op,
self.select_column_scalar::<T, C, false>(
cmp,
column,
scalar,
validity,
Expand Down
10 changes: 6 additions & 4 deletions src/query/expression/src/filter/select_value/select_column.rs
Expand Up @@ -15,17 +15,20 @@
use databend_common_arrow::arrow::bitmap::Bitmap;
use databend_common_exception::Result;

use crate::filter::SelectOp;
use crate::filter::SelectStrategy;
use crate::filter::Selector;
use crate::types::ValueType;

impl<'a> Selector<'a> {
// Select indices by comparing two columns.
#[allow(clippy::too_many_arguments)]
pub(crate) fn select_columns<T: ValueType, const FALSE: bool>(
pub(crate) fn select_columns<
T: ValueType,
C: Fn(T::ScalarRef<'_>, T::ScalarRef<'_>) -> bool,
const FALSE: bool,
>(
&self,
op: &SelectOp,
cmp: C,
left: T::Column,
right: T::Column,
validity: Option<Bitmap>,
Expand All @@ -39,7 +42,6 @@ impl<'a> Selector<'a> {
let mut true_idx = *mutable_true_idx;
let mut false_idx = *mutable_false_idx;

let cmp = T::compare_operation(op);
match select_strategy {
SelectStrategy::True => unsafe {
let start = *mutable_true_idx;
Expand Down
Expand Up @@ -15,17 +15,20 @@
use databend_common_arrow::arrow::bitmap::Bitmap;
use databend_common_exception::Result;

use crate::filter::SelectOp;
use crate::filter::SelectStrategy;
use crate::filter::Selector;
use crate::types::ValueType;

impl<'a> Selector<'a> {
// Select indices by comparing scalar and column.
#[allow(clippy::too_many_arguments)]
pub(crate) fn select_column_scalar<T: ValueType, const FALSE: bool>(
pub(crate) fn select_column_scalar<
T: ValueType,
C: Fn(T::ScalarRef<'_>, T::ScalarRef<'_>) -> bool,
const FALSE: bool,
>(
&self,
op: &SelectOp,
cmp: C,
column: T::Column,
scalar: T::ScalarRef<'a>,
validity: Option<Bitmap>,
Expand All @@ -39,7 +42,6 @@ impl<'a> Selector<'a> {
let mut true_idx = *mutable_true_idx;
let mut false_idx = *mutable_false_idx;

let cmp = T::compare_operation(op);
match select_strategy {
SelectStrategy::True => unsafe {
let start = *mutable_true_idx;
Expand Down
10 changes: 6 additions & 4 deletions src/query/expression/src/filter/select_value/select_scalar.rs
Expand Up @@ -18,14 +18,16 @@ use crate::filter::SelectStrategy;
use crate::filter::Selector;
use crate::types::ValueType;
use crate::Scalar;
use crate::SelectOp;

impl<'a> Selector<'a> {
#[allow(clippy::too_many_arguments)]
// Select indices by comparing two scalars.
pub(crate) fn select_scalars<T: ValueType>(
pub(crate) fn select_scalars<
T: ValueType,
C: Fn(T::ScalarRef<'_>, T::ScalarRef<'_>) -> bool,
>(
&self,
op: &SelectOp,
cmp: C,
left: Scalar,
right: Scalar,
true_selection: &mut [u32],
Expand All @@ -39,7 +41,7 @@ impl<'a> Selector<'a> {
let left = T::try_downcast_scalar(&left).unwrap();
let right = right.as_ref();
let right = T::try_downcast_scalar(&right).unwrap();
let result = T::compare_operation(op)(left, right);
let result = cmp(left, right);
let count = self.select_boolean_scalar_adapt(
result,
true_selection,
Expand Down
14 changes: 0 additions & 14 deletions src/query/expression/src/types.rs
Expand Up @@ -65,7 +65,6 @@ use crate::values::Column;
use crate::values::Scalar;
use crate::ColumnBuilder;
use crate::ScalarRef;
use crate::SelectOp;

pub type GenericMap = [DataType];

Expand Down Expand Up @@ -384,19 +383,6 @@ pub trait ValueType: Debug + Clone + PartialEq + Sized + 'static {
None
}

/// Return the comparison function for the given select operation, some data types not support comparison.
#[inline(always)]
fn compare_operation(op: &SelectOp) -> fn(Self::ScalarRef<'_>, Self::ScalarRef<'_>) -> bool {
match op {
SelectOp::Equal => Self::equal,
SelectOp::NotEqual => Self::not_equal,
SelectOp::Gt => Self::greater_than,
SelectOp::Gte => Self::greater_than_equal,
SelectOp::Lt => Self::less_than,
SelectOp::Lte => Self::less_than_equal,
}
}

/// Equal comparison between two scalars, some data types not support comparison.
#[inline(always)]
fn equal(left: Self::ScalarRef<'_>, right: Self::ScalarRef<'_>) -> bool {
Expand Down

0 comments on commit bbcd702

Please sign in to comment.