Filtering issues by label produces complicated query with GROUP BY
Filtering issues by label seems overly complex. For example, filtering by bug and P4 produces the below query. Let's look into how this complexity can be lowered, maybe we can even remove the GROUP BY here.
See https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/6218#note_90247101 for the motivation.
SELECT issues.*
,(
SELECT MIN("label_priorities"."priority")
FROM "labels"
INNER JOIN "label_links" ON "label_links"."label_id" = "labels"."id"
LEFT JOIN "label_priorities" ON "labels"."id" = "label_priorities"."label_id"
WHERE (label_priorities.project_id = issues.project_id)
AND (label_links.target_id = issues.id)
AND "label_links"."target_type" = 'Issue'
) AS highest_priority
FROM "issues"
INNER JOIN "projects" ON "projects"."id" = "issues"."project_id"
INNER JOIN "label_links" ON "label_links"."target_id" = "issues"."id"
AND "label_links"."target_type" = 'Issue'
INNER JOIN "labels" ON "labels"."id" = "label_links"."label_id"
LEFT JOIN project_features ON projects.id = project_features.project_id
WHERE (
issues.confidential IS NOT TRUE
OR (
issues.confidential = TRUE
AND (
issues.author_id = 443319
OR EXISTS (
SELECT TRUE
FROM issue_assignees
WHERE user_id = 443319
AND issue_id = issues.id
)
OR issues.project_id IN (
SELECT "projects"."id"
FROM "projects"
INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
WHERE "project_authorizations"."user_id" = 443319
AND (project_authorizations.access_level >= 20)
)
)
)
)
AND "projects"."namespace_id" IN (
WITH RECURSIVE "base_and_descendants" AS (
SELECT "namespaces".*
FROM "namespaces"
WHERE "namespaces"."type" IN ('Group')
AND "namespaces"."id" = 9970
UNION
SELECT "namespaces".*
FROM "namespaces"
,"base_and_descendants"
WHERE "namespaces"."type" IN ('Group')
AND "namespaces"."parent_id" = "base_and_descendants"."id"
)
SELECT "id"
FROM "base_and_descendants" AS "namespaces"
)
AND (
EXISTS (
SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = 443319
AND (project_authorizations.project_id = projects.id)
)
OR projects.visibility_level IN (
10
,20
)
)
AND (
"project_features"."issues_access_level" IN (
NULL
,20
)
OR (
"project_features"."issues_access_level" = 10
AND EXISTS (
SELECT 1
FROM "project_authorizations"
WHERE "project_authorizations"."user_id" = 443319
AND (project_authorizations.project_id = projects.id)
)
)
)
AND ("issues"."state" IN ('opened'))
AND "labels"."title" IN (
'bug'
,'P4'
)
AND (
EXISTS (
SELECT "label_links".*
FROM "label_links"
WHERE (
label_links.target_type = 'Issue'
AND label_links.target_id = issues.id
)
AND (label_links.label_id = 3412464) LIMIT 1
)
)
GROUP BY "issues"."id"
HAVING COUNT(DISTINCT labels.title) = 2
ORDER BY relative_position ASC NULLS LAST
,highest_priority ASC NULLS LAST
,id DESC LIMIT 20 OFFSET 0