2017-08-17 22:00:37 +05:30
# rubocop:disable RemoveIndex
2019-01-03 12:48:30 +05:30
class AddUniqueIndexToLabels < ActiveRecord :: Migration
2016-11-03 12:29:30 +05:30
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' ] )
2018-03-17 18:26:18 +05:30
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' ] }
2016-11-03 12:29:30 +05:30
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