Commit 9df17fa4c57e1025160ec271fb47e509d8bc2dcb

Authored by Dmitriy Zaporozhets
2 parents 0a2ac837 a54b2e80

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)