Object details drill for PK columns when there is a single PK column available. Entry points:
Requirements:
Query transformation:
Question transformation:
A We will only possibly return one of the 'object details' drills ([[metabase.lib.drill-thru.pk]], [[metabase.lib.drill-thru.fk-details]], or [[metabase.lib.drill-thru.zoom]]); see [[metabase.lib.drill-thru.object-details]] for the high-level logic that calls out to the individual implementations. | (ns metabase.lib.drill-thru.zoom (:require [medley.core :as m] [metabase.lib.drill-thru.common :as lib.drill-thru.common] [metabase.lib.metadata.calculation :as lib.metadata.calculation] [metabase.lib.schema :as lib.schema] [metabase.lib.schema.drill-thru :as lib.schema.drill-thru] [metabase.lib.types.isa :as lib.types.isa] [metabase.util.malli :as mu])) |
(defn- zoom-drill* [column value] {:lib/type :metabase.lib.drill-thru/drill-thru :type :drill-thru/zoom :column column :object-id value :many-pks? false}) | |
(mu/defn zoom-drill :- [:maybe ::lib.schema.drill-thru/drill-thru.zoom] "Return a `:zoom` drill when clicking on the value of a PK column in a Table that has only one PK column." [query :- ::lib.schema/query stage-number :- :int {:keys [column value row] :as _context} :- ::lib.schema.drill-thru/context] (when (and ;; ignore clicks on headers (value = nil rather than :null) (some? value) (lib.drill-thru.common/mbql-stage? query stage-number) ;; if this table has more than one PK we should be returning a [[metabase.lib.drill-thru.pk]] instead. (not (lib.drill-thru.common/many-pks? query))) (if (lib.types.isa/primary-key? column) ;; PK column was clicked. Ignore NULL values. (when-not (= value :null) (zoom-drill* column value)) ;; some other column was clicked. Find the PK column and create a filter for its value. (let [[pk-column] (lib.metadata.calculation/primary-keys query)] (when-let [pk-value (->> row (m/find-first #(-> % :column :name (= (:name pk-column)))) :value)] (when-not (nil? pk-value) (zoom-drill* pk-column pk-value))))))) | |
(defmethod lib.drill-thru.common/drill-thru-info-method :drill-thru/zoom [_query _stage-number drill-thru] (select-keys drill-thru [:many-pks? :object-id :type])) | |
(mu/defmethod lib.drill-thru.common/drill-thru-method :drill-thru/zoom :- ::lib.schema/query [query :- ::lib.schema/query _stage-number :- :int _drill :- ::lib.schema.drill-thru/drill-thru.zoom] ;; this is just an identity transformation, see ;; https://metaboat.slack.com/archives/C04CYTEL9N2/p1693965932617369 query) | |