Skip to content

Commit

Permalink
[Metrics V2] Available metrics changes
Browse files Browse the repository at this point in the history
Fixes #42470
  • Loading branch information
snoe committed May 15, 2024
1 parent e1a7fba commit 611ee27
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 15 deletions.
3 changes: 2 additions & 1 deletion src/metabase/lib/js/metadata.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,8 @@
[metadata metadata-type table-id]
(let [k (case metadata-type
:metadata/column :fields
:metadata/legacy-metric :metrics
:metadata/metric :metrics
:metadata/legacy-metric :legacy-metrics
:metadata/segment :segments)]
(into []
(keep (fn [[_id dlay]]
Expand Down
13 changes: 13 additions & 0 deletions src/metabase/lib/metadata.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,19 @@
table-id :- ::lib.schema.id/table]
(lib.metadata.protocols/fields (->metadata-provider metadata-providerable) table-id))

(mu/defn metadatas-for-table :- [:sequential [:or
::lib.schema.metadata/column
::lib.schema.metadata/metric
::lib.schema.metadata/legacy-metric
::lib.schema.metadata/segment]]
"Return active (non-archived) metadatas associated with a particular Table, either Fields, Metrics, or
Segments -- `metadata-type` must be one of either `:metadata/column`, `:metadata/metric`, ':metadata/legacy-metric',
`:metadata/segment`."
[metadata-providerable :- ::lib.schema.metadata/metadata-providerable
metadata-type :- [:enum :metadata/column, :metadata/metric, :metadata/legacy-metric, :metadata/segment]
table-id :- ::lib.schema.id/table]
(lib.metadata.protocols/metadatas-for-table (->metadata-provider metadata-providerable) metadata-type table-id))

(mu/defn field :- [:maybe ::lib.schema.metadata/column]
"Get metadata about a specific Field in the Database we're querying."
[metadata-providerable :- ::lib.schema.metadata/metadata-providerable
Expand Down
1 change: 1 addition & 0 deletions src/metabase/lib/metadata/cached_provider.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
(defn- metadatas-for-table [metadata-provider cache metadata-type table-id]
(let [k (case metadata-type
:metadata/column ::table-fields
:metadata/metric ::table-metrics
:metadata/legacy-metric ::table-legacy-metrics
:metadata/segment ::table-segments)
thunk (fn []
Expand Down
1 change: 1 addition & 0 deletions src/metabase/lib/metadata/invocation_tracker.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
(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/legacy-metric ::table-legacy-metrics
:metadata/segment ::table-segments)]
(track-ids! tracker tracking-type [table-id]))
Expand Down
6 changes: 6 additions & 0 deletions src/metabase/lib/metadata/jvm.clj
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,8 @@
:from [[(t2/table-name :model/Card) :metric]]
:where [:= :metric/type "metric"]}))

(derive :metadata/metric :model/Card)

(t2/define-after-select :metadata/metric
[metric]
(let [card (instance->metadata metric :metadata/metric)]
Expand Down Expand Up @@ -382,6 +384,10 @@
:active true
:visibility_type [:not-in #{"sensitive" "retired"}])


:metadata/metric
(t2/select :metadata/metric :table_id table-id,:type :metric :archived false)

:metadata/legacy-metric
(t2/select :metadata/legacy-metric :table_id table-id, :archived false)

Expand Down
4 changes: 2 additions & 2 deletions src/metabase/lib/metadata/protocols.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
internals can be tucked away here in MLv2.")

(metadatas-for-table [metadata-provider metadata-type table-id]
"Return active (non-archived) metadatas associated with a particular Table, either Fields, LegacyMetrics, or
Segments -- `metadata-type` must be one of either `:metadata/column`, `:metadata/legacy-metric`, or
"Return active (non-archived) metadatas associated with a particular Table, either Fields, Metrics, or
Segments -- `metadata-type` must be one of either `:metadata/column`, `:metadata/metric`, ':metadata/legacy-metric',
`:metadata/segment`.")

(setting [metadata-provider setting-key]
Expand Down
35 changes: 23 additions & 12 deletions src/metabase/lib/metric.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -115,21 +115,32 @@
(available-metrics query -1))
([query :- ::lib.schema/query
stage-number :- :int]
(let [metric-aggregations (into {}
(let [first-stage? (zero? (lib.util/canonical-stage-index query stage-number))
metric-aggregations (into {}
(keep-indexed (fn [index aggregation-clause]
(when (lib.util/clause-of-type? aggregation-clause :metric)
[[(get aggregation-clause 2)
(:join-alias (lib.options/options aggregation-clause))]
index])))
(lib.aggregation/aggregations query stage-number))
s-metric (source-metric query (lib.util/query-stage query stage-number))]
(when s-metric
(if (empty? metric-aggregations)
[s-metric]
(mapv (fn [metric-metadata]
(let [aggregation-pos (-> metric-metadata
((juxt :id ::lib.join/join-alias))
metric-aggregations)]
(cond-> metric-metadata
aggregation-pos (assoc :aggregation-position aggregation-pos))))
[s-metric]))))))
s-metric (source-metric query (lib.util/query-stage query stage-number))
source-table (lib.util/source-table-id query)
maybe-add-aggregation-pos (fn [metric-metadata]
(let [aggregation-pos (-> metric-metadata
((juxt :id ::lib.join/join-alias))
metric-aggregations)]
(cond-> metric-metadata
aggregation-pos (assoc :aggregation-position aggregation-pos))))]
(cond
(and first-stage? s-metric)
(not-empty
(mapv maybe-add-aggregation-pos
[s-metric]))

(and first-stage? source-table)
(let [metrics (lib.metadata/metadatas-for-table query :metadata/metric source-table)]
(not-empty
(mapv (comp maybe-add-aggregation-pos #(lib.metadata/metric query %) :id)
(filter (fn [metric-card]
(= 1 (lib.query/stage-count (lib.query/query query (:definition metric-card)))))
metrics))))))))
22 changes: 22 additions & 0 deletions test/metabase/query_processor/middleware/metrics_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -193,3 +193,25 @@
(lib/limit 1))))
(mt/rows
(qp/process-query query))))))))

(deftest ^:parallel available-metrics-test
(let [mp (lib.metadata.jvm/application-database-metadata-provider (mt/id))
source-query (-> (lib/query mp (lib.metadata/table mp (mt/id :products)))
(lib/aggregate (lib/count)))]
(mt/with-temp [:model/Card source-metric {:dataset_query (lib.convert/->legacy-MBQL source-query)
:database_id (mt/id)
:table_id (mt/id :products)
:name "new_metric"
:type :metric}
;; Two stage queries should not be available
:model/Card _ {:dataset_query (-> source-query
lib/append-stage
(lib/aggregate (lib/count))
lib.convert/->legacy-MBQL)
:database_id (mt/id)
:table_id (mt/id :products)
:name "new_metric"
:type :metric}]
(let [query (lib/query mp (lib.metadata/table mp (mt/id :products)))]
(is (=? [(lib.metadata/metric mp (:id source-metric))]
(lib/available-metrics query)))))))

0 comments on commit 611ee27

Please sign in to comment.