From 1eb51932c461e79322f2c668a78fe546153c16b0 Mon Sep 17 00:00:00 2001
From: Martin Schurz <2090677-schurzi@users.noreply.gitlab.com>
Date: Tue, 6 Feb 2024 11:13:07 +0000
Subject: [PATCH] Create index for merge_request_metrics

The additional index is needed to support the filter by merge_user
in merge request views.

Changelog: other
---
 ...n_merged_by_id_target_project_id_m_r_id.rb | 26 +++++++++++++++++++
 db/schema_migrations/20240121161500           |  1 +
 db/structure.sql                              |  4 +--
 3 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100644 db/post_migrate/20240121161500_add_index_merge_request_metrics_on_merged_by_id_target_project_id_m_r_id.rb
 create mode 100644 db/schema_migrations/20240121161500

diff --git a/db/post_migrate/20240121161500_add_index_merge_request_metrics_on_merged_by_id_target_project_id_m_r_id.rb b/db/post_migrate/20240121161500_add_index_merge_request_metrics_on_merged_by_id_target_project_id_m_r_id.rb
new file mode 100644
index 0000000000000..7c14ccb58a2fd
--- /dev/null
+++ b/db/post_migrate/20240121161500_add_index_merge_request_metrics_on_merged_by_id_target_project_id_m_r_id.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class AddIndexMergeRequestMetricsOnMergedByIdTargetProjectIdMRId < Gitlab::Database::Migration[2.2]
+  disable_ddl_transaction!
+
+  milestone '16.9'
+
+  TABLE_NAME = :merge_request_metrics
+  INDEX_NAME = :idx_merge_request_metrics_on_merged_by_project_and_mr
+  INDEX_COLUMNS = %i[merged_by_id target_project_id merge_request_id]
+
+  DROP_INDEX_NAME = :index_merge_request_metrics_on_merged_by_id
+  DROP_INDEX_COLUMNS = %i[merged_by_id]
+
+  def up
+    add_concurrent_index TABLE_NAME, INDEX_COLUMNS, name: INDEX_NAME
+    # the existing index index_merge_request_metrics_on_merged_by_id is now redundant and should be removed
+    remove_concurrent_index TABLE_NAME, DROP_INDEX_COLUMNS, name: DROP_INDEX_NAME
+  end
+
+  def down
+    # recreate the existing index index_merge_request_metrics_on_merged_by_id
+    add_concurrent_index TABLE_NAME, DROP_INDEX_COLUMNS, name: DROP_INDEX_NAME
+    remove_concurrent_index TABLE_NAME, INDEX_COLUMNS, name: INDEX_NAME
+  end
+end
diff --git a/db/schema_migrations/20240121161500 b/db/schema_migrations/20240121161500
new file mode 100644
index 0000000000000..baa5befef208d
--- /dev/null
+++ b/db/schema_migrations/20240121161500
@@ -0,0 +1 @@
+b68d79dc51049d14368f10652b95d8bd4b8a9fa8df093d61a4b53c936103ee7a
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index f46c5208840a6..191f050a815e2 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -32380,6 +32380,8 @@ CREATE INDEX idx_members_created_at_user_id_invite_token ON members USING btree
 
 CREATE INDEX idx_members_on_user_and_source_and_source_type_and_member_role ON members USING btree (user_id, source_id, source_type, member_role_id);
 
+CREATE INDEX idx_merge_request_metrics_on_merged_by_project_and_mr ON merge_request_metrics USING btree (merged_by_id, target_project_id, merge_request_id);
+
 CREATE INDEX idx_merge_requests_on_id_and_merge_jid ON merge_requests USING btree (id, merge_jid) WHERE ((merge_jid IS NOT NULL) AND (state_id = 4));
 
 CREATE INDEX idx_merge_requests_on_merged_state ON merge_requests USING btree (id) WHERE (state_id = 3);
@@ -34348,8 +34350,6 @@ CREATE INDEX index_merge_request_metrics_on_merge_request_id_and_merged_at ON me
 
 CREATE INDEX index_merge_request_metrics_on_merged_at ON merge_request_metrics USING btree (merged_at);
 
-CREATE INDEX index_merge_request_metrics_on_merged_by_id ON merge_request_metrics USING btree (merged_by_id);
-
 CREATE INDEX index_merge_request_metrics_on_pipeline_id ON merge_request_metrics USING btree (pipeline_id);
 
 CREATE INDEX index_merge_request_review_llm_summaries_on_mr_diff_id ON merge_request_review_llm_summaries USING btree (merge_request_diff_id);
-- 
GitLab