Skip to content
Snippets Groups Projects
Unverified Commit 1b79ef47 authored by Ryan Senior's avatar Ryan Senior Committed by GitHub
Browse files

Merge pull request #6638 from metabase/fix-ref-guide-db-call-explosion

Fix excessive DB calls on reference guide
parents b2a31b78 d86e7d9f
No related branches found
No related tags found
No related merge requests found
......@@ -16,7 +16,7 @@
[metabase.models
[card :refer [Card]]
[database :as database :refer [Database protected-password]]
[field :refer [Field]]
[field :refer [Field readable-fields-only]]
[field-values :refer [FieldValues]]
[interface :as mi]
[permissions :as perms]
......@@ -240,7 +240,7 @@
(defn- autocomplete-suggestions [db-id prefix]
(let [tables (filter mi/can-read? (autocomplete-tables db-id prefix))
fields (filter mi/can-read? (autocomplete-fields db-id prefix))]
fields (readable-fields-only (autocomplete-fields db-id prefix))]
(autocomplete-results tables fields)))
(api/defendpoint GET "/:id/autocomplete_suggestions"
......@@ -285,7 +285,7 @@
[id]
(api/read-check Database id)
(sort-by (comp str/lower-case :name :table) (filter mi/can-read? (-> (database/pk-fields {:id id})
(hydrate :table)))))
(hydrate :table)))))
;;; ----------------------------------------------- POST /api/database -----------------------------------------------
......
......@@ -10,6 +10,7 @@
[metabase.util :as u]
[toucan
[db :as db]
[hydrate :refer [hydrate]]
[models :as models]]))
;;; ------------------------------------------------------------ Type Mappings ------------------------------------------------------------
......@@ -158,6 +159,13 @@
(for [field fields]
(assoc field :dimensions (get id->dimensions (:id field) [])))))
(defn readable-fields-only
"Efficiently checks if each field is readable and returns only readable fields"
[fields]
(for [field (hydrate fields :table)
:when (i/can-read? field)]
(dissoc field :table)))
(defn with-targets
"Efficiently hydrate the FK target fields for a collection of FIELDS."
{:batched-hydrate :target}
......@@ -167,7 +175,7 @@
(:fk_target_field_id field))]
(:fk_target_field_id field)))
id->target-field (u/key-by :id (when (seq target-field-ids)
(filter i/can-read? (db/select Field :id [:in target-field-ids]))))]
(readable-fields-only (db/select Field :id [:in target-field-ids]))))]
(for [field fields
:let [target-id (:fk_target_field_id field)]]
(assoc field :target (id->target-field target-id)))))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment