Skip to content

Commit

Permalink
feat(cubesql): Support Sigma Computing number filters
Browse files Browse the repository at this point in the history
  • Loading branch information
MazterQyou committed Oct 28, 2022
1 parent f568851 commit f2f2abd
Show file tree
Hide file tree
Showing 2 changed files with 243 additions and 0 deletions.
142 changes: 142 additions & 0 deletions rust/cubesql/cubesql/src/compile/mod.rs
Expand Up @@ -13093,4 +13093,146 @@ ORDER BY \"COUNT(count)\" DESC"

Ok(())
}

#[tokio::test]
async fn test_sigma_num_range() {
init_logger();

let logical_plan = convert_select_to_query_plan(
r#"
SELECT taxful_total_price
FROM KibanaSampleDataEcommerce
WHERE (
(
(500 <= taxful_total_price) AND
(10000 >= taxful_total_price)
) OR
(taxful_total_price IS NULL)
)
"#
.to_string(),
DatabaseProtocol::PostgreSQL,
)
.await
.as_logical_plan();

assert_eq!(
logical_plan.find_cube_scan().request,
V1LoadRequestQuery {
measures: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string()
]),
segments: Some(vec![]),
time_dimensions: None,
order: None,
limit: None,
offset: None,
filters: Some(vec![V1LoadRequestQueryFilterItem {
member: None,
operator: None,
values: None,
or: Some(vec![
json!(V1LoadRequestQueryFilterItem {
member: None,
operator: None,
values: None,
or: None,
and: Some(vec![
json!(V1LoadRequestQueryFilterItem {
member: Some(
"KibanaSampleDataEcommerce.taxful_total_price".to_string()
),
operator: Some("gte".to_string()),
values: Some(vec!["500".to_string()]),
or: None,
and: None,
}),
json!(V1LoadRequestQueryFilterItem {
member: Some(
"KibanaSampleDataEcommerce.taxful_total_price".to_string()
),
operator: Some("lte".to_string()),
values: Some(vec!["10000".to_string()]),
or: None,
and: None,
}),
]),
}),
json!(V1LoadRequestQueryFilterItem {
member: Some(
"KibanaSampleDataEcommerce.taxful_total_price".to_string()
),
operator: Some("notSet".to_string()),
values: None,
or: None,
and: None,
}),
]),
and: None,
}]),
}
)
}

#[tokio::test]
async fn test_sigma_num_not_in() {
init_logger();

let logical_plan = convert_select_to_query_plan(
r#"
SELECT taxful_total_price
FROM KibanaSampleDataEcommerce
WHERE (
NOT (taxful_total_price IN (1, 1.1)) OR
(taxful_total_price IS NULL)
)
"#
.to_string(),
DatabaseProtocol::PostgreSQL,
)
.await
.as_logical_plan();

assert_eq!(
logical_plan.find_cube_scan().request,
V1LoadRequestQuery {
measures: Some(vec![]),
dimensions: Some(vec![
"KibanaSampleDataEcommerce.taxful_total_price".to_string()
]),
segments: Some(vec![]),
time_dimensions: None,
order: None,
limit: None,
offset: None,
filters: Some(vec![V1LoadRequestQueryFilterItem {
member: None,
operator: None,
values: None,
or: Some(vec![
json!(V1LoadRequestQueryFilterItem {
member: Some(
"KibanaSampleDataEcommerce.taxful_total_price".to_string()
),
operator: Some("notEquals".to_string()),
values: Some(vec!["1".to_string(), "1.1".to_string()]),
or: None,
and: None,
}),
json!(V1LoadRequestQueryFilterItem {
member: Some(
"KibanaSampleDataEcommerce.taxful_total_price".to_string()
),
operator: Some("notSet".to_string()),
values: None,
or: None,
and: None,
}),
]),
and: None,
}]),
}
)
}
}
101 changes: 101 additions & 0 deletions rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs
Expand Up @@ -338,6 +338,20 @@ impl RewriteRules for FilterRules {
"?filter_values",
),
),
transforming_rewrite(
"filter-replacer-not-in-filter-to-negated-in-filter",
filter_replacer(
not_expr(inlist_expr("?expr", "?list", "?negated")),
"?alias_to_cube",
"?members",
),
filter_replacer(
inlist_expr("?expr", "?list", "?new_negated"),
"?alias_to_cube",
"?members",
),
self.transform_negate_inlist("?negated", "?new_negated"),
),
transforming_rewrite(
"filter-replacer-is-null",
filter_replacer(
Expand Down Expand Up @@ -374,6 +388,20 @@ impl RewriteRules for FilterRules {
false,
),
),
transforming_rewrite(
"filter-replacer-binary-swap",
filter_replacer(
binary_expr(literal_expr("?literal"), "?op", column_expr("?column")),
"?alias_to_cube",
"?members",
),
filter_replacer(
binary_expr(column_expr("?column"), "?new_op", literal_expr("?literal")),
"?alias_to_cube",
"?members",
),
self.transform_filter_binary_swap("?literal", "?op", "?new_op"),
),
rewrite(
"filter-replacer-equals-negation",
filter_replacer(
Expand Down Expand Up @@ -1968,6 +1996,56 @@ impl FilterRules {
}
}

fn transform_filter_binary_swap(
&self,
literal_var: &'static str,
op_var: &'static str,
new_op_var: &'static str,
) -> impl Fn(&mut EGraph<LogicalPlanLanguage, LogicalPlanAnalysis>, &mut Subst) -> bool {
let literal_var = var!(literal_var);
let op_var = var!(op_var);
let new_op_var = var!(new_op_var);
move |egraph, subst| {
for literal in var_iter!(egraph[subst[literal_var]], LiteralExprValue) {
match literal {
ScalarValue::Decimal128(_, _, _)
| ScalarValue::Float32(_)
| ScalarValue::Float64(_)
| ScalarValue::Int8(_)
| ScalarValue::Int16(_)
| ScalarValue::Int32(_)
| ScalarValue::Int64(_)
| ScalarValue::UInt8(_)
| ScalarValue::UInt16(_)
| ScalarValue::UInt32(_)
| ScalarValue::UInt64(_) => (),
_ => continue,
};

for op in var_iter!(egraph[subst[op_var]], BinaryExprOp) {
let new_op = match op {
Operator::Gt => Operator::Lt,
Operator::GtEq => Operator::LtEq,
Operator::Lt => Operator::Gt,
Operator::LtEq => Operator::GtEq,
Operator::Eq => Operator::Eq,
Operator::NotEq => Operator::NotEq,
_ => continue,
};

subst.insert(
new_op_var,
egraph.add(LogicalPlanLanguage::BinaryExprOp(BinaryExprOp(new_op))),
);

return true;
}
}

false
}
}

fn transform_filter_quicksight_case(
&self,
op_var: &'static str,
Expand Down Expand Up @@ -2422,6 +2500,29 @@ impl FilterRules {
}
}

fn transform_negate_inlist(
&self,
negated_var: &'static str,
new_negated_var: &'static str,
) -> impl Fn(&mut EGraph<LogicalPlanLanguage, LogicalPlanAnalysis>, &mut Subst) -> bool {
let negated_var = var!(negated_var);
let new_negated_var = var!(new_negated_var);
move |egraph, subst| {
for negated in var_iter!(egraph[subst[negated_var]], InListExprNegated).cloned() {
subst.insert(
new_negated_var,
egraph.add(LogicalPlanLanguage::InListExprNegated(InListExprNegated(
!negated,
))),
);

return true;
}

false
}
}

fn filter_member_name(
egraph: &EGraph<LogicalPlanLanguage, LogicalPlanAnalysis>,
subst: &Subst,
Expand Down

0 comments on commit f2f2abd

Please sign in to comment.