Compare commits

...

1 Commits

Author SHA1 Message Date
John Swanson
543fc371a4 prototype 1: make change in query execution (metabase) 2025-02-19 14:22:03 -08:00
3 changed files with 43 additions and 4 deletions

View File

@@ -1,5 +1,7 @@
(ns metabase.query-processor.execute
(:require
[metabase.api.common :as api]
[metabase.lib.metadata :as lib.metadata]
[metabase.lib.schema.id :as lib.schema.id]
[metabase.query-processor.middleware.cache :as cache]
[metabase.query-processor.middleware.enterprise :as qp.middleware.enterprise]
@@ -8,10 +10,12 @@
[metabase.query-processor.pipeline :as qp.pipeline]
[metabase.query-processor.schema :as qp.schema]
[metabase.query-processor.setup :as qp.setup]
[metabase.query-processor.store :as qp.store]
[metabase.query-processor.util :as qp.util]
[metabase.util :as u]
[metabase.util.log :as log]
[metabase.util.malli :as mu]))
[metabase.util.malli :as mu]
[toucan2.core :as t2]))
(set! *warn-on-reflection* true)
@@ -35,6 +39,38 @@
(assoc :preprocessed_query query))))]
(qp query rff*))))
(defn- user-attribute
"Which user attribute should we use for this RouterDB?"
[db-or-id]
(t2/select-one-fn :user_attribute :model/DatabaseRouter :db_id (u/the-id db-or-id)))
(defn primary-db-or-id->router-db-id
[current-user db-or-id]
(when-let [attr-name (user-attribute db-or-id)]
(let [database-name #p (get (:login_attributes @current-user) attr-name)]
(if (= database-name "__METABASE_PRIMARY__")
(u/the-id db-or-id)
(or (t2/select-one-pk :model/Database
:primary_database_id (u/the-id db-or-id)
:name database-name)
(throw (ex-info "No MirrorDB found for user attribute" {:database-name database-name
:primary-database-id (u/the-id db-or-id)})))))))
(defn swap-mirror-db
[qp]
(fn [query rff]
(let [current-database (lib.metadata/database (qp.store/metadata-provider))
mirror-database (primary-db-or-id->router-db-id api/*current-user* current-database)]
(if-not mirror-database
(qp query rff)
(let [rff* (fn [metadata]
(binding [qp.store/*TESTS-ONLY-allow-replacing-metadata-provider* true]
(qp.store/with-metadata-provider (u/id current-database)
(rff metadata))))]
(binding [qp.store/*TESTS-ONLY-allow-replacing-metadata-provider* true]
(qp.store/with-metadata-provider mirror-database
(qp query rff*))))))))
(def ^:private middleware
"Middleware that happens after compilation, AROUND query execution itself. Has the form
@@ -43,7 +79,8 @@
e.g.
(f (f query rff)) -> (f query rff)"
[#'update-used-cards/update-used-cards!
[#'swap-mirror-db
#'update-used-cards/update-used-cards!
#'add-native-form-to-result-metadata
#'add-preprocessed-query-to-result-metadata-for-userland-query
#'cache/maybe-return-cached-results

View File

@@ -192,7 +192,7 @@
Try to avoid using this, we would like to remove this in the near future."
{:deprecated "0.48.0"}
[mlv2-metadata]
(let [model (case (:lib/type mlv2-metadata)
(let [model (case (:lib/type #p mlv2-metadata)
:metadata/database :model/Database
:metadata/table :model/Table
:metadata/column :model/Field)]

View File

@@ -4,6 +4,7 @@
[metabase.driver :as driver]
[metabase.query-processor :as qp]
[metabase.query-processor.error-type :as qp.error-type]
[metabase.query-processor.execute :as qp.execute]
[metabase.query-processor.middleware.parameters :as parameters]
[metabase.query-processor.middleware.permissions :as qp.perms]
[metabase.query-processor.preprocess :as qp.preprocess]
@@ -16,7 +17,8 @@
"Middleware that happens after compilation, AROUND query execution itself. Has the form
(f (f query rff)) -> (f query rff)"
[#'qp.perms/check-query-action-permissions])
[#'qp.execute/swap-mirror-db
#'qp.perms/check-query-action-permissions])
(defn- apply-middleware [qp middleware-fns]
(reduce