(ns metabase.lib.metadata.invocation-tracker (:require #?(:clj [pretty.core :as pretty]) [metabase.lib.metadata.protocols :as lib.metadata.protocols])) | |
Set of metadata types to track.
Currently only Making this dynamic for testing purposes. | (def ^:private ^:dynamic *to-track-metadata-types*
#{:metadata/card}) |
(defn- track-ids! [tracker metadata-type ids]
;; we only have usage for metadata/card for now, so we only track it to save some overhead
(when (contains? *to-track-metadata-types* metadata-type)
(swap! tracker update metadata-type (fn [item-ids]
(into (vec item-ids) ids))))) | |
(defn- metadatas [tracker metadata-provider metadata-type ids] (track-ids! tracker metadata-type ids) (lib.metadata.protocols/metadatas metadata-provider metadata-type ids)) | |
(defn- metadatas-for-table [tracker metadata-provider metadata-type table-id]
(let [tracking-type (case metadata-type
:metadata/column ::table-fields
:metadata/metric ::table-metrics
:metadata/segment ::table-segments)]
(track-ids! tracker tracking-type [table-id]))
(lib.metadata.protocols/metadatas-for-table metadata-provider metadata-type table-id)) | |
(defn- metadatas-for-card [tracker metadata-provider metadata-type card-id]
(let [tracking-type (case metadata-type
:metadata/metric ::card-metrics)]
(track-ids! tracker tracking-type [card-id]))
(lib.metadata.protocols/metadatas-for-card metadata-provider metadata-type card-id)) | |
(defn- setting [tracker metadata-provider setting-key] (track-ids! tracker ::setting [setting-key]) (lib.metadata.protocols/setting metadata-provider setting-key)) | |
(deftype InvocationTracker [tracker metadata-provider]
lib.metadata.protocols/InvocationTracker
(invoked-ids [_this metadata-type]
(get @tracker metadata-type))
lib.metadata.protocols/MetadataProvider
(database [_this]
(lib.metadata.protocols/database metadata-provider))
(metadatas [_this metadata-type ids]
(metadatas tracker metadata-provider metadata-type ids))
(tables [_this]
(lib.metadata.protocols/tables metadata-provider))
(metadatas-for-table [_this metadata-type table-id]
(metadatas-for-table tracker metadata-provider metadata-type table-id))
(metadatas-for-card [_this metadata-type card-id]
(metadatas-for-card tracker metadata-provider metadata-type card-id))
(setting [_this setting-key]
(setting tracker metadata-provider setting-key))
lib.metadata.protocols/CachedMetadataProvider
(cached-metadatas [_this metadata-type ids]
(lib.metadata.protocols/cached-metadatas metadata-provider metadata-type ids))
(store-metadata! [_this object]
(lib.metadata.protocols/store-metadata! metadata-provider object))
#?(:clj Object :cljs IEquiv)
(#?(:clj equals :cljs -equiv) [_this another]
(and (instance? InvocationTracker another)
(= metadata-provider (.metadata-provider ^InvocationTracker another))))
#?@(:clj
[pretty/PrettyPrintable
(pretty [_this]
(list `invocation-tracker-provider metadata-provider))])) | |
Wraps | (defn invocation-tracker-provider
[metadata-provider]
(->InvocationTracker (atom {}) metadata-provider)) |