summaryrefslogtreecommitdiff
path: root/db/post_migrate/20200831065705_ensure_target_project_id_is_filled.rb
blob: 8693dca00004add42b31434e471958f9dc6ca8a9 (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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# frozen_string_literal: true

class EnsureTargetProjectIdIsFilled < ActiveRecord::Migration[6.0]
  include Gitlab::Database::MigrationHelpers

  BACKGROUND_MIGRATION_CLASS = 'CopyMergeRequestTargetProjectToMergeRequestMetrics'
  BATCH_SIZE = 1_000
  DOWNTIME = false

  disable_ddl_transaction!

  class MergeRequest < ActiveRecord::Base
    self.table_name = 'merge_requests'
  end

  class MergeRequestMetrics < ActiveRecord::Base
    include EachBatch

    belongs_to :merge_request

    self.table_name = 'merge_request_metrics'
  end

  def up
    Gitlab::BackgroundMigration.steal(BACKGROUND_MIGRATION_CLASS)

    # Do a manual update in case we lost BG jobs. The expected record count should be 0 or very low.
    MergeRequestMetrics.where(target_project_id: nil).each_batch do |scope|
      query_for_cte = scope.joins(:merge_request).select(
        MergeRequestMetrics.arel_table[:id].as('id'),
        MergeRequest.arel_table[:target_project_id].as('target_project_id')
      )

      MergeRequestMetrics.connection.execute <<-SQL
        WITH target_project_id_and_metrics_id as #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (
          #{query_for_cte.to_sql}
        )
        UPDATE #{MergeRequestMetrics.connection.quote_table_name(MergeRequestMetrics.table_name)}
        SET target_project_id = target_project_id_and_metrics_id.target_project_id
        FROM target_project_id_and_metrics_id
        WHERE merge_request_metrics.id = target_project_id_and_metrics_id.id
      SQL
    end
  end

  def down
    # no-op
  end
end