Skip to content
Snippets Groups Projects
Commit f041c24d authored by Cam Saül's avatar Cam Saül
Browse files

associate default-fields directly on entity

parent 4aeaf055
No related branches found
No related tags found
No related merge requests found
......@@ -253,13 +253,6 @@
;; ## SEL
(defmulti default-fields
"The default fields that should be used for ENTITY by calls to `sel` if none are specified."
identity)
(defmethod default-fields :default [_]
nil) ; by default return nil, which we'll take to mean "everything"
(defmacro sel
"Wrapper for korma `select` that calls `post-select` on results and provides a few other conveniences.
......@@ -374,8 +367,8 @@
`(let [[entity# field-keys#] (destructure-entity ~entity) ; pull out field-keys if passed entity vector like `[entity & field-keys]`
entity# (entity->korma entity#) ; entity## is the actual entity like `metabase.models.user/User` that we can dispatch on
entity-select-form# (-> entity# ; entity-select-form# is the tweaked version we'll pass to korma `select`
(assoc :fields (or field-keys#
(default-fields entity#))))] ; tell korma which fields to grab. If `field-keys` weren't passed in vector do lookup at runtime
(assoc :fields (or field-keys# ; tell korma which fields to grab. If `field-keys` weren't passed in vector do lookup at runtime
(:metabase.models.interface/default-fields entity#))))]
(when (config/config-bool :mb-db-logging)
(log/debug "DB CALL: " (:name entity#)
(or (:fields entity-select-form#) "*")
......
(ns metabase.models.interface
(:require [clojure.tools.logging :as log]
(:require (clojure.tools [logging :as log]
[macro :refer [macrolet]])
[clojure.walk :refer [macroexpand-all]]
[korma.core :as k]
[medley.core :as m]
......@@ -44,7 +45,9 @@
(when (metabase.config/config-bool :mb-db-logging)
(clojure.tools.logging/debug
"DB CALL: " (:name entity) id)))
(let [[obj] (k/select entity (k/where {:id id}) (k/limit 1))]
(let [[obj] (k/select (assoc entity :fields (::default-fields entity))
(k/where {:id id})
(k/limit 1))]
(when obj
(->> obj
(internal-post-select entity)
......@@ -56,14 +59,19 @@
[`(~k ~obj) `(update-in [~k] ~f)])
(seq kvs))))
(defmacro macrolet-entity-map [entity & entity-forms]
`(macrolet [(~'default-fields [m# & fields#] `(assoc ~m# ::default-fields [~@(map keyword fields#)]))
(~'hydration-keys [m# & fields#] `(assoc ~m# :hydration-keys #{~@(map keyword fields#)}))]
(-> (k/create-entity ~(name entity))
~@entity-forms)))
(defmacro defentity
"Similar to korma `defentity`, but creates a new record type where you can specify protocol implementations."
[entity entity-forms & specs]
{:pre [vector? entity-forms]}
(let [entity-symb (symbol (format "%sEntity" (name entity)))
internal-post-select-symb (symbol (format "internal-post-select-%s" (name entity)))
entity-map (eval `(-> (k/create-entity ~(name entity))
~@entity-forms))
entity-map (eval `(macrolet-entity-map ~entity ~@entity-forms))
type-fns (resolve-type-fns (:metabase.db/types entity-map))]
`(do
(defrecord ~entity-symb []
......
......@@ -9,6 +9,7 @@
(defentity QueryExecution
[(table :query_queryexecution)
(default-fields id uuid version json_query raw_query status started_at finished_at running_time error result_rows)
(types {:json_query :json
:result_data :json
:status :keyword})]
......@@ -18,18 +19,3 @@
;; sadly we have 2 ways to reference the row count :(
(assoc query-execution
:row_count (or result_rows 0))))
;; default fields to return for `sel QueryExecution
;; specifically excludes stored data columns
(defmethod default-fields QueryExecution [_]
[:id
:uuid
:version
:json_query
:raw_query
:status
:started_at
:finished_at
:running_time
:error
:result_rows])
......@@ -10,25 +10,16 @@
(defentity User
[(table :core_user)
(assoc :hydration-keys #{:author :creator :user})]
(default-fields id email date_joined first_name last_name last_login is_superuser)
(hydration-keys author creator user)]
IEntityPostSelect
(post-select [_ user]
(assoc user :common_name (str (:first_name user) " " (:last_name user)))))
;; fields to return for Users other `*than current-user*`
(defmethod default-fields User [_]
[:id
:email
:date_joined
:first_name
:last_name
:last_login
:is_superuser])
(def ^:const current-user-fields
"The fields we should return for `*current-user*` (used by `metabase.middleware.current-user`)"
(concat (default-fields User)
(concat (:metabase.models.interface/default-fields User)
[:is_active
:is_staff])) ; but not `password` !
......
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