Utility function for server side relative datetime computation. | (ns metabase.query-processor.util.relative-datetime (:require [java-time.api :as t] [metabase.driver.sql.query-processor :as sql.qp] [metabase.query-processor.timezone :as qp.timezone] [metabase.util.date-2 :as u.date] [metabase.util.honey-sql-2 :as h2x])) |
Check whether :relative-datetime clause could be computed server side. True for [[u.date/add-units]] greater than or equal to day. | (defn- use-server-side-relative-datetime? [unit] (contains? #{:day :week :month :quarter :year} unit)) |
(defn- maybe-truncate-dt-value [dt col-base-type] (condp #(isa? %2 %1) col-base-type :type/DateTimeWithTZ dt :type/DateTime (t/local-date-time dt) :type/Date (t/local-date dt))) | |
Compute relative datetime from [[qp.timezone/now]] shifted by | (defn- relative-datetime-sql-str [unit amount base-type] (-> (qp.timezone/now) (u.date/truncate unit) (u.date/add unit amount) (maybe-truncate-dt-value base-type) (u.date/format-sql))) |
Return honeysql form for relative datetime clasue, that is cacheable -- values of Adjust the values to type of the column that is used in comparison to relative-datetime using | (defn maybe-cacheable-relative-datetime-honeysql [driver unit amount & {:keys [base-type database-type] :or {base-type :type/DateTimeWithTZ database-type "timestamp"}}] (if (use-server-side-relative-datetime? unit) (h2x/cast database-type (relative-datetime-sql-str unit amount base-type)) ((get-method sql.qp/->honeysql [:sql :relative-datetime]) driver [:relative-datetime amount unit]))) |