Skip to content

fix(api): Eliminate N+1 query for pulls list patch calculation - #1878

Open
sentry[bot] wants to merge 1 commit into
mainfrom
seer/fix/api-pulls-n1-query
Open

fix(api): Eliminate N+1 query for pulls list patch calculation#1878
sentry[bot] wants to merge 1 commit into
mainfrom
seer/fix/api-pulls-n1-query

Conversation

@sentry

@sentry sentry Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

This PR addresses an N+1 query issue in the /api/v2/{service}/{owner_username}/repos/{repo_name}/pulls/ endpoint.

Problem:
Previously, the PullSerializer.get_patch() method, a SerializerMethodField, would execute a separate database query via CommitComparisonService.get_commit_comparison_for_pull(obj) for each Pull object in the paginated list. This resulted in an N+1 query pattern, where N is the number of pulls returned by the API, leading to inefficient database usage and slower response times.

Solution:
To resolve this, the PullViewSetMixin.get_queryset() method has been enhanced to include two new subquery annotations:

  1. commit_comparison_state: Fetches the state of the CommitComparison for each pull.
  2. commit_comparison_patch_totals: Fetches the patch_totals JSON field from the CommitComparison for each pull.

These annotations ensure that the necessary CommitComparison data is loaded in a single, optimized query when the initial queryset is retrieved. The PullSerializer.get_patch() method was then updated to directly access these pre-annotated fields (obj.commit_comparison_state and obj.commit_comparison_patch_totals), eliminating the need for individual database lookups and the ComparisonReport processing for each pull. This significantly reduces the number of database queries and improves the performance of the pulls list API.

Legal Boilerplate

Look, I get it. The entity doing business as "Codecov" is owned by Harness, Inc. In 2026 Harness acquired Codecov and as a result Harness is going to need some rights from me in order to utilize my contributions in this PR. So here's the deal: I retain all rights, title and interest in and to my contributions, and by keeping this boilerplate intact I confirm that Harness can use, modify, copy, and redistribute my contributions, under Harness's choice of terms.

Fixes API-ESS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants