diff --git a/src/metabase/query_processor/middleware/parameters/dates.clj b/src/metabase/query_processor/middleware/parameters/dates.clj index 1cf075c89a5d4cfcbf3d27837cbf2b0739b62305..07314fb2a6eec89bb9ea35edb9175b6f9622f58c 100644 --- a/src/metabase/query_processor/middleware/parameters/dates.clj +++ b/src/metabase/query_processor/middleware/parameters/dates.clj @@ -113,15 +113,15 @@ ;; e.g. past30days = past 30 days, not including partial data for today ({:include-current false}) ;; past30days~ = past 30 days, *including* partial data for today ({:include-current true}) {:parser (regex->parser #"past([0-9]+)(day|week|month|year)s(~?)", [:int-value :unit :include-current?]) - :range (fn [{:keys [unit int-value unit-range to-period]} dt] + :range (fn [{:keys [unit int-value unit-range to-period include-current?]} dt] (unit-range (t/minus dt (to-period int-value)) - (t/minus dt (to-period 1)))) + (t/minus dt (to-period (if (seq include-current?) 0 1))))) :filter (fn [{:keys [unit int-value include-current?]} field] ["TIME_INTERVAL" field (- int-value) unit {:include-current (boolean (seq include-current?))}])} - {:parser (regex->parser #"next([0-9]+)(day|week|month|year)s" [:int-value :unit]) - :range (fn [{:keys [unit int-value unit-range to-period]} dt] - (unit-range (t/plus dt (to-period 1)) + {:parser (regex->parser #"next([0-9]+)(day|week|month|year)s(~?)" [:int-value :unit :include-current?]) + :range (fn [{:keys [unit int-value unit-range to-period include-current?]} dt] + (unit-range (t/plus dt (to-period (if (seq include-current?) 0 1))) (t/plus dt (to-period int-value)))) :filter (fn [{:keys [unit int-value]} field] ["TIME_INTERVAL" field int-value unit])} diff --git a/test/metabase/query_processor/middleware/parameters/date_test.clj b/test/metabase/query_processor/middleware/parameters/date_test.clj index 5fac33a70ff7d230344d5b527c5c5b4a1dbe8a1e..dd0ed9b2f20bc2eeb0b823ba784284761c2390e4 100644 --- a/test/metabase/query_processor/middleware/parameters/date_test.clj +++ b/test/metabase/query_processor/middleware/parameters/date_test.clj @@ -18,19 +18,25 @@ (expect {:end "2016-04-18"} (test-date->range "~2016-04-18")) (expect {:end "2016-06-06", :start "2016-06-04"} (test-date->range "past3days")) +(expect {:end "2016-06-07", :start "2016-06-04"} (test-date->range "past3days~")) (expect {:end "2016-06-06", :start "2016-05-31"} (test-date->range "past7days")) (expect {:end "2016-06-06", :start "2016-05-08"} (test-date->range "past30days")) (expect {:end "2016-05-31", :start "2016-04-01"} (test-date->range "past2months")) +(expect {:end "2016-06-30", :start "2016-04-01"} (test-date->range "past2months~")) (expect {:end "2016-05-31", :start "2015-05-01"} (test-date->range "past13months")) (expect {:end "2015-12-31", :start "2015-01-01"} (test-date->range "past1years")) +(expect {:end "2016-12-31", :start "2015-01-01"} (test-date->range "past1years~")) (expect {:end "2015-12-31", :start "2000-01-01"} (test-date->range "past16years")) (expect {:end "2016-06-10", :start "2016-06-08"} (test-date->range "next3days")) +(expect {:end "2016-06-10", :start "2016-06-07"} (test-date->range "next3days~")) (expect {:end "2016-06-14", :start "2016-06-08"} (test-date->range "next7days")) (expect {:end "2016-07-07", :start "2016-06-08"} (test-date->range "next30days")) (expect {:end "2016-08-31", :start "2016-07-01"} (test-date->range "next2months")) +(expect {:end "2016-08-31", :start "2016-06-01"} (test-date->range "next2months~")) (expect {:end "2017-07-31", :start "2016-07-01"} (test-date->range "next13months")) (expect {:end "2017-12-31", :start "2017-01-01"} (test-date->range "next1years")) +(expect {:end "2017-12-31", :start "2016-01-01"} (test-date->range "next1years~")) (expect {:end "2032-12-31", :start "2017-01-01"} (test-date->range "next16years")) (expect {:end "2016-06-07", :start "2016-06-07"} (test-date->range "thisday"))