Skip to content

Commit

Permalink
Merge pull request metabase#1881 from metabase/fix-dupe-fks
Browse files Browse the repository at this point in the history
Fix dupe fks
  • Loading branch information
agilliland committed Feb 4, 2016
2 parents 2775afa + fc015c6 commit 56b123e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
12 changes: 12 additions & 0 deletions src/metabase/db/migrations.clj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
(metabase.models [activity :refer [Activity]]
[card :refer [Card]]
[database :refer [Database]]
[foreign-key :refer [ForeignKey]]
[table :refer [Table]]
[setting :as setting])
[metabase.sample-data :as sample-data]
Expand Down Expand Up @@ -96,3 +97,14 @@
(when-not (contains? activity-feed-topics :database-sync-begin)
(k/delete Activity
(k/where {:topic "database-sync"}))))


;; Clean up duplicate FK entries
(defmigration remove-duplicate-fk-entries
(let [existing-fks (db/sel :many ForeignKey)
grouped-fks (group-by #(str (:origin_id %) "_" (:destination_id %)) existing-fks)]
(doseq [[k fks] grouped-fks]
(when (< 1 (count fks))
(log/debug "Removing duplicate FK entries for" k)
(doseq [duplicate-fk (drop-last fks)]
(db/del ForeignKey :id (:id duplicate-fk)))))))
15 changes: 8 additions & 7 deletions src/metabase/driver/sync.clj
Original file line number Diff line number Diff line change
Expand Up @@ -476,18 +476,19 @@ infer-field-special-type
(every? :dest-column-name fks))
"table-fks should return a set of maps with keys :fk-column-name, :dest-table, and :dest-column-name.")
(when (seq fks)
(let [fk-name->id (sel :many :field->id [Field :name], :table_id (:id table), :name [in (map :fk-column-name fks)], :parent_id nil)]
(let [fk-name->id (sel :many :field->id [Field :name], :table_id (:id table), :name [in (map :fk-column-name fks)], :parent_id nil)]
(doseq [{:keys [fk-column-name dest-column-name dest-table]} fks]
(when-let [fk-column-id (fk-name->id fk-column-name)]
(when-let [dest-table-id (sel :one :field [Table :id], :db_id (:db_id table) :name (:name dest-table) :schema (:schema dest-table))]
(when-let [dest-column-id (sel :one :id Field, :table_id dest-table-id, :name dest-column-name, :parent_id nil)]
(log/debug (u/format-color 'green "Marking foreign key '%s.%s' -> '%s.%s'." (:name table) fk-column-name (:name dest-table) dest-column-name))
(ins ForeignKey
:origin_id fk-column-id
:destination_id dest-column-id
;; TODO: do we even care about this?
;:relationship (determine-fk-type {:id fk-column-id, :table (delay table)}) ; fake a Field instance
:relationship :Mt1)
(when-not (exists? ForeignKey :origin_id fk-column-id, :destination_id dest-column-id)
(ins ForeignKey
:origin_id fk-column-id
:destination_id dest-column-id
;; TODO: do we even care about this?
;:relationship (determine-fk-type {:id fk-column-id, :table (delay table)}) ; fake a Field instance
:relationship :Mt1))
(upd Field fk-column-id :special_type :fk))))))))))


Expand Down

0 comments on commit 56b123e

Please sign in to comment.