diff --git a/rust/cubesql/cubesql/src/compile/mod.rs b/rust/cubesql/cubesql/src/compile/mod.rs index 05872f40b26d0..95f14b8a098f1 100644 --- a/rust/cubesql/cubesql/src/compile/mod.rs +++ b/rust/cubesql/cubesql/src/compile/mod.rs @@ -13054,6 +13054,51 @@ ORDER BY "source"."str0" ASC ) } + #[tokio::test] + async fn test_date_trunc_column_not_equals_literal() { + init_testing_logger(); + + let logical_plan = convert_select_to_query_plan( + r#" + SELECT + avg("avgPrice") AS "avgPrice" + FROM public."KibanaSampleDataEcommerce" + WHERE + DATE_TRUNC('week', "order_date") != str_to_date('2022-11-14 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.US') + "# + .to_string(), + DatabaseProtocol::PostgreSQL, + ) + .await + .as_logical_plan(); + + assert_eq!( + logical_plan.find_cube_scan().request, + V1LoadRequestQuery { + measures: Some(vec!["KibanaSampleDataEcommerce.avgPrice".to_string()]), + dimensions: Some(vec![]), + segments: Some(vec![]), + order: Some(vec![]), + filters: Some(vec![V1LoadRequestQueryFilterItem { + or: Some(vec![ + json!({ + "member": "KibanaSampleDataEcommerce.order_date", + "operator": "beforeDate", + "values": ["2022-11-14T00:00:00.000Z"], + }), + json!({ + "member": "KibanaSampleDataEcommerce.order_date", + "operator": "afterOrOnDate", + "values": ["2022-11-21T00:00:00.000Z"], + }), + ]), + ..Default::default() + }]), + ..Default::default() + } + ) + } + #[tokio::test] async fn test_psqlodbc_null() -> Result<(), CubeError> { insta::assert_snapshot!( diff --git a/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs b/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs index 2e13f12aced64..a9c425c1fa3d5 100644 --- a/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs +++ b/rust/cubesql/cubesql/src/compile/rewrite/rules/filters.rs @@ -1831,6 +1831,38 @@ impl RewriteRules for FilterRules { "?end_date", ), ), + transforming_rewrite( + "filter-date-trunc-neq-literal", + filter_replacer( + binary_expr( + self.fun_expr( + "DateTrunc", + vec!["?granularity".to_string(), column_expr("?column")], + ), + "!=", + "?date".to_string(), + ), + "?alias_to_cube", + "?members", + "?filter_aliases", + ), + filter_replacer( + binary_expr( + binary_expr(column_expr("?column"), "<", literal_expr("?start_date")), + "OR", + binary_expr(column_expr("?column"), ">=", literal_expr("?end_date")), + ), + "?alias_to_cube", + "?members", + "?filter_aliases", + ), + self.transform_date_trunc_eq_literal( + "?granularity", + "?date", + "?start_date", + "?end_date", + ), + ), rewrite( "between-move-interval-beyond-equal-sign", between_expr(