Rename instead of delete, feedback:

https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/12363#note_33449374
This commit is contained in:
Lin Jen-Shin 2017-06-27 17:46:45 +08:00
parent 6ff162cfd9
commit 10e732d2bb
3 changed files with 47 additions and 48 deletions

View File

@ -1,45 +0,0 @@
class RemoveDuplicatedVariable < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
if Gitlab::Database.postgresql?
execute <<~SQL
DELETE FROM ci_variables var USING (#{duplicated_ids}) dup
#{join_conditions}
SQL
else
execute <<~SQL
DELETE var FROM ci_variables var INNER JOIN (#{duplicated_ids}) dup
#{join_conditions}
SQL
end
end
def down
# noop
end
def duplicated_ids
<<~SQL
SELECT MAX(id) AS id, #{key}, project_id
FROM ci_variables GROUP BY #{key}, project_id
SQL
end
def join_conditions
<<~SQL
WHERE var.key = dup.key
AND var.project_id = dup.project_id
AND var.id <> dup.id
SQL
end
def key
# key needs to be quoted in MySQL
quote_column_name('key')
end
end

View File

@ -0,0 +1,35 @@
class RenameDuplicatedVariableKey < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
execute(<<~SQL)
UPDATE ci_variables SET #{key} = CONCAT(#{key}, #{underscore}, id)
WHERE id IN (
SELECT * FROM ( -- MySQL requires an extra layer
SELECT dup.id FROM ci_variables dup
INNER JOIN (SELECT max(id) AS id, #{key}, project_id
FROM ci_variables tmp
GROUP BY #{key}, project_id) var
USING (#{key}, project_id) where dup.id <> var.id
) dummy
)
SQL
end
def down
# noop
end
def key
# key needs to be quoted in MySQL
quote_column_name('key')
end
def underscore
quote('_')
end
end

View File

@ -1,7 +1,7 @@
require 'spec_helper'
require Rails.root.join('db', 'migrate', '20170622135451_remove_duplicated_variable.rb')
require Rails.root.join('db', 'migrate', '20170622135451_rename_duplicated_variable_key.rb')
describe RemoveDuplicatedVariable, :migration do
describe RenameDuplicatedVariableKey, :migration do
let(:variables) { table(:ci_variables) }
let(:projects) { table(:projects) }
@ -20,6 +20,15 @@ describe RemoveDuplicatedVariable, :migration do
it 'correctly remove duplicated records with smaller id' do
migrate!
expect(variables.pluck(:id)).to contain_exactly(1, 2, 6, 7, 8)
expect(variables.pluck(:id, :key)).to contain_exactly(
[1, 'key1'],
[2, 'key2'],
[3, 'keyX_3'],
[4, 'keyX_4'],
[5, 'keyY_5'],
[6, 'keyX'],
[7, 'key7'],
[8, 'keyY']
)
end
end