Skip to content

Refactor ApprovalWrappedRule#approved_approvers method

What does this MR do?

This MR tries to increase the performance of the MergeRequestsController#index (#198028 (closed)).

In the former ApprovalWrappedRule#approved_approvers method, two queries were performed to retrieve the approvers. Nevertheless, we restructure it and instead make one query. It will mean a reduction of 20 queries when rendering the index action.

Previous queries

SELECT "approvals".* FROM "approvals" WHERE "approvals"."merge_request_id" = 30

SELECT "users".*
FROM (
        (SELECT "users".*
         FROM "users"
         INNER JOIN "approval_project_rules_users" ON "users"."id" = "approval_project_rules_users"."user_id"
         WHERE "approval_project_rules_users"."approval_project_rule_id" = 1)
      UNION
        (SELECT DISTINCT "users".*
         FROM "users"
         INNER JOIN "members" ON "users"."id" = "members"."user_id"
         INNER JOIN "namespaces" ON "members"."source_id" = "namespaces"."id"
         INNER JOIN "approval_project_rules_groups" ON "namespaces"."id" = "approval_project_rules_groups"."group_id"
         WHERE "members"."type" = 'GroupMember'
           AND "members"."source_type" = 'Namespace'
           AND "namespaces"."type" = 'Group'
           AND "approval_project_rules_groups"."approval_project_rule_id" = 1
           AND "members"."source_type" = 'Namespace'
           AND "members"."requested_at" IS NULL)) users

Current query

SELECT "users".*
FROM (
        (SELECT "users".*
         FROM "users"
         INNER JOIN "approval_project_rules_users" ON "users"."id" = "approval_project_rules_users"."user_id"
         WHERE "approval_project_rules_users"."approval_project_rule_id" = 1)
      UNION
        (SELECT DISTINCT "users".*
         FROM "users"
         INNER JOIN "members" ON "users"."id" = "members"."user_id"
         INNER JOIN "namespaces" ON "members"."source_id" = "namespaces"."id"
         INNER JOIN "approval_project_rules_groups" ON "namespaces"."id" = "approval_project_rules_groups"."group_id"
         WHERE "members"."type" = 'GroupMember'
           AND "members"."source_type" = 'Namespace'
           AND "namespaces"."type" = 'Group'
           AND "approval_project_rules_groups"."approval_project_rule_id" = 1
           AND "members"."source_type" = 'Namespace'
           AND "members"."requested_at" IS NULL)) users
WHERE "users"."id" IN
    (SELECT "approvals"."user_id"
     FROM "approvals"
     WHERE "approvals"."merge_request_id" = 30)

Does this MR meet the acceptance criteria?

Conformity

Refs #198028 (closed)

Merge request reports