From 36e4e377c09a42a0794a32008c02751cf1ab310b Mon Sep 17 00:00:00 2001 From: Marcela Poffald <30735158+mpoffald@users.noreply.github.com> Date: Thu, 3 Nov 2022 11:13:45 -0400 Subject: [PATCH] Generate datapotato schema (#1) add a generator for datapotato schema --- src/donut/dbxray/generate/datapotato.cljc | 42 +++++++++++++++ test/donut/dbxray/fixtures.cljc | 54 +++++++++---------- .../dbxray/generate/datapotato_test.cljc | 17 ++++++ 3 files changed, 85 insertions(+), 28 deletions(-) create mode 100644 src/donut/dbxray/generate/datapotato.cljc create mode 100644 test/donut/dbxray/generate/datapotato_test.cljc diff --git a/src/donut/dbxray/generate/datapotato.cljc b/src/donut/dbxray/generate/datapotato.cljc new file mode 100644 index 0000000..29b891e --- /dev/null +++ b/src/donut/dbxray/generate/datapotato.cljc @@ -0,0 +1,42 @@ +(ns donut.dbxray.generate.datapotato + (:require + [clojure.string :as string] + [donut.dbxray.generate :as ddg])) + +(defn- table-prefix + [table-name] + (let [words (string/split (name table-name) #"_") + initials (map first words)] + {:prefix (keyword (apply str initials))})) + +(defn- full-column-name + [table-name col-name] + (let [table (name table-name)] + (keyword (str table "/" (name col-name))))) + + +(defn- table-relations + [table-name columns] + (some->> (not-empty + (into {} + (keep (fn [[column-name column-data]] + (when-let [refers-to (:refers-to column-data)] + (let [relations-key (full-column-name table-name column-name) + [ref-table ref-col] refers-to] + {relations-key [ref-table (full-column-name ref-table ref-col)]}))) + columns))) + (assoc {} :relations))) + + (defn- table-potato-schema + [table-name table-data] + (let [{:keys [columns]} table-data + prefix (gen-table-prefix table-name)] + {table-name (merge prefix + (table-relations table-name columns))})) + +(defn generate + [xray] + (reduce (fn [generated [table-name table-data]] + (merge generated (table-potato-schema table-name table-data))) + (omap/ordered-map) + xray)) diff --git a/test/donut/dbxray/fixtures.cljc b/test/donut/dbxray/fixtures.cljc index 3199c1a..17ca229 100644 --- a/test/donut/dbxray/fixtures.cljc +++ b/test/donut/dbxray/fixtures.cljc @@ -2,31 +2,29 @@ (:require [flatland.ordered.map :as omap])) (def todo-list-xray - {:users {:columns (omap/ordered-map - :id {:column-type :integer - :primary-key? true - :unique? true} - :username {:column-type :varchar - :unique? true})} - :todo_lists {:columns (omap/ordered-map - :id {:column-type :integer - :primary-key? true - :unique? true} - :created_by_id {:column-type :integer - :nullable? true - :refers-to [:users :id]})} - :todos {:columns (omap/ordered-map - :id {:column-type :integer - :primary-key? true - :unique? true} - :todo_list_id {:column-type :integer - :nullable? true - :refers-to [:todo_lists :id]} - :todo_title {:column-type :varchar} - :notes {:column-type :text - :nullable? true} - :created_by_id {:column-type :integer - :nullable? true - :refers-to [:users :id]} - :created_at {:column-type :timestamp - :nullable? true})}}) + (omap/ordered-map + :users {:columns {:id {:column-type :integer + :primary-key? true + :unique? true} + :username {:column-type :varchar + :unique? true}}} + :todo_lists {:columns {:id {:column-type :integer + :primary-key? true + :unique? true} + :created_by_id {:column-type :integer + :nullable? true + :refers-to [:users :id]}}} + :todos {:columns {:id {:column-type :integer + :primary-key? true + :unique? true} + :todo_list_id {:column-type :integer + :nullable? true + :refers-to [:todo_lists :id]} + :todo_title {:column-type :varchar} + :notes {:column-type :text + :nullable? true} + :created_by_id {:column-type :integer + :nullable? true + :refers-to [:users :id]} + :created_at {:column-type :timestamp + :nullable? true}}})) diff --git a/test/donut/dbxray/generate/datapotato_test.cljc b/test/donut/dbxray/generate/datapotato_test.cljc new file mode 100644 index 0000000..c6d6410 --- /dev/null +++ b/test/donut/dbxray/generate/datapotato_test.cljc @@ -0,0 +1,17 @@ +(ns donut.dbxray.generate.datapotato-test + (:require + [clojure.test :refer [deftest is]] + [donut.dbxray.generate.datapotato :as ddgd] + [donut.dbxray.fixtures :as ddf] + [flatland.ordered.map :as omap])) + +(deftest generates-datapotato-schema + (let [datapotato-schem (omap/ordered-map)]) + (is (= (into [] + (omap/ordered-map :users {:prefix :u} + :todo_lists {:prefix :tl + :relations {:todo_lists/created_by_id [:users :users/id]}} + :todos {:prefix :t + :relations {:todos/todo_list_id [:todo_lists :todo_lists/id] + :todos/created_by_id [:users :users/id]}})) + (into [] (ddgd/generate ddf/todo-list-xray)))))