Skip to content

Commit 757c4c5

Browse files
committed
fix(cubesql): Fix time dimension range filter chaining with OR operator
1 parent 96c1549 commit 757c4c5

File tree

2 files changed

+77
-4
lines changed

2 files changed

+77
-4
lines changed

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

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22794,4 +22794,72 @@ LIMIT {{ limit }}{% endif %}"#.to_string(),
2279422794
}
2279522795
);
2279622796
}
22797+
22798+
#[tokio::test]
22799+
async fn test_time_dimension_range_filter_chain_or() {
22800+
init_logger();
22801+
22802+
let logical_plan = convert_select_to_query_plan(
22803+
r#"
22804+
SELECT
22805+
"customer_gender",
22806+
date_trunc('day', "order_date") AS "order_date"
22807+
FROM "KibanaSampleDataEcommerce"
22808+
WHERE
22809+
("order_date" >= '2019-01-01 00:00:00.0' AND "order_date" < '2020-01-01 00:00:00.0')
22810+
OR ("order_date" >= '2021-01-01 00:00:00.0' AND "order_date" < '2022-01-01 00:00:00.0')
22811+
GROUP BY 1, 2
22812+
"#
22813+
.to_string(),
22814+
DatabaseProtocol::PostgreSQL,
22815+
)
22816+
.await
22817+
.as_logical_plan();
22818+
22819+
assert_eq!(
22820+
logical_plan.find_cube_scan().request,
22821+
V1LoadRequestQuery {
22822+
measures: Some(vec![]),
22823+
dimensions: Some(vec!["KibanaSampleDataEcommerce.customer_gender".to_string()]),
22824+
segments: Some(vec![]),
22825+
time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
22826+
dimension: "KibanaSampleDataEcommerce.order_date".to_owned(),
22827+
granularity: Some("day".to_owned()),
22828+
date_range: None
22829+
}]),
22830+
order: None,
22831+
limit: None,
22832+
offset: None,
22833+
filters: Some(vec![V1LoadRequestQueryFilterItem {
22834+
member: None,
22835+
operator: None,
22836+
values: None,
22837+
or: Some(vec![
22838+
json!(V1LoadRequestQueryFilterItem {
22839+
member: Some("KibanaSampleDataEcommerce.order_date".to_string()),
22840+
operator: Some("inDateRange".to_string()),
22841+
values: Some(vec![
22842+
"2019-01-01 00:00:00.0".to_string(),
22843+
"2020-01-01 00:00:00.0".to_string(),
22844+
]),
22845+
or: None,
22846+
and: None,
22847+
}),
22848+
json!(V1LoadRequestQueryFilterItem {
22849+
member: Some("KibanaSampleDataEcommerce.order_date".to_string()),
22850+
operator: Some("inDateRange".to_string()),
22851+
values: Some(vec![
22852+
"2021-01-01 00:00:00.0".to_string(),
22853+
"2022-01-01 00:00:00.0".to_string(),
22854+
]),
22855+
or: None,
22856+
and: None,
22857+
}),
22858+
]),
22859+
and: None
22860+
}]),
22861+
ungrouped: None,
22862+
}
22863+
)
22864+
}
2279722865
}

rust/cubesql/cubesql/src/compile/rewrite/converter.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,6 +1735,7 @@ impl LanguageToLogicalPlanConverter {
17351735
query_time_dimensions: &mut Vec<V1LoadRequestQueryTimeDimension>,
17361736
filters: Vec<LogicalPlanLanguage>,
17371737
node_by_id: &impl Index<Id, Output = LogicalPlanLanguage>,
1738+
is_in_and_or: bool,
17381739
) -> Result<
17391740
(
17401741
Vec<V1LoadRequestQueryFilterItem>,
@@ -1757,8 +1758,12 @@ impl LanguageToLogicalPlanConverter {
17571758
);
17581759
let op =
17591760
match_data_node!(node_by_id, params[1], FilterOpOp);
1760-
let (filters, segments, change_user) =
1761-
to_filter(query_time_dimensions, filters, node_by_id)?;
1761+
let (filters, segments, change_user) = to_filter(
1762+
query_time_dimensions,
1763+
filters,
1764+
node_by_id,
1765+
true,
1766+
)?;
17621767
match op.as_str() {
17631768
"and" => {
17641769
result.push(V1LoadRequestQueryFilterItem {
@@ -1822,7 +1827,7 @@ impl LanguageToLogicalPlanConverter {
18221827
params[2],
18231828
FilterMemberValues
18241829
);
1825-
if op == "inDateRange" {
1830+
if !is_in_and_or && op == "inDateRange" {
18261831
let existing_time_dimension =
18271832
query_time_dimensions.iter_mut().find_map(|td| {
18281833
if td.dimension == member
@@ -1886,7 +1891,7 @@ impl LanguageToLogicalPlanConverter {
18861891
}
18871892

18881893
let (filters, segments, change_user) =
1889-
to_filter(&mut query_time_dimensions, filters, node_by_id)?;
1894+
to_filter(&mut query_time_dimensions, filters, node_by_id, false)?;
18901895

18911896
query.filters = if filters.len() > 0 {
18921897
Some(filters)

0 commit comments

Comments
 (0)