From: Jean-Philippe Lang Date: Wed, 21 Dec 2016 10:35:36 +0000 (+0000) Subject: Adds .rebuild_single_tree! to rebuild a single tree (#24167). X-Git-Tag: 3.4.0~477 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=b58cf253838bab9ef558b111b5094aae21890b45;p=redmine.git Adds .rebuild_single_tree! to rebuild a single tree (#24167). git-svn-id: http://svn.redmine.org/redmine/trunk@16111 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/lib/redmine/nested_set/issue_nested_set.rb b/lib/redmine/nested_set/issue_nested_set.rb index afbe6b995..8753f25de 100644 --- a/lib/redmine/nested_set/issue_nested_set.rb +++ b/lib/redmine/nested_set/issue_nested_set.rb @@ -183,6 +183,16 @@ module Redmine end end + def rebuild_single_tree!(root_id) + root = Issue.where(:parent_id => nil).find(root_id) + transaction do + where(root_id: root_id).reorder(:id).lock.ids + where(root_id: root_id).update_all(:lft => nil, :rgt => nil) + where(root_id: root_id, parent_id: nil).update_all(["lft = ?, rgt = ?", 1, 2]) + rebuild_nodes(root_id) + end + end + private def rebuild_nodes(parent_id = nil) diff --git a/test/unit/issue_nested_set_test.rb b/test/unit/issue_nested_set_test.rb index 88f65d3f6..4062839a3 100644 --- a/test/unit/issue_nested_set_test.rb +++ b/test/unit/issue_nested_set_test.rb @@ -306,4 +306,23 @@ class IssueNestedSetTest < ActiveSupport::TestCase assert_equal ic2, ic4.parent assert ic5.root? end + + def test_rebuild_single_tree + i1 = Issue.generate! + i2 = i1.generate_child! + i3 = i1.generate_child! + Issue.update_all(:lft => 7, :rgt => 7) + + Issue.rebuild_single_tree!(i1.id) + + i1.reload + assert_equal [1, 6], [i1.lft, i1.rgt] + i2.reload + assert_equal [2, 3], [i2.lft, i2.rgt] + i3.reload + assert_equal [4, 5], [i3.lft, i3.rgt] + + other = Issue.find(1) + assert_equal [7, 7], [other.lft, other.rgt] + end end