summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/backfill_upvotes_count_on_issues.rb
blob: 170af90805a3e654ac3466d72c6b86f919acb20b (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
# frozen_string_literal: true

module Gitlab
  module BackgroundMigration
    # Class that will populate the upvotes_count field
    # for each issue
    class BackfillUpvotesCountOnIssues
      BATCH_SIZE = 1_000

      def perform(start_id, stop_id)
        (start_id..stop_id).step(BATCH_SIZE).each do |offset|
          update_issue_upvotes_count(offset, offset + BATCH_SIZE)
        end
      end

      private

      def execute(sql)
        @connection ||= ::ActiveRecord::Base.connection
        @connection.execute(sql)
      end

      def update_issue_upvotes_count(batch_start, batch_stop)
        execute(<<~SQL)
          UPDATE issues
          SET upvotes_count = sub_q.count_all
          FROM (
            SELECT COUNT(*) AS count_all, e.awardable_id AS issue_id
            FROM award_emoji AS e
            WHERE e.name = 'thumbsup' AND
            e.awardable_type = 'Issue' AND
            e.awardable_id BETWEEN #{batch_start} AND #{batch_stop}
            GROUP BY issue_id
          ) AS sub_q
          WHERE sub_q.issue_id = issues.id;
        SQL
      end
    end
  end
end