Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Botelho <tiagonbotelho@hotmail.com>2018-03-22 18:25:46 +0300
committerTiago Botelho <tiagonbotelho@hotmail.com>2018-03-26 19:11:09 +0300
commit5f22dbdb3af5d7d1472f23a5ed81299f05fa45da (patch)
tree8829e049d05e13563608a9736d184e84e6d4a0db /app/models/user.rb
parent40c338a4bbcfbcb1da0a54acfdf730f6bae6763f (diff)
Improves User#owned_projects query performance
Diffstat (limited to 'app/models/user.rb')
-rw-r--r--app/models/user.rb13
1 files changed, 10 insertions, 3 deletions
diff --git a/app/models/user.rb b/app/models/user.rb
index b8c55205ab8..fa54581d220 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -623,9 +623,7 @@ class User < ActiveRecord::Base
end
def owned_projects
- @owned_projects ||=
- Project.where('namespace_id IN (?) OR namespace_id = ?',
- owned_groups.select(:id), namespace.id).joins(:namespace)
+ @owned_projects ||= Project.from("(#{owned_projects_union.to_sql}) AS projects")
end
# Returns projects which user can admin issues on (for example to move an issue to that project).
@@ -1196,6 +1194,15 @@ class User < ActiveRecord::Base
private
+ def owned_projects_union
+ Gitlab::SQL::Union.new([
+ Project.where(namespace: namespace),
+ Project.joins(:project_authorizations)
+ .where("projects.namespace_id <> ?", namespace.id)
+ .where(project_authorizations: { user_id: id, access_level: Gitlab::Access::OWNER })
+ ], remove_duplicates: false)
+ end
+
def ci_projects_union
scope = { access_level: [Gitlab::Access::MASTER, Gitlab::Access::OWNER] }
groups = groups_projects.where(members: scope)