2017-04-05 18:53:57 -04:00
# rubocop:disable RemoveIndex
2016-10-15 11:46:20 -04:00
class AddUniqueIndexToLabels < ActiveRecord :: Migration
include Gitlab :: Database :: MigrationHelpers
DOWNTIME = true
DOWNTIME_REASON = 'This migration removes duplicated labels.'
disable_ddl_transaction!
def up
2016-10-21 00:43:24 -04:00
select_all ( 'SELECT title, project_id, COUNT(id) as cnt FROM labels GROUP BY project_id, title HAVING COUNT(id) > 1' ) . each do | label |
2016-10-15 11:46:20 -04:00
label_title = quote_string ( label [ 'title' ] )
2017-08-09 05:52:22 -04:00
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-10-15 11:46:20 -04:00
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