summaryrefslogtreecommitdiff
path: root/db/post_migrate/20200526115436_dedup_mr_metrics.rb
diff options
context:
space:
mode:
Diffstat (limited to 'db/post_migrate/20200526115436_dedup_mr_metrics.rb')
-rw-r--r--db/post_migrate/20200526115436_dedup_mr_metrics.rb65
1 files changed, 0 insertions, 65 deletions
diff --git a/db/post_migrate/20200526115436_dedup_mr_metrics.rb b/db/post_migrate/20200526115436_dedup_mr_metrics.rb
deleted file mode 100644
index d2660504939..00000000000
--- a/db/post_migrate/20200526115436_dedup_mr_metrics.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-# frozen_string_literal: true
-
-class DedupMrMetrics < ActiveRecord::Migration[6.0]
- include Gitlab::Database::MigrationHelpers
-
- DOWNTIME = false
- TMP_INDEX_NAME = 'tmp_unique_merge_request_metrics_by_merge_request_id'
- INDEX_NAME = 'unique_merge_request_metrics_by_merge_request_id'
-
- disable_ddl_transaction!
-
- class MergeRequestMetrics < ActiveRecord::Base
- self.table_name = 'merge_request_metrics'
-
- include EachBatch
- end
-
- def up
- last_metrics_record_id = MergeRequestMetrics.maximum(:id) || 0
-
- # This index will disallow further duplicates while we're deduplicating the data.
- add_concurrent_index(:merge_request_metrics, :merge_request_id, where: "id > #{Integer(last_metrics_record_id)}", unique: true, name: TMP_INDEX_NAME)
-
- MergeRequestMetrics.each_batch do |relation|
- duplicated_merge_request_ids = MergeRequestMetrics
- .where(merge_request_id: relation.select(:merge_request_id))
- .select(:merge_request_id)
- .group(:merge_request_id)
- .having('COUNT(merge_request_metrics.merge_request_id) > 1')
- .pluck(:merge_request_id)
-
- duplicated_merge_request_ids.each do |merge_request_id|
- deduplicate_item(merge_request_id)
- end
- end
-
- add_concurrent_index(:merge_request_metrics, :merge_request_id, unique: true, name: INDEX_NAME)
- remove_concurrent_index_by_name(:merge_request_metrics, TMP_INDEX_NAME)
- end
-
- def down
- remove_concurrent_index_by_name(:merge_request_metrics, TMP_INDEX_NAME)
- remove_concurrent_index_by_name(:merge_request_metrics, INDEX_NAME)
- end
-
- private
-
- def deduplicate_item(merge_request_id)
- merge_request_metrics_records = MergeRequestMetrics.where(merge_request_id: merge_request_id).order(updated_at: :asc).to_a
-
- attributes = {}
- merge_request_metrics_records.each do |merge_request_metrics_record|
- params = merge_request_metrics_record.attributes.except('id')
- attributes.merge!(params.compact)
- end
-
- ActiveRecord::Base.transaction do
- record_to_keep = merge_request_metrics_records.pop
- records_to_delete = merge_request_metrics_records
-
- MergeRequestMetrics.where(id: records_to_delete.map(&:id)).delete_all
- record_to_keep.update!(attributes)
- end
- end
-end