Skip to content

Commit 2b36aae

Browse files
authored
feat(cubesql): Support date_trunc != literal date filter (#9627)
1 parent d3af150 commit 2b36aae

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

rust/cubesql/cubesql/src/compile/mod.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13054,6 +13054,51 @@ ORDER BY "source"."str0" ASC
1305413054
)
1305513055
}
1305613056

13057+
#[tokio::test]
13058+
async fn test_date_trunc_column_not_equals_literal() {
13059+
init_testing_logger();
13060+
13061+
let logical_plan = convert_select_to_query_plan(
13062+
r#"
13063+
SELECT
13064+
avg("avgPrice") AS "avgPrice"
13065+
FROM public."KibanaSampleDataEcommerce"
13066+
WHERE
13067+
DATE_TRUNC('week', "order_date") != str_to_date('2022-11-14 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US')
13068+
"#
13069+
.to_string(),
13070+
DatabaseProtocol::PostgreSQL,
13071+
)
13072+
.await
13073+
.as_logical_plan();
13074+
13075+
assert_eq!(
13076+
logical_plan.find_cube_scan().request,
13077+
V1LoadRequestQuery {
13078+
measures: Some(vec!["KibanaSampleDataEcommerce.avgPrice".to_string()]),
13079+
dimensions: Some(vec![]),
13080+
segments: Some(vec![]),
13081+
order: Some(vec![]),
13082+
filters: Some(vec![V1LoadRequestQueryFilterItem {
13083+
or: Some(vec![
13084+
json!({
13085+
"member": "KibanaSampleDataEcommerce.order_date",
13086+
"operator": "beforeDate",
13087+
"values": ["2022-11-14T00:00:00.000Z"],
13088+
}),
13089+
json!({
13090+
"member": "KibanaSampleDataEcommerce.order_date",
13091+
"operator": "afterOrOnDate",
13092+
"values": ["2022-11-21T00:00:00.000Z"],
13093+
}),
13094+
]),
13095+
..Default::default()
13096+
}]),
13097+
..Default::default()
13098+
}
13099+
)
13100+
}
13101+
1305713102
#[tokio::test]
1305813103
async fn test_psqlodbc_null() -> Result<(), CubeError> {
1305913104
insta::assert_snapshot!(

rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1831,6 +1831,38 @@ impl RewriteRules for FilterRules {
18311831
"?end_date",
18321832
),
18331833
),
1834+
transforming_rewrite(
1835+
"filter-date-trunc-neq-literal",
1836+
filter_replacer(
1837+
binary_expr(
1838+
self.fun_expr(
1839+
"DateTrunc",
1840+
vec!["?granularity".to_string(), column_expr("?column")],
1841+
),
1842+
"!=",
1843+
"?date".to_string(),
1844+
),
1845+
"?alias_to_cube",
1846+
"?members",
1847+
"?filter_aliases",
1848+
),
1849+
filter_replacer(
1850+
binary_expr(
1851+
binary_expr(column_expr("?column"), "<", literal_expr("?start_date")),
1852+
"OR",
1853+
binary_expr(column_expr("?column"), ">=", literal_expr("?end_date")),
1854+
),
1855+
"?alias_to_cube",
1856+
"?members",
1857+
"?filter_aliases",
1858+
),
1859+
self.transform_date_trunc_eq_literal(
1860+
"?granularity",
1861+
"?date",
1862+
"?start_date",
1863+
"?end_date",
1864+
),
1865+
),
18341866
rewrite(
18351867
"between-move-interval-beyond-equal-sign",
18361868
between_expr(

0 commit comments

Comments
 (0)