##// 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 @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
64 @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
65 @issue_pages = Paginator.new self, @issue_count, limit, params['page']
65 @issue_pages = Paginator.new self, @issue_count, limit, params['page']
66 @issues = Issue.find :all, :order => [@query.group_by_sort_order, sort_clause].compact.join(','),
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 :conditions => @query.statement,
68 :conditions => @query.statement,
69 :limit => limit,
69 :limit => limit,
70 :offset => @issue_pages.current.offset
70 :offset => @issue_pages.current.offset
@@ -16,7 +16,7
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class QueryColumn
18 class QueryColumn
19 attr_accessor :name, :sortable, :groupable, :default_order
19 attr_accessor :name, :sortable, :groupable, :default_order, :include_options
20 include Redmine::I18n
20 include Redmine::I18n
21
21
22 def initialize(name, options={})
22 def initialize(name, options={})
@@ -27,6 +27,7 class QueryColumn
27 self.groupable = name.to_s
27 self.groupable = name.to_s
28 end
28 end
29 self.default_order = options[:default_order]
29 self.default_order = options[:default_order]
30 self.include_options = options[:include]
30 end
31 end
31
32
32 def caption
33 def caption
@@ -48,6 +49,7 class QueryCustomFieldColumn < QueryColumn
48 self.groupable = custom_field.order_statement
49 self.groupable = custom_field.order_statement
49 end
50 end
50 self.groupable ||= false
51 self.groupable ||= false
52 self.include_options = :custom_values
51 @cf = custom_field
53 @cf = custom_field
52 end
54 end
53
55
@@ -107,15 +109,15 class Query < ActiveRecord::Base
107
109
108 @@available_columns = [
110 @@available_columns = [
109 QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true),
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 QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :groupable => true),
113 QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :groupable => true),
112 QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc', :groupable => true),
114 QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc', :groupable => true),
113 QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"),
115 QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"),
114 QueryColumn.new(:author),
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 QueryColumn.new(:updated_on, :sortable => "#{Issue.table_name}.updated_on", :default_order => 'desc'),
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),
119 QueryColumn.new(:category, :sortable => "#{IssueCategory.table_name}.name", :groupable => true, :include => :category),
118 QueryColumn.new(:fixed_version, :sortable => ["#{Version.table_name}.effective_date", "#{Version.table_name}.name"], :default_order => 'desc', :groupable => true),
120 QueryColumn.new(:fixed_version, :sortable => ["#{Version.table_name}.effective_date", "#{Version.table_name}.name"], :default_order => 'desc', :groupable => true, :include => :fixed_version),
119 QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"),
121 QueryColumn.new(:start_date, :sortable => "#{Issue.table_name}.start_date"),
120 QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date"),
122 QueryColumn.new(:due_date, :sortable => "#{Issue.table_name}.due_date"),
121 QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours"),
123 QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours"),
@@ -322,6 +324,10 class Query < ActiveRecord::Base
322 def group_by_statement
324 def group_by_statement
323 group_by_column.groupable
325 group_by_column.groupable
324 end
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 def project_statement
332 def project_statement
327 project_clauses = []
333 project_clauses = []
@@ -202,6 +202,15 class QueryTest < ActiveSupport::TestCase
202 assert q.groupable_columns.detect {|c| c.is_a? QueryCustomFieldColumn}
202 assert q.groupable_columns.detect {|c| c.is_a? QueryCustomFieldColumn}
203 end
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 def test_default_sort
214 def test_default_sort
206 q = Query.new
215 q = Query.new
207 assert_equal [], q.sort_criteria
216 assert_equal [], q.sort_criteria
General Comments 0
You need to be logged in to leave comments. Login now