diff options
Diffstat (limited to 'lib/gitlab/background_migration/replace_blocked_by_links.rb')
-rw-r--r-- | lib/gitlab/background_migration/replace_blocked_by_links.rb | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/gitlab/background_migration/replace_blocked_by_links.rb b/lib/gitlab/background_migration/replace_blocked_by_links.rb new file mode 100644 index 00000000000..26626aaef79 --- /dev/null +++ b/lib/gitlab/background_migration/replace_blocked_by_links.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +# rubocop:disable Style/Documentation + +module Gitlab + module BackgroundMigration + class ReplaceBlockedByLinks + class IssueLink < ActiveRecord::Base + self.table_name = 'issue_links' + end + + def perform(start_id, stop_id) + blocked_by_links = IssueLink.where(id: start_id..stop_id).where(link_type: 2) + + ActiveRecord::Base.transaction do + # if there is duplicit bi-directional relation (issue2 is blocked by issue1 + # and issue1 already links issue2), then we can just delete 'blocked by'. + # This should be rare as we have a pre-create check which checks if issues are + # already linked + blocked_by_links + .joins('INNER JOIN issue_links as opposite_links ON issue_links.source_id = opposite_links.target_id AND issue_links.target_id = opposite_links.source_id') + .where('opposite_links.link_type': 1) + .delete_all + + blocked_by_links.update_all('source_id=target_id,target_id=source_id,link_type=1') + end + end + end + end +end |