Skip to content
Snippets Groups Projects
Unverified Commit 82d451e9 authored by Braden Shepherdson's avatar Braden Shepherdson Committed by GitHub
Browse files

Serdes v2 for Segments (#24146)

parent 8f46b5a1
Branches
Tags
No related merge requests found
......@@ -11,6 +11,7 @@
"Field"
"Metric"
"NativeQuerySnippet"
"Segment"
"Setting"
"Table"
"Timeline"
......
......@@ -67,6 +67,8 @@
:human_readable_field_id ::rs/omit}}]]
:metric [[30 {:refs {:table_id (random-keyword "t" 100)
:creator_id (random-keyword "u" 10)}}]]
:segment [[30 {:refs {:table_id (random-keyword "t" 100)
:creator_id (random-keyword "u" 10)}}]]
:native-query-snippet [[10 {:refs {:creator_id (random-keyword "u" 10)
:collection_id (random-keyword "coll" 10 100)}}]]
:timeline [[10 {:refs {:creator_id (random-keyword "u" 10)
......@@ -186,6 +188,16 @@
(update :updated_at u.date/format))
(yaml/from-file (io/file dump-dir "Metric" filename))))))
(testing "for segments"
(is (= 30 (count (dir->file-set (io/file dump-dir "Segment")))))
(doseq [{:keys [entity_id name] :as segment} (get entities "Segment")
:let [filename (#'u.yaml/leaf-file-name entity_id name)]]
(is (= (-> segment
(dissoc :serdes/meta)
(update :created_at u.date/format)
(update :updated_at u.date/format))
(yaml/from-file (io/file dump-dir "Segment" filename))))))
(testing "for native query snippets"
(is (= 10 (count (dir->file-set (io/file dump-dir "NativeQuerySnippet")))))
(doseq [{:keys [entity_id name] :as snippet} (get entities "NativeQuerySnippet")
......
......@@ -3,7 +3,7 @@
[metabase-enterprise.serialization.test-util :as ts]
[metabase-enterprise.serialization.v2.extract :as extract]
[metabase.models :refer [Card Collection Dashboard DashboardCard Database Dimension Field Metric
NativeQuerySnippet Table Timeline TimelineEvent User]]
NativeQuerySnippet Segment Table Timeline TimelineEvent User]]
[metabase.models.serialization.base :as serdes.base]
[schema.core :as s])
(:import [java.time LocalDateTime OffsetDateTime]))
......@@ -336,7 +336,7 @@
(testing "and has no deps"
(is (empty? (serdes.base/serdes-dependencies ser))))))))))
(deftest timelines-and-events-test
(deftest timelines-and-events-test
(ts/with-empty-h2-app-db
(ts/with-temp-dpc [User [{ann-id :id} {:first_name "Ann"
:last_name "Wilson"
......@@ -406,3 +406,30 @@
(testing "depend on the Timeline"
(is (= #{[{:model "Timeline" :id line-eid}]}
(set (serdes.base/serdes-dependencies ser))))))))))
(deftest segments-test
(ts/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}]
Segment [{s1-id :id
s1-eid :entity_id} {:name "My Segment"
:creator_id ann-id
:table_id no-schema-id}]]
(testing "segment"
(let [ser (serdes.base/extract-one "Segment" {} (select-one "Segment" [:= :id s1-id]))]
(is (schema= {:serdes/meta (s/eq [{:model "Segment" :id s1-eid :label "My Segment"}])
:table_id (s/eq ["My Database" nil "Schemaless Table"])
:creator_id (s/eq "ann@heart.band")
:created_at LocalDateTime
(s/optional-key :updated_at) LocalDateTime
s/Keyword s/Any}
ser))
(is (not (contains? ser :id)))
(testing "depend on the Table"
(is (= #{[{:model "Database" :id "My Database"}
{:model "Table" :id "Schemaless Table"}]}
(set (serdes.base/serdes-dependencies ser))))))))))
......@@ -4,7 +4,9 @@
(:require [medley.core :as m]
[metabase.models.interface :as mi]
[metabase.models.revision :as revision]
[metabase.models.serialization.base :as serdes.base]
[metabase.models.serialization.hash :as serdes.hash]
[metabase.models.serialization.util :as serdes.util]
[metabase.util :as u]
[metabase.util.i18n :refer [tru]]
[metabase.util.schema :as su]
......@@ -78,6 +80,27 @@
{:serialize-instance serialize-segment
:diff-map diff-segments}))
;;; ------------------------------------------------ Serialization ---------------------------------------------------
(defmethod serdes.base/serdes-generate-path "Segment"
[_ segment]
[(assoc (serdes.base/infer-self-path "Segment" segment)
:label (:name segment))])
(defmethod serdes.base/extract-one "Segment"
[_model-name _opts segment]
(-> (serdes.base/extract-one-basics "Segment" segment)
(update :table_id serdes.util/export-table-fk)
(update :creator_id serdes.util/export-fk-keyed 'User :email)))
(defmethod serdes.base/load-xform "Segment" [segment]
(-> segment
serdes.base/load-xform-basics
(update :table_id serdes.util/import-table-fk)
(update :creator_id serdes.util/import-fk-keyed 'User :email)))
(defmethod serdes.base/serdes-dependencies "Segment" [{:keys [table_id]}]
[(serdes.util/table->path table_id)])
;;; ------------------------------------------------------ Etc. ------------------------------------------------------
......
......@@ -5,7 +5,7 @@
[metabase.mbql.util :as mbql.u]
[metabase.models :refer [Activity Card Collection Dashboard DashboardCard DashboardCardSeries Database
Dimension Field Metric NativeQuerySnippet PermissionsGroup
PermissionsGroupMembership Pulse PulseCard PulseChannel Table
PermissionsGroupMembership Pulse PulseCard PulseChannel Segment Table
Timeline TimelineEvent User]]
[reifyhealth.specmonstah.core :as rs]
[reifyhealth.specmonstah.spec-gen :as rsg]
......@@ -144,6 +144,7 @@
(s/def ::field (s/keys :req-un [::id ::name ::base_type ::database_type ::position ::description]))
(s/def ::metric (s/keys :req-un [::id ::name ::definition ::description]))
(s/def ::segment (s/keys :req-un [::id ::name ::definition ::description]))
(s/def ::table (s/keys :req-un [::id ::active ::name ::description]))
(s/def ::native-query-snippet (s/keys :req-un [::id ::name ::description ::content]))
(s/def ::dashboard (s/keys :req-un [::id ::name ::description ::parameters]))
......@@ -257,9 +258,12 @@
:insert! {:model TimelineEvent}
:relations {:timeline_id [:timeline :id]
:creator_id [:core-user :id]}}
:segment {:prefix :seg
:spec ::segment
:insert! {:model Segment}
:relations {:creator_id [:core-user :id]
:table_id [:table :id]}}
;; :revision {}
;; :segment {}
;; :task-history {}
})
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment