From 40e2af7ab97d051c312e8dbc762ca294be139009 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Tue, 8 Dec 2009 16:22:21 +0000 Subject: [PATCH] Optimize issue updates when a version sharing changes. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3135 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/issue.rb | 4 ++-- app/models/project.rb | 2 +- app/models/version.rb | 10 +++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index f75391f43..27029af13 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -344,8 +344,8 @@ class Issue < ActiveRecord::Base # fixed_version that is outside of the issue's project hierarchy. # # OPTIMIZE: does a full table scan of Issues with a fixed_version. - def self.update_fixed_versions_from_project_hierarchy_change - Issue.all(:conditions => ['fixed_version_id IS NOT NULL'], + def self.update_fixed_versions_from_sharing_change(conditions=nil) + Issue.all(:conditions => merge_conditions('fixed_version_id IS NOT NULL', conditions), :include => [:project, :fixed_version] ).each do |issue| next if issue.project.nil? || issue.fixed_version.nil? diff --git a/app/models/project.rb b/app/models/project.rb index 593e60c9e..9e2f4830d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -304,7 +304,7 @@ class Project < ActiveRecord::Base # move_to_child_of adds the project in last (ie.right) position move_to_child_of(p) end - Issue.update_fixed_versions_from_project_hierarchy_change + Issue.update_fixed_versions_from_sharing_change true else # Can not move to the given target diff --git a/app/models/version.rb b/app/models/version.rb index add0dc734..fa9eb28e7 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -17,7 +17,7 @@ class Version < ActiveRecord::Base before_destroy :check_integrity - after_update :update_issue_versions + after_update :update_issues_from_sharing_change belongs_to :project has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id' acts_as_customizable @@ -161,9 +161,13 @@ private end # Update the issue's fixed versions. Used if a version's sharing changes. - def update_issue_versions + def update_issues_from_sharing_change if sharing_changed? - Issue.update_fixed_versions_from_project_hierarchy_change + if VERSION_SHARINGS.index(sharing_was).nil? || + VERSION_SHARINGS.index(sharing).nil? || + VERSION_SHARINGS.index(sharing_was) > VERSION_SHARINGS.index(sharing) + Issue.update_fixed_versions_from_sharing_change ['fixed_version_id = ?', id] + end end end