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
-
Code review guidelines -
Merge request performance guidelines -
Style guides -
Database guides -
Separation of EE specific content
Refs #198028 (closed)
Edited by Francisco Javier López (ex-Gitlab)