##// END OF EJS Templates
Prevents n SQL queries (n = project count) on cross-project issues list....
Jean-Philippe Lang -
r4436:8a8ca4036490
parent child
Show More
@@ -187,10 +187,18 class Query < ActiveRecord::Base
187 if project
187 if project
188 user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
188 user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
189 else
189 else
190 project_ids = Project.all(:conditions => Project.visible_by(User.current)).collect(&:id)
190 all_projects = Project.visible.all
191 if project_ids.any?
191 if all_projects.any?
192 # members of the user's projects
192 # members of visible projects
193 user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
193 user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", all_projects.collect(&:id)]).sort.collect{|s| [s.name, s.id.to_s] }
194
195 # project filter
196 project_values = []
197 Project.project_tree(all_projects) do |p, level|
198 prefix = (level > 0 ? ('--' * level + ' ') : '')
199 project_values << ["#{prefix}#{p.name}", p.id.to_s]
200 end
201 @available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values} unless project_values.empty?
194 end
202 end
195 end
203 end
196 @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
204 @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
@@ -225,12 +233,6 class Query < ActiveRecord::Base
225 @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
233 @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
226 end
234 end
227 add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
235 add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
228 # project filter
229 project_values = Project.all(:conditions => Project.visible_by(User.current), :order => 'lft').map do |p|
230 pre = (p.level > 0 ? ('--' * p.level + ' ') : '')
231 ["#{pre}#{p.name}",p.id.to_s]
232 end
233 @available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values}
234 end
236 end
235 @available_filters
237 @available_filters
236 end
238 end
@@ -382,6 +382,12 class QueryTest < ActiveSupport::TestCase
382 assert users[:values].map{|u|u[1]}.include?("3")
382 assert users[:values].map{|u|u[1]}.include?("3")
383 end
383 end
384
384
385 should "include visible projects in cross-project view" do
386 projects = @query.available_filters["project_id"]
387 assert_not_nil projects
388 assert projects[:values].map{|u|u[1]}.include?("1")
389 end
390
385 context "'member_of_group' filter" do
391 context "'member_of_group' filter" do
386 should "be present" do
392 should "be present" do
387 assert @query.available_filters.keys.include?("member_of_group")
393 assert @query.available_filters.keys.include?("member_of_group")
General Comments 0
You need to be logged in to leave comments. Login now