aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--phpBB/includes/nestedset/base.php4
-rw-r--r--phpBB/includes/nestedset/interface.php16
-rw-r--r--tests/nestedset/set_forum_regenerate_test.php (renamed from tests/nestedset/set_forum_recalculate_test.php)10
3 files changed, 21 insertions, 9 deletions
diff --git a/phpBB/includes/nestedset/base.php b/phpBB/includes/nestedset/base.php
index 9f83bd757c..1a6b578e79 100644
--- a/phpBB/includes/nestedset/base.php
+++ b/phpBB/includes/nestedset/base.php
@@ -674,7 +674,7 @@ abstract class phpbb_nestedset_base implements phpbb_nestedset_interface
/**
* @inheritdoc
*/
- public function recalculate_nested_set($new_id, $parent_id = 0, $reset_ids = false)
+ public function regenerate_left_right_ids($new_id, $parent_id = 0, $reset_ids = false)
{
if ($reset_ids)
{
@@ -716,7 +716,7 @@ abstract class phpbb_nestedset_base implements phpbb_nestedset_interface
$new_id++;
// Then we go through any children and update their left/right id's
- $new_id = $this->recalculate_nested_set($new_id, $row[$this->column_item_id]);
+ $new_id = $this->regenerate_left_right_ids($new_id, $row[$this->column_item_id]);
// Then we come back and update the right_id for this module
if ($row[$this->column_right_id] != $new_id)
diff --git a/phpBB/includes/nestedset/interface.php b/phpBB/includes/nestedset/interface.php
index b8a2e4b239..9948ccf019 100644
--- a/phpBB/includes/nestedset/interface.php
+++ b/phpBB/includes/nestedset/interface.php
@@ -124,12 +124,24 @@ interface phpbb_nestedset_interface
public function get_parent_data(array $item);
/**
- * Recalculate Nested Sets
+ * Regenerate left/right ids from parent/child relationship
+ *
+ * This method regenerates the left/right ids for the nested set based on
+ * the parent/child relations. This function executes three queries per
+ * item, so it should only be called, when the set has one of the following
+ * problems:
+ * - The set has a duplicated value inside the left/right id chain
+ * - The set has a missing value inside the left/right id chain
+ * - The set has items that do not have a left/right is set
+ *
+ * When regenerating the items, the items are sorted by parent id and their
+ * current left id, so the current child/parent relationships are kept
+ * and running the function on a working set will not change any orders.
*
* @param int $new_id First left_id to be used (should start with 1)
* @param int $parent_id parent_id of the current set (default = 0)
* @param bool $reset_ids Should we reset all left_id/right_id on the first call?
* @return int $new_id The next left_id/right_id that should be used
*/
- public function recalculate_nested_set($new_id, $parent_id = 0, $reset_ids = false);
+ public function regenerate_left_right_ids($new_id, $parent_id = 0, $reset_ids = false);
}
diff --git a/tests/nestedset/set_forum_recalculate_test.php b/tests/nestedset/set_forum_regenerate_test.php
index 6ff7a372a4..0e3a2123a0 100644
--- a/tests/nestedset/set_forum_recalculate_test.php
+++ b/tests/nestedset/set_forum_regenerate_test.php
@@ -9,7 +9,7 @@
require_once dirname(__FILE__) . '/set_forum_base.php';
-class phpbb_tests_nestedset_set_forum_recalculate_test extends phpbb_tests_nestedset_set_forum_base
+class phpbb_tests_nestedset_set_forum_regenerate_test extends phpbb_tests_nestedset_set_forum_base
{
protected $fixed_set = array(
array('forum_id' => 1, 'parent_id' => 0, 'left_id' => 1, 'right_id' => 6, 'forum_parents' => ''),
@@ -27,7 +27,7 @@ class phpbb_tests_nestedset_set_forum_recalculate_test extends phpbb_tests_neste
array('forum_id' => 11, 'parent_id' => 7, 'left_id' => 20, 'right_id' => 21, 'forum_parents' => ''),
);
- public function recalculate_nested_set_data()
+ public function regenerate_left_right_ids_data()
{
return array(
array('UPDATE phpbb_forums
@@ -56,13 +56,13 @@ class phpbb_tests_nestedset_set_forum_recalculate_test extends phpbb_tests_neste
}
/**
- * @dataProvider recalculate_nested_set_data
+ * @dataProvider regenerate_left_right_ids_data
*/
- public function test_recalculate_nested_set($breaking_query, $reset_ids)
+ public function test_regenerate_left_right_ids($breaking_query, $reset_ids)
{
$result = $this->db->sql_query($breaking_query);
- $this->assertEquals(23, $this->set->recalculate_nested_set(1, 0, $reset_ids));
+ $this->assertEquals(23, $this->set->regenerate_left_right_ids(1, 0, $reset_ids));
$result = $this->db->sql_query('SELECT forum_id, parent_id, left_id, right_id, forum_parents
FROM phpbb_forums