From ca7bf70b2f31eb9c087d497ee64cfeb13be916a2 Mon Sep 17 00:00:00 2001
From: Patrick Bajao <ebajao@gitlab.com>
Date: Mon, 17 Jul 2023 14:04:23 +0800
Subject: [PATCH] Prevent N+1 when diffStats is queried via GraphQL

Preload the `latest_merge_request_diff` when `diffStats` field
is queried by using lookahead.

Changelog: performance
---
 .../resolvers/concerns/resolves_merge_requests.rb    |  3 ++-
 .../api/graphql/project/merge_requests_spec.rb       | 12 ++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/app/graphql/resolvers/concerns/resolves_merge_requests.rb b/app/graphql/resolvers/concerns/resolves_merge_requests.rb
index c0a068097a7a9..1470129187d67 100644
--- a/app/graphql/resolvers/concerns/resolves_merge_requests.rb
+++ b/app/graphql/resolvers/concerns/resolves_merge_requests.rb
@@ -59,7 +59,8 @@ def preloads
       timelogs: [:timelogs],
       pipelines: [:merge_request_diffs], # used by `recent_diff_head_shas` to load pipelines
       committers: [merge_request_diff: [:merge_request_diff_commits]],
-      suggested_reviewers: [:predictions]
+      suggested_reviewers: [:predictions],
+      diff_stats: [:latest_merge_request_diff]
     }
   end
 end
diff --git a/spec/requests/api/graphql/project/merge_requests_spec.rb b/spec/requests/api/graphql/project/merge_requests_spec.rb
index e3c4396e7d876..3ad98ee09aad1 100644
--- a/spec/requests/api/graphql/project/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/project/merge_requests_spec.rb
@@ -396,6 +396,18 @@ def execute_query
 
       include_examples 'N+1 query check', skip_cached: false
     end
+
+    context 'when requesting diffStats' do
+      let(:requested_fields) { ['diffStats { path }'] }
+
+      before do
+        create_list(:merge_request_diff, 2, merge_request: merge_request_a)
+        create_list(:merge_request_diff, 2, merge_request: merge_request_b)
+        create_list(:merge_request_diff, 2, merge_request: merge_request_c)
+      end
+
+      include_examples 'N+1 query check', skip_cached: false
+    end
   end
 
   describe 'performance' do
-- 
GitLab