Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-04-24 21:35:06 +0400
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-04-24 21:39:33 +0400
commitae7bd9f7c0d78a4c039a8511d8d045eebd9706e4 (patch)
treeaf674ea3dc164b894561ceaf01facb7a30678512 /db
parent3bf1cff4215c8b60c4133c3e822495f046638583 (diff)
Migrate invalid rows with missing iids or duplicates
Diffstat (limited to 'db')
-rw-r--r--db/migrate/20140416074002_add_index_on_iid.rb25
1 files changed, 25 insertions, 0 deletions
diff --git a/db/migrate/20140416074002_add_index_on_iid.rb b/db/migrate/20140416074002_add_index_on_iid.rb
index cbd09082781..85269e2a03b 100644
--- a/db/migrate/20140416074002_add_index_on_iid.rb
+++ b/db/migrate/20140416074002_add_index_on_iid.rb
@@ -1,7 +1,32 @@
class AddIndexOnIid < ActiveRecord::Migration
def change
+ RemoveDuplicateIid.clean(Issue)
+ RemoveDuplicateIid.clean(MergeRequest, 'target_project_id')
+ RemoveDuplicateIid.clean(Milestone)
+
add_index :issues, [:project_id, :iid], unique: true
add_index :merge_requests, [:target_project_id, :iid], unique: true
add_index :milestones, [:project_id, :iid], unique: true
end
end
+
+class RemoveDuplicateIid
+ def self.clean(klass, project_field = 'project_id')
+ duplicates = klass.find_by_sql("SELECT iid, #{project_field} FROM #{klass.table_name} GROUP BY #{project_field}, iid HAVING COUNT(*) > 1")
+
+ duplicates.each do |duplicate|
+ project_id = duplicate.send(project_field)
+ iid = duplicate.iid
+ items = klass.of_projects(project_id).where(iid: iid)
+
+ if items.size > 1
+ puts "Remove #{klass.name} duplicates for iid: #{iid} and project_id: #{project_id}"
+ items.shift
+ items.each do |item|
+ item.destroy
+ puts '.'
+ end
+ end
+ end
+ end
+end