summaryrefslogtreecommitdiff
path: root/db/migrate/20161017125927_add_unique_index_to_labels.rb
blob: f2b56ebfb7b5ec12ec465790aaede27c3372ab9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class AddUniqueIndexToLabels < ActiveRecord::Migration
  include Gitlab::Database::MigrationHelpers

  DOWNTIME = true
  DOWNTIME_REASON = 'This migration removes duplicated labels.'

  disable_ddl_transaction!

  def up
    select_all('SELECT title, project_id, COUNT(id) as cnt FROM labels GROUP BY project_id, title HAVING COUNT(id) > 1').each do |label|
      label_title = quote_string(label['title'])
      duplicated_ids = select_all("SELECT id FROM labels WHERE project_id = #{label['project_id']} AND title = '#{label_title}' ORDER BY id ASC").map{ |label| label['id'] }
      label_id = duplicated_ids.first
      duplicated_ids.delete(label_id)

      execute("UPDATE label_links SET label_id = #{label_id} WHERE label_id IN(#{duplicated_ids.join(",")})")
      execute("DELETE FROM labels WHERE id IN(#{duplicated_ids.join(",")})")
    end

    remove_index :labels, column: :project_id if index_exists?(:labels, :project_id)
    remove_index :labels, column: :title if index_exists?(:labels, :title)

    add_concurrent_index :labels, [:group_id, :project_id, :title], unique: true
  end

  def down
    remove_index :labels, column: [:group_id, :project_id, :title] if index_exists?(:labels, [:group_id, :project_id, :title], unique: true)

    add_concurrent_index :labels, :project_id
    add_concurrent_index :labels, :title
  end
end