(ns metabase.query-processor.middleware.check-features (:require [metabase.driver :as driver] [metabase.driver.util :as driver.u] [metabase.legacy-mbql.schema :as mbql.s] [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.util :as u] [metabase.util.i18n :refer [tru]])) | |
Assert that the driver/database supports keyword | (defn assert-driver-supports [feature] (let [database (lib.metadata/database (qp.store/metadata-provider))] (when-not (driver.u/supports? driver/*driver* feature database) (throw (ex-info (tru "{0} is not supported by {1} driver." (name feature) (name driver/*driver*)) {:type qp.error-type/unsupported-feature :feature feature :driver driver/*driver*}))))) |
TODO - definitely a little incomplete. It would be cool if we cool look at the metadata in the schema namespace and auto-generate this logic | (defn- query->required-features [query] (into #{} (lib.util.match/match (:query query) :stddev :standard-deviation-aggregations (join :guard (every-pred map? (comp mbql.s/join-strategies :strategy))) (let [{:keys [strategy]} join] (assert-driver-supports strategy))))) |
Middleware that checks that drivers support the | (defn check-features [{query-type :type, :as query}] (if-not (= query-type :query) query (u/prog1 query (doseq [required-feature (query->required-features query)] (assert-driver-supports required-feature))))) |