##// END OF EJS Templates
Optimize associations loading on the issue list....
Jean-Philippe Lang -
r2958:d84bd8edd8af
parent child
Show More
@@ -64,7 +64,7 class IssuesController < ApplicationController
64 64 @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
65 65 @issue_pages = Paginator.new self, @issue_count, limit, params['page']
66 66 @issues = Issue.find :all, :order => [@query.group_by_sort_order, sort_clause].compact.join(','),
67 :include => [ :assigned_to, :status, :tracker, :project, :priority, :category, :fixed_version ],
67 :include => ([:status, :project, :priority] + @query.include_options),
68 68 :conditions => @query.statement,
69 69 :limit => limit,
70 70 :offset => @issue_pages.current.offset
@@ -16,7 +16,7
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class QueryColumn
19 attr_accessor :name, :sortable, :groupable, :default_order
19 attr_accessor :name, :sortable, :groupable, :default_order, :include_options
20 20 include Redmine::I18n
21 21
22 22 def initialize(name, options={})
@@ -27,6 +27,7 class QueryColumn
27 27 self.groupable = name.to_s
28 28 end
29 29 self.default_order = options[:default_order]
30 self.include_options = options[:include]
30 31 end
31 32
32 33 def caption
@@ -48,6 +49,7 class QueryCustomFieldColumn < QueryColumn
48 49 self.groupable = custom_field.order_statement
49 50 end
50 51 self.groupable ||= false
52 self.include_options = :custom_values
51 53 @cf = custom_field
52 54 end
53 55
@@ -107,15 +109,15 class Query < ActiveRecord::Base
107 109
108 110 @@available_columns = [
109 111 QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true),
110 QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position", :groupable => true),
112 QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position", :groupable => true, :include => :tracker),
111 113 QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :groupable => true),
112 114 QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc', :groupable => true),
113 115 QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"),
114 116 QueryColumn.new(:author),
115 QueryColumn.new(:assigned_to, :sortable => ["#{User.table_name}.lastname", "#{User.table_name}.firstname", "#{User.table_name}.id"], :groupable => true),
117 QueryColumn.new(:assigned_to, :sortable => ["#{User.table_name}.lastname", "#{User.table_name}.firstname", "#{User.table_name}.id"], :groupable => true, :include => :assigned_to),
116 118 QueryColumn.new(:updated_on, :sortable => "#{Issue.table_name}.updated_on", :default_order => 'desc'),
117 QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true),
118 QueryColumn.new(:fixed_version, :sortable => ["#{Version.table_name}.effective_date", "#{Version.table_name}.name"], :default_order => 'desc', :groupable => true),
119 QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true, :include => :category),
120 QueryColumn.new(:fixed_version, :sortable => ["#{Version.table_name}.effective_date", "#{Version.table_name}.name"], :default_order => 'desc', :groupable => true, :include => :fixed_version),
119 121 QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"),
120 122 QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date"),
121 123 QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours"),
@@ -322,6 +324,10 class Query < ActiveRecord::Base
322 324 def group_by_statement
323 325 group_by_column.groupable
324 326 end
327
328 def include_options
329 (columns << group_by_column).collect {|column| column && column.include_options}.flatten.compact.uniq
330 end
325 331
326 332 def project_statement
327 333 project_clauses = []
@@ -202,6 +202,15 class QueryTest < ActiveSupport::TestCase
202 202 assert q.groupable_columns.detect {|c| c.is_a? QueryCustomFieldColumn}
203 203 end
204 204
205 def test_include_options
206 q = Query.new
207 q.column_names = %w(subject tracker)
208 assert_equal [:tracker], q.include_options
209
210 q.group_by = 'category'
211 assert_equal [:tracker, :category], q.include_options
212 end
213
205 214 def test_default_sort
206 215 q = Query.new
207 216 assert_equal [], q.sort_criteria
General Comments 0
You need to be logged in to leave comments. Login now