(ns metabase.query-processor.middleware.validate-temporal-bucketing (:require [metabase.lib.metadata :as lib.metadata] [metabase.lib.util.match :as lib.util.match] [metabase.query-processor.error-type :as qp.error-type] [metabase.query-processor.store :as qp.store] [metabase.query-processor.util.temporal-bucket :as qp.u.temporal-bucket] [metabase.util.i18n :refer [tru]])) | |
Make sure temporal bucketing of Fields (i.e., | (defn validate-temporal-bucketing
[query]
(doseq [[_ id-or-name {:keys [temporal-unit base-type]} :as clause] (lib.util.match/match (:query query) [:field _ (_ :guard :temporal-unit)])]
(let [base-type (if (integer? id-or-name)
(:base-type (lib.metadata/field (qp.store/metadata-provider) id-or-name))
base-type)
valid-units (qp.u.temporal-bucket/valid-units-for-base-type base-type)]
(when-not (valid-units temporal-unit)
(throw (ex-info (tru "Unsupported temporal bucketing: You can''t bucket a {0} Field by {1}."
base-type temporal-unit)
{:type qp.error-type/invalid-query
:field clause
:base-type base-type
:unit temporal-unit
:valid-units valid-units})))))
query) |