@@ -9541,6 +9541,136 @@ ORDER BY "source"."str0" ASC
95419541 )
95429542 }
95439543
9544+ #[tokio::test]
9545+ async fn test_filter_extract_by_year_and_week() {
9546+ init_testing_logger();
9547+
9548+ async fn assert_week_result(week: i32, start_date: &str, end_date: &str) {
9549+ let query_plan = convert_select_to_query_plan(
9550+ format!(r#"
9551+ SELECT COUNT(*) AS "count",
9552+ EXTRACT(YEAR FROM "KibanaSampleDataEcommerce"."order_date") AS "yr:completedAt:ok"
9553+ FROM "public"."KibanaSampleDataEcommerce" "KibanaSampleDataEcommerce"
9554+ WHERE EXTRACT(YEAR FROM "KibanaSampleDataEcommerce"."order_date") = 2019
9555+ AND EXTRACT(WEEK FROM "KibanaSampleDataEcommerce"."order_date") = {}
9556+ GROUP BY 2
9557+ "#, week),
9558+ DatabaseProtocol::PostgreSQL,
9559+ ).await;
9560+
9561+ assert_eq!(
9562+ query_plan.as_logical_plan().find_cube_scan().request,
9563+ V1LoadRequestQuery {
9564+ measures: Some(vec!["KibanaSampleDataEcommerce.count".to_string()]),
9565+ dimensions: Some(vec![]),
9566+ segments: Some(vec![]),
9567+ time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
9568+ dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
9569+ granularity: Some("year".to_string()),
9570+ date_range: Some(json!(vec![start_date, end_date])),
9571+ },]),
9572+ order: Some(vec![]),
9573+ ..Default::default()
9574+ }
9575+ )
9576+ }
9577+
9578+ // Test week 1 (first week of 2019)
9579+ // In 2019, January 1 is a Tuesday, so ISO week 1 starts on Monday, December 31, 2018
9580+ // But since our range is constrained to 2019, it should be Jan 1-6
9581+ assert_week_result(1, "2019-01-01", "2019-01-06").await;
9582+
9583+ // Test week 15 (mid-April)
9584+ // Week 15 of 2019 is April 8-14
9585+ assert_week_result(15, "2019-04-08", "2019-04-14").await;
9586+
9587+ // Test week 52 (end of year)
9588+ // Week 52 of 2019 is December 23-29
9589+ assert_week_result(52, "2019-12-23", "2019-12-29").await;
9590+ }
9591+
9592+ #[tokio::test]
9593+ async fn test_filter_extract_by_year_and_week_with_trunc() {
9594+ init_testing_logger();
9595+
9596+ let logical_plan = convert_select_to_query_plan(
9597+ r#"
9598+ SELECT
9599+ COUNT(*) AS "count",
9600+ EXTRACT(YEAR FROM "KibanaSampleDataEcommerce"."order_date") AS "yr:completedAt:ok"
9601+ FROM "public"."KibanaSampleDataEcommerce" "KibanaSampleDataEcommerce"
9602+ WHERE EXTRACT(YEAR FROM "KibanaSampleDataEcommerce"."order_date") = 2019
9603+ AND CAST(TRUNC(EXTRACT(WEEK FROM "KibanaSampleDataEcommerce"."order_date")) AS INTEGER) = 15
9604+ GROUP BY 2
9605+ "#
9606+ .to_string(),
9607+ DatabaseProtocol::PostgreSQL,
9608+ )
9609+ .await
9610+ .as_logical_plan();
9611+
9612+ assert_eq!(
9613+ logical_plan.find_cube_scan().request,
9614+ V1LoadRequestQuery {
9615+ measures: Some(vec!["KibanaSampleDataEcommerce.count".to_string()]),
9616+ dimensions: Some(vec![]),
9617+ segments: Some(vec![]),
9618+ time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
9619+ dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
9620+ granularity: Some("year".to_string()),
9621+ date_range: Some(json!(vec![
9622+ "2019-04-08".to_string(),
9623+ "2019-04-14".to_string(),
9624+ ])),
9625+ },]),
9626+ order: Some(vec![]),
9627+ ..Default::default()
9628+ }
9629+ )
9630+ }
9631+
9632+ #[tokio::test]
9633+ async fn test_filter_date_part_by_year_quarter_month_week() {
9634+ init_testing_logger();
9635+
9636+ let logical_plan = convert_select_to_query_plan(
9637+ r#"
9638+ SELECT
9639+ COUNT(*) AS "count",
9640+ DATE_PART('year', "KibanaSampleDataEcommerce"."order_date") AS "yr:completedAt:ok"
9641+ FROM "public"."KibanaSampleDataEcommerce" "KibanaSampleDataEcommerce"
9642+ WHERE DATE_PART('year', "KibanaSampleDataEcommerce"."order_date") = 2019
9643+ AND DATE_PART('quarter', "KibanaSampleDataEcommerce"."order_date") = 2
9644+ AND DATE_PART('month', "KibanaSampleDataEcommerce"."order_date") = 4
9645+ AND DATE_PART('week', "KibanaSampleDataEcommerce"."order_date") = 15
9646+ GROUP BY 2
9647+ "#
9648+ .to_string(),
9649+ DatabaseProtocol::PostgreSQL,
9650+ )
9651+ .await
9652+ .as_logical_plan();
9653+
9654+ assert_eq!(
9655+ logical_plan.find_cube_scan().request,
9656+ V1LoadRequestQuery {
9657+ measures: Some(vec!["KibanaSampleDataEcommerce.count".to_string()]),
9658+ dimensions: Some(vec![]),
9659+ segments: Some(vec![]),
9660+ time_dimensions: Some(vec![V1LoadRequestQueryTimeDimension {
9661+ dimension: "KibanaSampleDataEcommerce.order_date".to_string(),
9662+ granularity: Some("year".to_string()),
9663+ date_range: Some(json!(vec![
9664+ "2019-04-08".to_string(),
9665+ "2019-04-14".to_string(),
9666+ ])),
9667+ },]),
9668+ order: Some(vec![]),
9669+ ..Default::default()
9670+ }
9671+ )
9672+ }
9673+
95449674 #[tokio::test]
95459675 async fn test_tableau_filter_extract_by_year() {
95469676 init_testing_logger();
0 commit comments