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