]> source.dussan.org Git - redmine.git/commitdiff
Gantt perf: fixed that Project#start_date and #due_date run way too much queries.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 6 Jan 2013 14:03:49 +0000 (14:03 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 6 Jan 2013 14:03:49 +0000 (14:03 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11135 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/issue.rb
app/models/project.rb
test/unit/issue_test.rb

index 99803033179fe21de6f8d9daf3ca0d6108c4c602..9a4b93bf5f7472f45c07c091a43ac769a3d46bdf 100644 (file)
@@ -85,6 +85,10 @@ class Issue < ActiveRecord::Base
   scope :on_active_project, lambda {
     includes(:status, :project, :tracker).where("#{Project.table_name}.status = ?", Project::STATUS_ACTIVE)
   }
+  scope :fixed_version, lambda {|versions|
+    ids = [versions].flatten.compact.map {|v| v.is_a?(Version) ? v.id : v}
+    ids.any? ? where(:fixed_version_id => ids) : where('1=0')
+  }
 
   before_create :default_assign
   before_save :close_duplicates, :update_done_ratio_from_issue_status, :force_updated_on_change
index 13842b6e64cd185f64188f8bb87e74938595ac2e..bdce626941d1bab7121bfc8ef0b0d871547d29ab 100644 (file)
@@ -289,6 +289,8 @@ class Project < ActiveRecord::Base
     @allowed_parents = nil
     @allowed_permissions = nil
     @actions_allowed = nil
+    @start_date = nil
+    @due_date = nil
     super
   end
 
@@ -538,20 +540,20 @@ class Project < ActiveRecord::Base
 
   # The earliest start date of a project, based on it's issues and versions
   def start_date
-    [
+    @start_date ||= [
      issues.minimum('start_date'),
-     shared_versions.collect(&:effective_date),
-     shared_versions.collect(&:start_date)
-    ].flatten.compact.min
+     shared_versions.minimum('effective_date'),
+     Issue.fixed_version(shared_versions).minimum('start_date')
+    ].compact.min
   end
 
   # The latest due date of an issue or version
   def due_date
-    [
+    @due_date ||= [
      issues.maximum('due_date'),
-     shared_versions.collect(&:effective_date),
-     shared_versions.collect {|v| v.fixed_issues.maximum('due_date')}
-    ].flatten.compact.max
+     shared_versions.maximum('effective_date'),
+     Issue.fixed_version(shared_versions).maximum('due_date')
+    ].compact.max
   end
 
   def overdue?
index cb89d37a5cc38447e09cc5ab0c6be86e2ffc70fc..9ebb163c4d5b5905b20e0e50e2cf2d35cacfe2ae 100644 (file)
@@ -309,6 +309,16 @@ class IssueTest < ActiveSupport::TestCase
     assert_equal issues, issues.select(&:closed?)
   end
 
+  def test_fixed_version_scope_with_a_version_should_return_its_fixed_issues
+    version = Version.find(2)
+    assert version.fixed_issues.any?
+    assert_equal version.fixed_issues.to_a.sort, Issue.fixed_version(version).to_a.sort
+  end
+
+  def test_fixed_version_scope_with_empty_array_should_return_no_result
+    assert_equal 0, Issue.fixed_version([]).count
+  end
+
   def test_errors_full_messages_should_include_custom_fields_errors
     field = IssueCustomField.find_by_name('Database')