From 0ade074b5306112125e8f93c12992274deb7a25c Mon Sep 17 00:00:00 2001
From: metamben <103100869+metamben@users.noreply.github.com>
Date: Thu, 6 Jun 2024 02:17:17 +0300
Subject: [PATCH] Remove serdes support for legacy metrics (#43272)

---
 docs/api-documentation.md                     |   1 -
 docs/api/legacy-metric.md                     | 114 ----------------
 docs/developers-guide/api-changelog.md        |   4 +
 .../metabase_enterprise/serialization/cmd.clj |   5 -
 .../serialization/dump.clj                    |   3 +-
 .../serialization/load.clj                    |  12 --
 .../serialization/names.clj                   |  11 --
 .../serialization/serialize.clj               |   6 +-
 .../serialization/upsert.clj                  |   2 -
 .../serialization/v2/models.clj               |   2 +-
 .../models/entity_id_test.clj                 |   1 +
 .../serialization/load_test.clj               |   4 +-
 .../serialization/names_test.clj              |   5 +-
 .../serialization/serialize_test.clj          |   3 +-
 .../serialization/test_util.clj               |   8 +-
 .../serialization/upsert_test.clj             |  10 +-
 .../serialization/v2/e2e_test.clj             |  18 ---
 .../serialization/v2/extract_test.clj         |  40 ------
 .../serialization/v2/load_test.clj            | 126 +++---------------
 src/metabase/cmd/copy.clj                     |   2 -
 src/metabase/models/legacy_metric.clj         |   1 -
 test/metabase/cmd/copy_test.clj               |   2 +
 22 files changed, 35 insertions(+), 345 deletions(-)
 delete mode 100644 docs/api/legacy-metric.md

diff --git a/docs/api-documentation.md b/docs/api-documentation.md
index df6d2f1a83c..887640accd7 100644
--- a/docs/api-documentation.md
+++ b/docs/api-documentation.md
@@ -52,7 +52,6 @@ _* indicates endpoints used for features available on [paid plans](https://www.m
 - [LDAP](api/ldap.md)
 - [Login history](api/login-history.md)
 - [Metabot](api/metabot.md)
-- [Metric](api/legacy-metric.md)
 - [Model index](api/model-index.md)
 - [Native query snippet](api/native-query-snippet.md)
 - [Notify](api/notify.md)
diff --git a/docs/api/legacy-metric.md b/docs/api/legacy-metric.md
deleted file mode 100644
index 1faac817da6..00000000000
--- a/docs/api/legacy-metric.md
+++ /dev/null
@@ -1,114 +0,0 @@
----
-title: "Metric"
-summary: |
-  /api/legacy-metric endpoints.
----
-
-# Metric
-
-/api/legacy-metric endpoints.
-
-## `DELETE /api/legacy-metric/:id`
-
-Archive a Metric. (DEPRECATED -- Just pass updated value of `:archived` to the `PUT` endpoint instead.).
-
-### PARAMS:
-
-*  **`id`** value must be an integer greater than zero.
-
-*  **`revision_message`** value must be a non-blank string.
-
-## `GET /api/legacy-metric/`
-
-Fetch *all* `Metrics`.
-
-## `GET /api/legacy-metric/:id`
-
-Fetch `Metric` with ID.
-
-### PARAMS:
-
-*  **`id`** value must be an integer greater than zero.
-
-## `GET /api/legacy-metric/:id/related`
-
-Return related entities.
-
-### PARAMS:
-
-*  **`id`** value must be an integer greater than zero.
-
-## `GET /api/legacy-metric/:id/revisions`
-
-Fetch `Revisions` for `Metric` with ID.
-
-### PARAMS:
-
-*  **`id`** value must be an integer greater than zero.
-
-## `POST /api/legacy-metric/`
-
-Create a new `Metric`.
-
-### PARAMS:
-
-*  **`name`** value must be a non-blank string.
-
-*  **`description`** nullable string
-
-*  **`table_id`** value must be an integer greater than zero.
-
-*  **`definition`** map
-
-## `POST /api/legacy-metric/:id/revert`
-
-Revert a `Metric` to a prior `Revision`.
-
-### PARAMS:
-
-*  **`id`** value must be an integer greater than zero.
-
-*  **`revision_id`** value must be an integer greater than zero.
-
-## `PUT /api/legacy-metric/:id`
-
-Update a `Metric` with ID.
-
-### PARAMS:
-
-*  **`points_of_interest`** nullable string
-
-*  **`description`** nullable string
-
-*  **`archived`** nullable boolean
-
-*  **`definition`** nullable map
-
-*  **`revision_message`** value must be a non-blank string.
-
-*  **`show_in_getting_started`** nullable boolean
-
-*  **`name`** nullable value must be a non-blank string.
-
-*  **`caveats`** nullable string
-
-*  **`id`** value must be an integer greater than zero.
-
-*  **`how_is_this_calculated`** nullable string
-
-## `PUT /api/legacy-metric/:id/important_fields`
-
-Update the important `Fields` for a `Metric` with ID.
-   (This is used for the Getting Started guide).
-
-You must be a superuser to do this.
-
-### PARAMS:
-
-*  **`id`** value must be an integer greater than zero.
-
-*  **`important_field_ids`** sequence of value must be an integer greater than zero.
-
----
-
-[<< Back to API index](../api-documentation.md)
diff --git a/docs/developers-guide/api-changelog.md b/docs/developers-guide/api-changelog.md
index c5b12ca45fa..bd580641871 100644
--- a/docs/developers-guide/api-changelog.md
+++ b/docs/developers-guide/api-changelog.md
@@ -16,6 +16,10 @@ title: API changelog
   New endpoint that combines responses for `/api/field/:id`, `/api/database/:id`, and `/api/table/:id/query_metadata`.
   This should drastically cut down on the required number of requests to display a dashboard.
 
+- `/api/legacy-metric`
+
+   The `/api/legacy-metric` endpoints have been removed.
+
 ## Metabase 0.50.0
 
 - `GET /api/collection/tree` and `GET /api/collection/:id/items`
diff --git a/enterprise/backend/src/metabase_enterprise/serialization/cmd.clj b/enterprise/backend/src/metabase_enterprise/serialization/cmd.clj
index 3dcbaa2b15a..76004fa742b 100644
--- a/enterprise/backend/src/metabase_enterprise/serialization/cmd.clj
+++ b/enterprise/backend/src/metabase_enterprise/serialization/cmd.clj
@@ -19,7 +19,6 @@
    [metabase.models.dashboard :refer [Dashboard]]
    [metabase.models.database :refer [Database]]
    [metabase.models.field :as field :refer [Field]]
-   [metabase.models.legacy-metric :refer [LegacyMetric]]
    [metabase.models.native-query-snippet :refer [NativeQuerySnippet]]
    [metabase.models.pulse :refer [Pulse]]
    [metabase.models.segment :refer [Segment]]
@@ -205,16 +204,12 @@
         fields      (if (contains? opts :only-db-ids)
                       (t2/select Field :table_id [:in (map :id tables)] {:order-by [[:id :asc]]})
                       (t2/select Field))
-        metrics     (if (contains? opts :only-db-ids)
-                      (t2/select LegacyMetric :table_id [:in (map :id tables)] {:order-by [[:id :asc]]})
-                      (t2/select LegacyMetric))
         collections (select-collections users state)]
     (binding [serialize/*include-entity-id* (boolean include-entity-id)]
       (dump/dump! path
                   databases
                   tables
                   (mapcat field/with-values (u/batches-of 32000 fields))
-                  metrics
                   (select-segments-in-tables tables state)
                   collections
                   (select-entities-in-collections NativeQuerySnippet collections state)
diff --git a/enterprise/backend/src/metabase_enterprise/serialization/dump.clj b/enterprise/backend/src/metabase_enterprise/serialization/dump.clj
index 95d9d8ba445..480e18dd897 100644
--- a/enterprise/backend/src/metabase_enterprise/serialization/dump.clj
+++ b/enterprise/backend/src/metabase_enterprise/serialization/dump.clj
@@ -11,7 +11,6 @@
    [metabase.models.dimension :refer [Dimension]]
    [metabase.models.field :refer [Field]]
    [metabase.models.interface :as mi]
-   [metabase.models.legacy-metric :refer [LegacyMetric]]
    [metabase.models.pulse :refer [Pulse]]
    [metabase.models.segment :refer [Segment]]
    [metabase.models.setting :as setting]
@@ -72,7 +71,7 @@
   [instance]
   (some (fn [model]
           (mi/instance-of? model instance))
-        [Pulse Dashboard LegacyMetric Segment Field User]))
+        [Pulse Dashboard Segment Field User]))
 
 (defn- spit-entity!
   [path entity]
diff --git a/enterprise/backend/src/metabase_enterprise/serialization/load.clj b/enterprise/backend/src/metabase_enterprise/serialization/load.clj
index a605c7b267e..d15b02f9c16 100644
--- a/enterprise/backend/src/metabase_enterprise/serialization/load.clj
+++ b/enterprise/backend/src/metabase_enterprise/serialization/load.clj
@@ -23,7 +23,6 @@
    [metabase.models.dimension :refer [Dimension]]
    [metabase.models.field :refer [Field]]
    [metabase.models.field-values :refer [FieldValues]]
-   [metabase.models.legacy-metric :refer [LegacyMetric]]
    [metabase.models.native-query-snippet :refer [NativeQuerySnippet]]
    [metabase.models.pulse :refer [Pulse]]
    [metabase.models.pulse-card :refer [PulseCard]]
@@ -249,7 +248,6 @@
             :when table-id]
       (let [context (assoc context :table table-id)]
         (load! (str path "/fks") context)
-        (load! (str path "/metrics") context)
         (load! (str path "/segments") context)))))
 
 (def ^:private fully-qualified-name->card-id
@@ -280,16 +278,6 @@
   [path context]
   (load-fields! path context))
 
-(defmethod load! "metrics"
-  [path context]
-  (maybe-upsert-many! context LegacyMetric
-    (for [metric (slurp-dir path)]
-      (-> metric
-          (assoc :table_id   (:table context)
-                 :creator_id (default-user-id))
-          (assoc-in [:definition :source-table] (:table context))
-          (update :definition mbql-fully-qualified-names->ids)))))
-
 (defmethod load! "segments"
   [path context]
   (maybe-upsert-many! context Segment
diff --git a/enterprise/backend/src/metabase_enterprise/serialization/names.clj b/enterprise/backend/src/metabase_enterprise/serialization/names.clj
index 92d3d289231..bb6a1604490 100644
--- a/enterprise/backend/src/metabase_enterprise/serialization/names.clj
+++ b/enterprise/backend/src/metabase_enterprise/serialization/names.clj
@@ -11,7 +11,6 @@
    [metabase.models.database :as database :refer [Database]]
    [metabase.models.field :refer [Field]]
    [metabase.models.interface :as mi]
-   [metabase.models.legacy-metric :refer [LegacyMetric]]
    [metabase.models.native-query-snippet :refer [NativeQuerySnippet]]
    [metabase.models.pulse :refer [Pulse]]
    [metabase.models.segment :refer [Segment]]
@@ -69,10 +68,6 @@
     (str (->> field :table_id (fully-qualified-name Table)) "/fks/" (safe-name field))
     (str (->> field :table_id (fully-qualified-name Table)) "/fields/" (safe-name field))))
 
-(defmethod fully-qualified-name* LegacyMetric
-  [metric]
-  (str (->> metric :table_id (fully-qualified-name Table)) "/metrics/" (safe-name metric)))
-
 (defmethod fully-qualified-name* Segment
   [segment]
   (str (->> segment :table_id (fully-qualified-name Table)) "/segments/" (safe-name segment)))
@@ -180,12 +175,6 @@
   [context _ _ field-name]
   (path->context* context "fields" nil field-name))
 
-(defmethod path->context* "metrics"
-  [context _ _ metric-name]
-  (assoc context :metric (t2/select-one-pk LegacyMetric
-                           :table_id (:table context)
-                           :name     metric-name)))
-
 (defmethod path->context* "segments"
   [context _ _ segment-name]
   (assoc context :segment (t2/select-one-pk Segment
diff --git a/enterprise/backend/src/metabase_enterprise/serialization/serialize.clj b/enterprise/backend/src/metabase_enterprise/serialization/serialize.clj
index 9e646c72723..416502d955d 100644
--- a/enterprise/backend/src/metabase_enterprise/serialization/serialize.clj
+++ b/enterprise/backend/src/metabase_enterprise/serialization/serialize.clj
@@ -15,7 +15,6 @@
    [metabase.models.dimension :refer [Dimension]]
    [metabase.models.field :as field :refer [Field]]
    [metabase.models.interface :as mi]
-   [metabase.models.legacy-metric :refer [LegacyMetric]]
    [metabase.models.native-query-snippet :refer [NativeQuerySnippet]]
    [metabase.models.pulse :refer [Pulse]]
    [metabase.models.pulse-card :refer [PulseCard]]
@@ -63,9 +62,6 @@
         {:source-field (id :guard integer?)}
         (assoc &match :source-field (fully-qualified-name Field id))
 
-        [:metric (id :guard integer?)]
-        [:metric (fully-qualified-name LegacyMetric id)]
-
         [:segment (id :guard integer?)]
         [:segment (fully-qualified-name Segment id)])))
 
@@ -109,7 +105,7 @@
                   :dashboard_id :fields_hash :personal_owner_id :made_public_by_id :collection_id
                   :pulse_id :result_metadata :action_id)
     (not *include-entity-id*)   (dissoc :entity_id)
-    (some #(instance? % entity) (map type [LegacyMetric Field Segment])) (dissoc :table_id)))
+    (some #(instance? % entity) (map type [Field Segment])) (dissoc :table_id)))
 
 (defmulti ^:private serialize-one
   {:arglists '([instance])}
diff --git a/enterprise/backend/src/metabase_enterprise/serialization/upsert.clj b/enterprise/backend/src/metabase_enterprise/serialization/upsert.clj
index 445797a289d..b3c05ab10ff 100644
--- a/enterprise/backend/src/metabase_enterprise/serialization/upsert.clj
+++ b/enterprise/backend/src/metabase_enterprise/serialization/upsert.clj
@@ -14,7 +14,6 @@
    [metabase.models.dimension :refer [Dimension]]
    [metabase.models.field :refer [Field]]
    [metabase.models.field-values :refer [FieldValues]]
-   [metabase.models.legacy-metric :refer [LegacyMetric]]
    [metabase.models.native-query-snippet :refer [NativeQuerySnippet]]
    [metabase.models.pulse :refer [Pulse]]
    [metabase.models.pulse-card :refer [PulseCard]]
@@ -34,7 +33,6 @@
   {Database            [:name :engine]
    Table               [:schema :name :db_id]
    Field               [:name :table_id]
-   LegacyMetric              [:name :table_id]
    Segment             [:name :table_id]
    Collection          [:name :location :namespace]
    Dashboard           [:name :collection_id]
diff --git a/enterprise/backend/src/metabase_enterprise/serialization/v2/models.clj b/enterprise/backend/src/metabase_enterprise/serialization/v2/models.clj
index a66db0b6854..785b2b6461f 100644
--- a/enterprise/backend/src/metabase_enterprise/serialization/v2/models.clj
+++ b/enterprise/backend/src/metabase_enterprise/serialization/v2/models.clj
@@ -4,7 +4,6 @@
   "Schema model types"
   ["Database"
    "Field"
-   "LegacyMetric"
    "Segment"
    "Table"])
 
@@ -54,6 +53,7 @@
    "HTTPAction"
    "ImplicitAction"
    "LoginHistory"
+   "LegacyMetric"
    "LegacyMetricImportantField"
    "ModelIndex"
    "ModelIndexValue"
diff --git a/enterprise/backend/test/metabase_enterprise/models/entity_id_test.clj b/enterprise/backend/test/metabase_enterprise/models/entity_id_test.clj
index d9eaea7eba5..005507b22a0 100644
--- a/enterprise/backend/test/metabase_enterprise/models/entity_id_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/models/entity_id_test.clj
@@ -49,6 +49,7 @@
     :model/LoginHistory
     :model/FieldUsage
     :model/FieldValues
+    :model/LegacyMetric
     :model/LegacyMetricImportantField
     :model/ModelIndex
     :model/ModelIndexValue
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/load_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/load_test.clj
index 229e6bfce74..adf65825aa2 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/load_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/load_test.clj
@@ -17,7 +17,6 @@
             Dimension
             Field
             FieldValues
-            LegacyMetric
             NativeQuerySnippet
             Pulse
             PulseCard
@@ -54,7 +53,7 @@
 
 (defn- world-snapshot
   []
-  (into {} (for [model [Database Table Field LegacyMetric Segment Collection Dashboard DashboardCard Pulse
+  (into {} (for [model [Database Table Field Segment Collection Dashboard DashboardCard Pulse
                         Card DashboardCardSeries FieldValues Dimension PulseCard PulseChannel User
                         NativeQuerySnippet]]
              [model (t2/select-fn-set :id model)])))
@@ -378,7 +377,6 @@
                                              [Collection         (t2/select-one Collection :id personal-collection-id)]
                                              [Collection         (t2/select-one Collection :id pc-nested-id)]
                                              [Collection         (t2/select-one Collection :id pc-deeply-nested-id)]
-                                             [LegacyMetric       (t2/select-one LegacyMetric :id metric-id)]
                                              [Segment            (t2/select-one Segment :id segment-id)]
                                              [Dashboard          (t2/select-one Dashboard :id dashboard-id)]
                                              [Dashboard          (t2/select-one Dashboard :id root-dashboard-id)]
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/names_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/names_test.clj
index d1c3065f52c..7290ba8eb70 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/names_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/names_test.clj
@@ -3,7 +3,7 @@
    [clojure.test :refer :all]
    [metabase-enterprise.serialization.names :as names]
    [metabase-enterprise.serialization.test-util :as ts]
-   [metabase.models :refer [Card Collection Dashboard Database Field LegacyMetric NativeQuerySnippet Segment Table]]
+   [metabase.models :refer [Card Collection Dashboard Database Field NativeQuerySnippet Segment Table]]
    [metabase.test :as mt]
    [metabase.util :as u]
    [toucan2.core :as t2]))
@@ -30,7 +30,6 @@
                     (t2/select-one Card :id card-id-nested)
                     (t2/select-one Table :id table-id)
                     (t2/select-one Field :id category-field-id)
-                    (t2/select-one LegacyMetric :id metric-id)
                     (t2/select-one Segment :id segment-id)
                     (t2/select-one Collection :id collection-id)
                     (t2/select-one Collection :id collection-id-nested)
@@ -39,7 +38,7 @@
                     (t2/select-one NativeQuerySnippet :id snippet-id)]]
       (testing (class object)
         (let [context (names/fully-qualified-name->context (names/fully-qualified-name object))
-              id-fn   (some-fn :snippet :field :metric :segment :card :dashboard :collection :table :database)]
+              id-fn   (some-fn :snippet :field :segment :card :dashboard :collection :table :database)]
           (is (= (u/the-id object)
                  (id-fn context))))))))
 
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/serialize_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/serialize_test.clj
index 4e66f82f870..62911c36eb9 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/serialize_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/serialize_test.clj
@@ -4,7 +4,7 @@
    [clojure.test :refer :all]
    [metabase-enterprise.serialization.serialize :as serialize]
    [metabase-enterprise.serialization.test-util :as ts]
-   [metabase.models :refer [Card Collection Dashboard Database Field LegacyMetric NativeQuerySnippet
+   [metabase.models :refer [Card Collection Dashboard Database Field NativeQuerySnippet
                             Segment Table]]))
 
 (defn- all-ids-are-fully-qualified-names?
@@ -25,7 +25,6 @@
 (deftest serialization-test
   (ts/with-world
     (doseq [[model id] [[Card card-id]
-                        [LegacyMetric metric-id]
                         [Segment segment-id]
                         [Collection collection-id]
                         [Dashboard dashboard-id]
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/test_util.clj b/enterprise/backend/test/metabase_enterprise/serialization/test_util.clj
index 24ac1e18bbc..341cddd0263 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/test_util.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/test_util.clj
@@ -7,7 +7,7 @@
    [metabase.db.connection :as mdb.connection]
    [metabase.db.data-source :as mdb.data-source]
    [metabase.models :refer [Card Collection Dashboard DashboardCard DashboardCardSeries Database
-                            Field LegacyMetric NativeQuerySnippet Pulse PulseCard Segment Table User]]
+                            Field NativeQuerySnippet Pulse PulseCard Segment Table User]]
    [metabase.models.collection :as collection]
    [metabase.shared.models.visualization-settings :as mb.viz]
    [metabase.test :as mt]
@@ -160,10 +160,6 @@
                                                         "Deeply Nested Personal Collection"
                                                         :location
                                                         (format "/%d/%d/" (crowberto-pc-id) pc-nested-id)}
-                  LegacyMetric {metric-id :id} {:name "My Metric"
-                                                :table_id table-id
-                                                :definition {:source-table table-id
-                                                             :aggregation [:sum [:field numeric-field-id nil]]}}
                   Segment    {segment-id :id} {:name "My Segment"
                                                :table_id table-id
                                                :definition {:source-table table-id
@@ -440,7 +436,6 @@
         :last-login-field-id          last-login-field-id
         :latitude-field-id            latitude-field-id
         :longitude-field-id           longitude-field-id
-        :metric-id                    metric-id
         :name-field-id                name-field-id
         :nested-snippet-id            nested-snippet-id
         :numeric-field-id             numeric-field-id
@@ -500,7 +495,6 @@
                    last-login-field-id
                    latitude-field-id
                    longitude-field-id
-                   metric-id
                    name-field-id
                    nested-snippet-id
                    numeric-field-id
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/upsert_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/upsert_test.clj
index 60cae92b0fd..48b36ea4483 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/upsert_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/upsert_test.clj
@@ -3,7 +3,7 @@
    [clojure.data :as data]
    [clojure.test :refer :all]
    [metabase-enterprise.serialization.upsert :as upsert]
-   [metabase.models :refer [Card Collection Dashboard DashboardCard Database Field LegacyMetric NativeQuerySnippet
+   [metabase.models :refer [Card Collection Dashboard DashboardCard Database Field NativeQuerySnippet
                             Pulse Segment Table User]]
    [metabase.models.interface :as mi]
    [metabase.test :as mt]
@@ -80,9 +80,6 @@
                   :visualization_settings (if (= 1 instance-num) {:column_settings {}}
                                                                  {:click_behavior {}}))
 
-    (isa? model LegacyMetric)
-    (assoc entity :table_id (mt/id :checkins))
-
     :else
     entity))
 
@@ -113,7 +110,6 @@
                  Card
                  Table
                  Field
-                 LegacyMetric
                  NativeQuerySnippet
                  Segment
                  Dashboard
@@ -126,6 +122,4 @@
 
 (deftest has-post-insert?-test
   (is (= true
-         (#'upsert/has-post-insert? User)))
-  (is (= false
-         (#'upsert/has-post-insert? LegacyMetric))))
+         (#'upsert/has-post-insert? User))))
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/v2/e2e_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/v2/e2e_test.clj
index 1abf1b2e6b5..8a9b45f1220 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/v2/e2e_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/v2/e2e_test.clj
@@ -185,10 +185,6 @@
                                                ;; 20 with just :field_id
                                               (many-random-fks 20 {:refs {:human_readable_field_id ::rs/omit}}
                                                                {:field_id [:field 1000]})))
-               :metric                  (many-random-fks 30 {:spec-gen {:definition {:aggregation  [[:count]]
-                                                                                     :source-table 9}}}
-                                                         {:table_id   [:t 100]
-                                                          :creator_id [:u 10]})
                :segment                 (many-random-fks 30 {:spec-gen {:definition {:filter [:!= [:field 60 nil] 50],
                                                                                      :source-table 4}}}
                                                          {:table_id   [:t 100]
@@ -286,13 +282,6 @@
                              (map (comp count dir->file-set #(io/file % "timelines")))
                              (reduce +)))))
 
-            (testing "for metrics"
-              (is (= 30 (reduce + (for [db    (dir->dir-set (io/file dump-dir "databases"))
-                                        table (dir->dir-set (io/file dump-dir "databases" db "tables"))
-                                        :let [metrics-dir (io/file dump-dir "databases" db "tables" table "metrics")]
-                                        :when (.exists metrics-dir)]
-                                    (count (dir->file-set metrics-dir)))))))
-
             (testing "for segments"
               (is (= 30 (reduce + (for [db    (dir->dir-set (io/file dump-dir "databases"))
                                         table (dir->dir-set (io/file dump-dir "databases" db "tables"))
@@ -390,13 +379,6 @@
                               (serdes/extract-one "Dimension" {})
                               clean-entity)))))
 
-              (testing "for metrics"
-                (doseq [{:keys [entity_id] :as metric} (get @entities "Metric")]
-                  (is (= (clean-entity metric)
-                         (->> (t2/select-one 'Metric :entity_id entity_id)
-                              (serdes/extract-one "Metric" {})
-                              clean-entity)))))
-
               (testing "for segments"
                 (doseq [{:keys [entity_id] :as segment} (get @entities "Segment")]
                   (is (= (clean-entity segment)
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/v2/extract_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/v2/extract_test.clj
index ada774d8a6c..aecf9248385 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/v2/extract_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/v2/extract_test.clj
@@ -19,7 +19,6 @@
             Dimension
             Field
             FieldValues
-            LegacyMetric
             NativeQuerySnippet
             Pulse
             PulseCard
@@ -696,45 +695,6 @@
                       {:model "Field"      :id "name"}]}
                    (set (serdes/dependencies ser))))))))))
 
-(deftest metrics-test
-  (mt/with-empty-h2-app-db
-    (ts/with-temp-dpc [User
-                       {ann-id :id}
-                       {:first_name "Ann"
-                        :last_name  "Wilson"
-                        :email      "ann@heart.band"}
-
-                       Database   {db-id :id}        {:name "My Database"}
-                       Table      {no-schema-id :id} {:name "Schemaless Table" :db_id db-id}
-                       Field      {field-id :id}     {:name "Some Field" :table_id no-schema-id}
-
-                       LegacyMetric
-                       {m1-id  :id
-                        m1-eid :entity_id}
-                       {:name       "My Metric"
-                        :creator_id ann-id
-                        :table_id   no-schema-id
-                        :definition {:source-table no-schema-id
-                                     :aggregation  [[:sum [:field field-id nil]]]}}]
-      (testing "metrics"
-        (let [ser (serdes/extract-one "LegacyMetric" {} (t2/select-one LegacyMetric :id m1-id))]
-          (is (=? {:serdes/meta [{:model "LegacyMetric" :id m1-eid :label "my_metric"}]
-                   :table_id    ["My Database" nil "Schemaless Table"]
-                   :creator_id  "ann@heart.band"
-                   :definition  {:source-table ["My Database" nil "Schemaless Table"]
-                                 :aggregation [[:sum [:field ["My Database" nil "Schemaless Table" "Some Field"] nil]]]}
-                   :created_at  OffsetDateTime}
-                  ser))
-          (is (not (contains? ser :id)))
-
-          (testing "depend on the Table and any fields referenced in :definition"
-            (is (= #{[{:model "Database" :id "My Database"}
-                      {:model "Table" :id "Schemaless Table"}]
-                     [{:model "Database" :id "My Database"}
-                      {:model "Table" :id "Schemaless Table"}
-                      {:model "Field" :id "Some Field"}]}
-                   (set (serdes/dependencies ser))))))))))
-
 (deftest native-query-snippets-test
   (mt/with-empty-h2-app-db
     (ts/with-temp-dpc [User
diff --git a/enterprise/backend/test/metabase_enterprise/serialization/v2/load_test.clj b/enterprise/backend/test/metabase_enterprise/serialization/v2/load_test.clj
index 800452df524..bcfe4840ba4 100644
--- a/enterprise/backend/test/metabase_enterprise/serialization/v2/load_test.clj
+++ b/enterprise/backend/test/metabase_enterprise/serialization/v2/load_test.clj
@@ -8,7 +8,7 @@
    [metabase-enterprise.serialization.v2.load :as serdes.load]
    [metabase.models
     :refer [Action Card Collection Dashboard DashboardCard Database Field
-            FieldValues LegacyMetric NativeQuerySnippet Segment Table Timeline
+            FieldValues NativeQuerySnippet Segment Table Timeline
             TimelineEvent User]]
    [metabase.models.action :as action]
    [metabase.models.serialization :as serdes]
@@ -348,80 +348,6 @@
                       :aggregation  [[:count]]}
                      (:definition @seg1d))))))))))
 
-(deftest metric-test
-  ;; Metric.definition is a JSON-encoded MBQL query, which contain database, table, and field IDs - these need to be
-  ;; converted to a portable form and read back in.
-  ;; This test has a database, table and fields, that exist on both sides with different IDs, and expects a metric
-  ;; to be correctly loaded with the dest IDs.
-  (testing "embedded MBQL in Metric :definition is portable"
-    (let [serialized (atom nil)
-          coll1s     (atom nil)
-          db1s       (atom nil)
-          table1s    (atom nil)
-          field1s    (atom nil)
-          metric1s   (atom nil)
-          user1s     (atom nil)
-          db1d       (atom nil)
-          table1d    (atom nil)
-          field1d    (atom nil)
-          user1d     (atom nil)
-          metric1d   (atom nil)
-          db2d       (atom nil)
-          table2d    (atom nil)
-          field2d    (atom nil)]
-
-
-      (ts/with-dbs [source-db dest-db]
-        (testing "serializing the original database, table, field and card"
-          (ts/with-db source-db
-            (reset! coll1s   (ts/create! Collection :name "pop! minis"))
-            (reset! db1s     (ts/create! Database :name "my-db"))
-            (reset! table1s  (ts/create! Table :name "orders" :db_id (:id @db1s)))
-            (reset! field1s  (ts/create! Field :name "subtotal"    :table_id (:id @table1s)))
-            (reset! user1s   (ts/create! User  :first_name "Tom" :last_name "Scholz" :email "tom@bost.on"))
-            (reset! metric1s (ts/create! LegacyMetric :table_id (:id @table1s) :name "Revenue"
-                                         :definition {:source-table (:id @table1s)
-                                                      :aggregation [[:sum [:field (:id @field1s) nil]]]}
-                                         :creator_id (:id @user1s)))
-            (reset! serialized (into [] (serdes.extract/extract {})))))
-
-        (testing "exported form is properly converted"
-          (is (= {:source-table ["my-db" nil "orders"]
-                  :aggregation [[:sum [:field ["my-db" nil "orders" "subtotal"] nil]]]}
-                 (-> @serialized
-                     (by-model "LegacyMetric")
-                     first
-                     :definition))))
-
-        (testing "deserializing adjusts the IDs properly"
-          (ts/with-db dest-db
-            ;; A different database and tables, so the IDs don't match.
-            (reset! db2d    (ts/create! Database :name "other-db"))
-            (reset! table2d (ts/create! Table    :name "customers" :db_id (:id @db2d)))
-            (reset! field2d (ts/create! Field    :name "age" :table_id (:id @table2d)))
-            (reset! user1d  (ts/create! User  :first_name "Tom" :last_name "Scholz" :email "tom@bost.on"))
-
-            ;; Load the serialized content.
-            (serdes.load/load-metabase! (ingestion-in-memory @serialized))
-
-            ;; Fetch the relevant bits
-            (reset! db1d     (t2/select-one Database :name "my-db"))
-            (reset! table1d  (t2/select-one Table :name "orders"))
-            (reset! field1d  (t2/select-one Field :table_id (:id @table1d) :name "subtotal"))
-            (reset! metric1d (t2/select-one LegacyMetric :name "Revenue"))
-
-            (testing "the main Database, Table, and Field have different IDs now"
-              (is (not= (:id @db1s) (:id @db1d)))
-              (is (not= (:id @table1s) (:id @table1d)))
-              (is (not= (:id @field1s) (:id @field1d))))
-
-            (is (not= (:definition @metric1s)
-                      (:definition @metric1d)))
-            (testing "the Metric's definition is based on the new Database, Table, and Field IDs"
-              (is (= {:source-table (:id @table1d)
-                      :aggregation  [[:sum [:field (:id @field1d) nil]]]}
-                     (:definition @metric1d))))))))))
-
 #_{:clj-kondo/ignore [:metabase/i-like-making-cams-eyes-bleed-with-horrifically-long-tests]}
 (deftest dashboard-card-test
   ;; DashboardCard.parameter_mappings and Card.parameter_mappings are JSON-encoded lists of parameter maps, which
@@ -758,63 +684,47 @@
   ;; used. However, if no such user exists, a new one is created with mostly blank fields.
   (testing "existing users are found and used; missing users are created on the fly"
     (let [serialized (atom nil)
-          metric1s   (atom nil)
-          metric2s   (atom nil)
           user1s     (atom nil)
           user2s     (atom nil)
+          dash1s     (atom nil)
+          dash2s     (atom nil)
           user1d     (atom nil)
-          metric1d   (atom nil)
-          metric2d   (atom nil)]
+          dash1d     (atom nil)
+          dash2d     (atom nil)]
 
       (ts/with-dbs [source-db dest-db]
         (testing "serializing the original entities"
           (ts/with-db source-db
             (reset! user1s    (ts/create! User :first_name "Tom" :last_name "Scholz" :email "tom@bost.on"))
             (reset! user2s    (ts/create! User :first_name "Neil"  :last_name "Peart"   :email "neil@rush.yyz"))
-            (reset! metric1s  (ts/create! LegacyMetric
-                                          :name "Large Users"
-                                          :table_id   (mt/id :venues)
-                                          :creator_id (:id @user1s)
-                                          :definition {:aggregation [[:count]]}))
-            (reset! metric2s  (ts/create! LegacyMetric
-                                          :name "Support Headaches"
-                                          :table_id   (mt/id :venues)
-                                          :creator_id (:id @user2s)
-                                          :definition {:aggregation [[:count]]}))
+            (reset! dash1s    (ts/create! Dashboard :name "My Dashboard" :creator_id (:id @user1s)))
+            (reset! dash2s    (ts/create! Dashboard :name "Linked dashboard" :creator_id (:id @user2s)))
             (reset! serialized (into [] (serdes.extract/extract {})))))
 
-        (testing "exported form is properly converted"
-          (is (= "tom@bost.on"
-                 (-> @serialized
-                     (by-model "LegacyMetric")
-                     first
-                     :creator_id))))
-
         (testing "deserializing finds the matching user and synthesizes the missing one"
           (ts/with-db dest-db
             ;; Create another random user to change the user IDs.
             (ts/create! User   :first_name "Gideon" :last_name "Nav" :email "griddle@ninth.tomb")
-            ;; Likewise, create some other metrics.
-            (ts/create! LegacyMetric :name "Other metric A" :table_id (mt/id :venues))
-            (ts/create! LegacyMetric :name "Other metric B" :table_id (mt/id :venues))
-            (ts/create! LegacyMetric :name "Other metric C" :table_id (mt/id :venues))
+            ;; Likewise, create some other dashboards.
+            (ts/create! Dashboard :name "Other dashboard A")
+            (ts/create! Dashboard :name "Other dashboard B")
+            (ts/create! Dashboard :name "Other dashboard C")
             (reset! user1d  (ts/create! User  :first_name "Tom" :last_name "Scholz" :email "tom@bost.on"))
 
             ;; Load the serialized content.
             (serdes.load/load-metabase! (ingestion-in-memory @serialized))
 
-            ;; Fetch the relevant bits
-            (reset! metric1d (t2/select-one LegacyMetric :name "Large Users"))
-            (reset! metric2d (t2/select-one LegacyMetric :name "Support Headaches"))
+            (reset! dash1d (t2/select-one Dashboard :name "My Dashboard"))
+            (reset! dash2d (t2/select-one Dashboard :name "Linked dashboard"))
 
-            (testing "the Metrics and Users have different IDs now"
-              (is (not= (:id @metric1s) (:id @metric1d)))
-              (is (not= (:id @metric2s) (:id @metric2d)))
+            (testing "the Dashboards and Users have different IDs now"
+              (is (not= (:id @dash1s) (:id @dash1d)))
+              (is (not= (:id @dash2s) (:id @dash2d)))
               (is (not= (:id @user1s)   (:id @user1d))))
 
             (testing "both existing User and the new one are set up properly"
-              (is (= (:id @user1d) (:creator_id @metric1d)))
-              (let [user2d-id (:creator_id @metric2d)
+              (is (= (:id @user1d) (:creator_id @dash1d)))
+              (let [user2d-id (:creator_id @dash2d)
                     user2d    (t2/select-one User :id user2d-id)]
                 (is (any? user2d))
                 (is (= (:email @user2s) (:email user2d)))))))))))
diff --git a/src/metabase/cmd/copy.clj b/src/metabase/cmd/copy.clj
index 39e974d6499..6ffc0010dce 100644
--- a/src/metabase/cmd/copy.clj
+++ b/src/metabase/cmd/copy.clj
@@ -53,8 +53,6 @@
     :model/Field
     :model/FieldValues
     :model/Segment
-    :model/LegacyMetric
-    :model/LegacyMetricImportantField
     :model/ModerationReview
     :model/Revision
     :model/ViewLog
diff --git a/src/metabase/models/legacy_metric.clj b/src/metabase/models/legacy_metric.clj
index 8087fadac46..b3d20b0d33f 100644
--- a/src/metabase/models/legacy_metric.clj
+++ b/src/metabase/models/legacy_metric.clj
@@ -27,7 +27,6 @@
 (doto :model/LegacyMetric
   (derive :metabase/model)
   (derive :hook/timestamped?)
-  (derive :hook/entity-id)
   (derive ::mi/write-policy.superuser)
   (derive ::mi/create-policy.superuser))
 
diff --git a/test/metabase/cmd/copy_test.clj b/test/metabase/cmd/copy_test.clj
index 8fe2be32e9e..8199856be4d 100644
--- a/test/metabase/cmd/copy_test.clj
+++ b/test/metabase/cmd/copy_test.clj
@@ -31,6 +31,8 @@
     :model/CloudMigration
     :model/DashboardFavorite
     :model/FieldUsage
+    :model/LegacyMetric
+    :model/LegacyMetricImportantField
     :model/Query
     :model/QueryCache
     :model/QueryExecution
-- 
GitLab