提交 8a1c3b6e 编写于 作者: G GitLab Bot

Add latest changes from gitlab-org/gitlab@master

上级 33c89fa9
...@@ -79,7 +79,7 @@ class ProjectsFinder < UnionFinder ...@@ -79,7 +79,7 @@ class ProjectsFinder < UnionFinder
elsif min_access_level? elsif min_access_level?
current_user.authorized_projects(params[:min_access_level]) current_user.authorized_projects(params[:min_access_level])
else else
if private_only? if private_only? || impossible_visibility_level?
current_user.authorized_projects current_user.authorized_projects
else else
Project.public_or_visible_to_user(current_user) Project.public_or_visible_to_user(current_user)
...@@ -96,6 +96,30 @@ class ProjectsFinder < UnionFinder ...@@ -96,6 +96,30 @@ class ProjectsFinder < UnionFinder
end end
end end
# This is an optimization - surprisingly PostgreSQL does not optimize
# for this.
#
# If the default visiblity level and desired visiblity level filter cancels
# each other out, don't use the SQL clause for visibility level in
# `Project.public_or_visible_to_user`. In fact, this then becames equivalent
# to just authorized projects for the user.
#
# E.g.
# (EXISTS(<authorized_projects>) OR projects.visibility_level IN (10,20))
# AND "projects"."visibility_level" = 0
#
# is essentially
# EXISTS(<authorized_projects>) AND "projects"."visibility_level" = 0
#
# See https://gitlab.com/gitlab-org/gitlab/issues/37007
def impossible_visibility_level?
return unless params[:visibility_level].present?
public_visibility_levels = Gitlab::VisibilityLevel.levels_for_user(current_user)
!public_visibility_levels.include?(params[:visibility_level])
end
def owned_projects? def owned_projects?
params[:owned].present? params[:owned].present?
end end
......
---
title: Optimize query when Projects API requests private visibility level
merge_request: 20594
author:
type: performance
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册