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 | 25 | end |
26 | 26 | |
27 | 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 | 29 | end |
32 | 30 | |
33 | 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 | 33 | end |
38 | 34 | |
39 | 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 | 47 | end |
44 | 48 | |
45 | 49 | def allow_read_for?(user) | ... | ... |