Commit 9df17fa4c57e1025160ec271fb47e509d8bc2dcb
Exists in
master
and in
4 other branches
Merge pull request #2438 from cvut/query-perf
Optimize query for keys of repository members
Showing
1 changed file
with
13 additions
and
9 deletions
Show diff stats
app/roles/authority.rb
@@ -25,21 +25,25 @@ module Authority | @@ -25,21 +25,25 @@ module Authority | ||
25 | end | 25 | end |
26 | 26 | ||
27 | def repository_readers | 27 | def repository_readers |
28 | - keys = Key.joins({user: :users_projects}). | ||
29 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::REPORTER) | ||
30 | - keys.map(&:identifier) + deploy_keys.map(&:identifier) | 28 | + repository_members[UsersProject::REPORTER] |
31 | end | 29 | end |
32 | 30 | ||
33 | def repository_writers | 31 | def repository_writers |
34 | - keys = Key.joins({user: :users_projects}). | ||
35 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::DEVELOPER) | ||
36 | - keys.map(&:identifier) | 32 | + repository_members[UsersProject::DEVELOPER] |
37 | end | 33 | end |
38 | 34 | ||
39 | def repository_masters | 35 | def repository_masters |
40 | - keys = Key.joins({user: :users_projects}). | ||
41 | - where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::MASTER) | ||
42 | - keys.map(&:identifier) | 36 | + repository_members[UsersProject::MASTER] |
37 | + end | ||
38 | + | ||
39 | + def repository_members | ||
40 | + keys = Hash.new {|h,k| h[k] = [] } | ||
41 | + UsersProject.select("keys.identifier, project_access"). | ||
42 | + joins(user: :keys).where(project_id: id). | ||
43 | + each {|row| keys[row.project_access] << [row.identifier] } | ||
44 | + | ||
45 | + keys[UsersProject::REPORTER] += deploy_keys.pluck(:identifier) | ||
46 | + keys | ||
43 | end | 47 | end |
44 | 48 | ||
45 | def allow_read_for?(user) | 49 | def allow_read_for?(user) |