diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs index 1a70f8e871a0c..f859ef2e31c9f 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs @@ -4224,7 +4224,7 @@ impl FilterRules { { swap_left_and_right = false; } else if valid_left_filters.contains(date_range_end_op) - || valid_right_filters.contains(date_range_start_op) + && valid_right_filters.contains(date_range_start_op) { swap_left_and_right = true; } else { diff --git a/rust/cubesql/cubesql/src/compile/test/mod.rs b/rust/cubesql/cubesql/src/compile/test/mod.rs index 411bd05f26bef..cc62e88d7b897 100644 --- a/rust/cubesql/cubesql/src/compile/test/mod.rs +++ b/rust/cubesql/cubesql/src/compile/test/mod.rs @@ -34,6 +34,8 @@ pub mod test_cube_join_grouped; #[cfg(test)] pub mod test_df_execution; #[cfg(test)] +pub mod test_filters; +#[cfg(test)] pub mod test_introspection; #[cfg(test)] pub mod test_udfs; diff --git a/rust/cubesql/cubesql/src/compile/test/test_filters.rs b/rust/cubesql/cubesql/src/compile/test/test_filters.rs new file mode 100644 index 0000000000000..096cabbb282aa --- /dev/null +++ b/rust/cubesql/cubesql/src/compile/test/test_filters.rs @@ -0,0 +1,62 @@ +use cubeclient::models::{V1LoadRequestQuery, V1LoadRequestQueryFilterItem}; +use pretty_assertions::assert_eq; + +use crate::compile::{ + rewrite::rewriter::Rewriter, + test::{convert_select_to_query_plan, init_testing_logger, utils::LogicalPlanTestUtils}, + DatabaseProtocol, +}; + +#[tokio::test] +async fn test_filter_date_greated_and_not_null() { + if !Rewriter::sql_push_down_enabled() { + return; + } + init_testing_logger(); + + let query_plan = convert_select_to_query_plan( + // language=PostgreSQL + r#" +SELECT + dim_str0 +FROM MultiTypeCube +WHERE + (dim_date0 IS NOT NULL) + AND (dim_date0 > '2019-01-01 00:00:00') +GROUP BY + dim_str0 +; +"# + .to_string(), + DatabaseProtocol::PostgreSQL, + ) + .await; + + let logical_plan = query_plan.as_logical_plan(); + assert_eq!( + logical_plan.find_cube_scan().request, + V1LoadRequestQuery { + measures: Some(vec![]), + dimensions: Some(vec!["MultiTypeCube.dim_str0".to_string()]), + segments: Some(vec![]), + order: Some(vec![]), + filters: Some(vec![ + V1LoadRequestQueryFilterItem { + member: Some("MultiTypeCube.dim_date0".to_string()), + operator: Some("set".to_string()), + values: None, + or: None, + and: None, + }, + V1LoadRequestQueryFilterItem { + member: Some("MultiTypeCube.dim_date0".to_string()), + operator: Some("afterDate".to_string()), + values: Some(vec!["2019-01-01 00:00:00".to_string()]), + or: None, + and: None, + }, + ],), + ..Default::default() + } + ); +}