N+1 queries when resolving branch rules

Summary

Preloading approval_project_rules_with_unique_policies in BranchRulesResolver seems to result in N+1 queries:

  • https://gitlab.com/gitlab-org/gitlab/-/blob/577db9ee1616751ff223e9ff7b5071e485481265/ee/app/graphql/ee/resolvers/projects/branch_rules_resolver.rb#L45

Make a request for branch rules for a project with multiple protected branches: For example:

query getBranchRulesEE($projectPath: ID!) {
  project(fullPath: $projectPath) {
    id
    branchRules {
      nodes {
        approvalRules {
          nodes {
            id
          }
        }
      }
    }
  }
}

Observe that a query for approval_project_rules_with_unique_policies is performed per protected branch.

Improvements

Refactor that scope so that it can be eagerloaded or use some custom preloading

Optional: Missing test coverage

Consider adding tests around here: https://gitlab.com/gitlab-org/gitlab/-/blob/a9f1e3f17f68429e70ddbefe5a6d79ce8314160f/ee/spec/requests/api/graphql/project/branch_rules_spec.rb#L41

Assignee Loading
Time tracking Loading