diff options
author | Tiago Botelho <tiagonbotelho@hotmail.com> | 2018-03-22 18:25:46 +0300 |
---|---|---|
committer | Tiago Botelho <tiagonbotelho@hotmail.com> | 2018-03-26 19:11:09 +0300 |
commit | 5f22dbdb3af5d7d1472f23a5ed81299f05fa45da (patch) | |
tree | 8829e049d05e13563608a9736d184e84e6d4a0db /app/models/user.rb | |
parent | 40c338a4bbcfbcb1da0a54acfdf730f6bae6763f (diff) |
Improves User#owned_projects query performance
Diffstat (limited to 'app/models/user.rb')
-rw-r--r-- | app/models/user.rb | 13 |
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) |