Skip to content

Commit

Permalink
fix(cubesql): Support Sigma Sunday week granularity
Browse files Browse the repository at this point in the history
  • Loading branch information
MazterQyou committed Jan 15, 2024
1 parent 561604f commit be41669
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 28 deletions.
59 changes: 59 additions & 0 deletions rust/cubesql/cubesql/src/compile/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20197,6 +20197,65 @@ limit
);
}

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

let query_plan = convert_select_to_query_plan(
r#"
select
datetrunc_12 "Week of Event Date",
sum_15 "Active_Events_SUM_Metric"
from (
select
(
date_trunc(
'week',
(
order_date :: timestamptz + cast(1 || ' day' as interval)
)
) + cast(-1 || ' day' as interval)
) datetrunc_12,
sum(count) sum_15
from
"public"."KibanaSampleDataEcommerce" "KibanaSampleDataEcommerce"
group by
(
date_trunc(
'week',
(
order_date :: timestamptz + cast(1 || ' day' as interval)
)
) + cast(-1 || ' day' as interval)
)
) q1
order by
datetrunc_12 asc
limit
25000
"#
.to_string(),
DatabaseProtocol::PostgreSQL,
)
.await;

let physical_plan = query_plan.as_physical_plan().await.unwrap();
println!(
"Physical plan: {}",
displayable(physical_plan.as_ref()).indent()
);

let logical_plan = query_plan.as_logical_plan();
let sql = logical_plan
.find_cube_scan_wrapper()
.wrapped_sql
.unwrap()
.sql;
assert!(sql.contains("DATE_TRUNC("));
assert!(sql.contains("order_date"));
assert!(sql.contains("count"));
}

#[tokio::test]
async fn test_langchain_pgcatalog_schema() -> Result<(), CubeError> {
insta::assert_snapshot!(
Expand Down
23 changes: 13 additions & 10 deletions rust/cubesql/cubesql/src/compile/rewrite/analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1187,16 +1187,19 @@ impl Analysis<LogicalPlanLanguage> for LogicalPlanAnalysis {
if let Some(ConstantFolding::Scalar(c)) = &egraph[id].data.constant {
// TODO: ideally all constants should be aliased, but this requires
// rewrites to extract `.data.constant` instead of `literal_expr`.
let alias_name =
if c.is_null() || matches!(c, ScalarValue::Date32(_) | ScalarValue::Date64(_)) {
egraph[id]
.data
.original_expr
.as_ref()
.map(|expr| expr.name(&DFSchema::empty()).unwrap())
} else {
None
};
let alias_name = if c.is_null()
|| matches!(
c,
ScalarValue::Date32(_) | ScalarValue::Date64(_) | ScalarValue::Utf8(_)
) {
egraph[id]
.data
.original_expr
.as_ref()
.map(|expr| expr.name(&DFSchema::empty()).unwrap())
} else {
None
};
let c = c.clone();
let value = egraph.add(LogicalPlanLanguage::LiteralExprValue(LiteralExprValue(c)));
let literal_expr = egraph.add(LogicalPlanLanguage::LiteralExpr([value]));
Expand Down
28 changes: 15 additions & 13 deletions rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1055,7 +1055,7 @@ impl RewriteRules for FilterRules {
vec!["?expr".to_string(), literal_expr("?literal_length")],
),
"=",
literal_expr("?literal"),
"?literal",
),
"?alias_to_cube",
"?members",
Expand Down Expand Up @@ -1085,7 +1085,7 @@ impl RewriteRules for FilterRules {
vec!["?expr".to_string(), literal_expr("?literal_length")],
),
"=",
literal_expr("?literal"),
"?literal",
),
"?alias_to_cube",
"?members",
Expand All @@ -1111,7 +1111,7 @@ impl RewriteRules for FilterRules {
filter_replacer(
fun_expr(
"StartsWith",
vec![column_expr("?column"), literal_expr("?literal")],
vec![column_expr("?column"), "?literal".to_string()],
),
"?alias_to_cube",
"?members",
Expand All @@ -1136,7 +1136,7 @@ impl RewriteRules for FilterRules {
filter_replacer(
not_expr(fun_expr(
"StartsWith",
vec![column_expr("?column"), literal_expr("?literal")],
vec![column_expr("?column"), "?literal".to_string()],
)),
"?alias_to_cube",
"?members",
Expand All @@ -1161,7 +1161,7 @@ impl RewriteRules for FilterRules {
filter_replacer(
not_expr(udf_expr(
"ends_with",
vec![column_expr("?column"), literal_expr("?literal")],
vec![column_expr("?column"), "?literal".to_string()],
)),
"?alias_to_cube",
"?members",
Expand All @@ -1186,7 +1186,7 @@ impl RewriteRules for FilterRules {
filter_replacer(
udf_expr(
"ends_with",
vec![column_expr("?column"), literal_expr("?literal")],
vec![column_expr("?column"), "?literal".to_string()],
),
"?alias_to_cube",
"?members",
Expand Down Expand Up @@ -1272,7 +1272,7 @@ impl RewriteRules for FilterRules {
udf_expr(
"position",
vec![
literal_expr("?literal"),
"?literal".to_string(),
fun_expr("Lower", vec![column_expr("?column")]),
],
),
Expand Down Expand Up @@ -1304,7 +1304,7 @@ impl RewriteRules for FilterRules {
udf_expr(
"position",
vec![
literal_expr("?literal"),
"?literal".to_string(),
fun_expr("Lower", vec![column_expr("?column")]),
],
),
Expand Down Expand Up @@ -1336,7 +1336,7 @@ impl RewriteRules for FilterRules {
udf_expr(
"position",
vec![
literal_expr("?literal"),
"?literal".to_string(),
fun_expr("Lower", vec![column_expr("?column")]),
],
),
Expand Down Expand Up @@ -1368,7 +1368,7 @@ impl RewriteRules for FilterRules {
udf_expr(
"position",
vec![
literal_expr("?literal"),
"?literal".to_string(),
fun_expr("Lower", vec![column_expr("?column")]),
],
),
Expand Down Expand Up @@ -1400,7 +1400,7 @@ impl RewriteRules for FilterRules {
udf_expr(
"position",
vec![
fun_expr("Reverse", vec![literal_expr("?literal")]),
fun_expr("Reverse", vec!["?literal".to_string()]),
fun_expr(
"Reverse",
vec![fun_expr("Lower", vec![column_expr("?column")])],
Expand Down Expand Up @@ -1435,7 +1435,7 @@ impl RewriteRules for FilterRules {
udf_expr(
"position",
vec![
fun_expr("Reverse", vec![literal_expr("?literal")]),
fun_expr("Reverse", vec!["?literal".to_string()]),
fun_expr(
"Reverse",
vec![fun_expr("Lower", vec![column_expr("?column")])],
Expand Down Expand Up @@ -2955,7 +2955,9 @@ impl FilterRules {
let filter_aliases_var = var!(filter_aliases_var);
let meta_context = self.meta_context.clone();
move |egraph, subst| {
for literal in var_iter!(egraph[subst[literal_var]], LiteralExprValue) {
if let Some(ConstantFolding::Scalar(literal)) =
&egraph[subst[literal_var]].data.constant
{
for aliases in var_iter!(egraph[subst[filter_aliases_var]], FilterReplacerAliases) {
let literal_value = match literal {
ScalarValue::Utf8(Some(literal_value)) => literal_value.to_string(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
source: cubesql/src/compile/mod.rs
expression: "execute_query(\"SELECT regexp_replace('Test test test', 'test')\".to_string(),\n DatabaseProtocol::PostgreSQL).await?"
---
+--------------------+
| Utf8("Test test") |
+--------------------+
| Test test |
+--------------------+
+----------------------------------------------------+
| regexpreplace(Utf8("Test test test"),Utf8("test")) |
+----------------------------------------------------+
| Test test |
+----------------------------------------------------+

0 comments on commit be41669

Please sign in to comment.