Skip to content

Commit 3a7236c

Browse files
committed
Merge pull request #11 from fpietka/delete-non-recursive
Delete non recursive - Fix #2
2 parents 377f669 + 38588d5 commit 3a7236c

File tree

5 files changed

+110
-3
lines changed

5 files changed

+110
-3
lines changed

library/Nestedset/Model.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public function delete($id, $recursive = true)
197197

198198
$select = $db
199199
->select()
200-
->from($this->_tableName, array($this->_structure['left'], $this->_structure['right']))
200+
->from($this->_tableName, array($this->_structure['id'], $this->_structure['left'], $this->_structure['right']))
201201
->where($this->_structure['id'] . ' = ?', $id);
202202

203203
$stmt = $db->query($select);
@@ -209,8 +209,9 @@ public function delete($id, $recursive = true)
209209

210210
if ($isRecursive) {
211211
(new NestedSet_Model_Builder)->deleteRecursive($this, $result);
212-
} else {
213-
// @TODO
212+
}
213+
else {
214+
(new NestedSet_Model_Builder)->deleteNonRecursive($this, $result);
214215
}
215216

216217
return $this;

library/Nestedset/Model/Builder.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,69 @@ public function deleteRecursive(NestedSet_Model $nestedset, array $tree)
256256

257257
return $this;
258258
}
259+
260+
/**
261+
* Delete a node, but move all its children outside first
262+
*
263+
* @param $model|NestedSet_Model Nested set model
264+
* @param $tree|array
265+
*
266+
* @return $this
267+
*/
268+
public function deleteNonRecursive(NestedSet_Model $nestedset, array $tree)
269+
{
270+
$db = $nestedset->getDb();
271+
272+
$left = (int) $tree[$nestedset->getStructureLeft()];
273+
$right = (int) $tree[$nestedset->getStructureRight()];
274+
275+
try {
276+
$db->beginTransaction();
277+
278+
$delete = $db->delete($nestedset->getTableName(), "{$nestedset->getStructureId()} = {$tree[$nestedset->getStructureId()]}");
279+
280+
// update other elements
281+
$width = 2;
282+
283+
// update right for inner elements
284+
$stmt = $db->query("
285+
UPDATE {$nestedset->getTableName()}
286+
SET {$nestedset->getStructureRight()} = {$nestedset->getStructureRight()} - 1
287+
WHERE {$nestedset->getStructureLeft()} > $left AND {$nestedset->getStructureRight()} < $right
288+
");
289+
$update = $stmt->fetch();
290+
291+
// update left for inner elements
292+
$stmt = $db->query("
293+
UPDATE {$nestedset->getTableName()}
294+
SET {$nestedset->getStructureLeft()} = {$nestedset->getStructureLeft()} - 1
295+
WHERE {$nestedset->getStructureLeft()} > $left AND {$nestedset->getStructureRight()} < $right
296+
");
297+
$update = $stmt->fetch();
298+
299+
// update right for outer elements
300+
$stmt = $db->query("
301+
UPDATE {$nestedset->getTableName()}
302+
SET {$nestedset->getStructureRight()} = {$nestedset->getStructureRight()} - $width
303+
WHERE {$nestedset->getStructureRight()} > $right
304+
");
305+
$update = $stmt->fetch();
306+
307+
// update left for outer elements
308+
$stmt = $db->query("
309+
UPDATE {$nestedset->getTableName()}
310+
SET {$nestedset->getStructureLeft()} = {$nestedset->getStructureLeft()} - $width
311+
WHERE {$nestedset->getStructureLeft()} > $left AND {$nestedset->getStructureRight()} >= $right
312+
");
313+
$update = $stmt->fetch();
314+
315+
$db->commit();
316+
}
317+
catch (Exception $e) {
318+
$db->rollBack();
319+
throw $e;
320+
}
321+
322+
return $this;
323+
}
259324
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"id":"3","name":"main","lft":"1","rgt":"14","depth":"0","children":[{"id":"4","name":"foo","lft":"2","rgt":"9","depth":"1","children":[{"id":"6","name":"one","lft":"3","rgt":"4","depth":"2","children":[]},{"id":"7","name":"two","lft":"5","rgt":"6","depth":"2","children":[]},{"id":"8","name":"three","lft":"7","rgt":"8","depth":"2","children":[]}]},{"id":"9","name":"one","lft":"10","rgt":"11","depth":"1","children":[]},{"id":"10","name":"two","lft":"12","rgt":"13","depth":"1","children":[]}]}]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"id":"2","name":"bar","lft":"1","rgt":"2","depth":"0","children":[]}]

tests/unit/library/Nestedset/ModelTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,45 @@ public function testDeleteRecursiveElement()
169169
$this->assertEquals($nestedset->toJson(), $expected_result);
170170
}
171171

172+
public function testDeleteNonRecursiveElement()
173+
{
174+
$nestedset = new NestedSet_Model();
175+
176+
$db = Zend_Db::factory('Pdo_Sqlite', array('dbname' => 'tests/test.db'));
177+
$nestedset->setDb($db);
178+
$nestedset->setTableName('nested');
179+
180+
$nestedset->add('foo');
181+
$nestedset->add('bar', 1);
182+
$nestedset->delete(1, false);
183+
184+
$expected_result = file_get_contents('tests/expected_result_simple_non_recursive_delete.json');
185+
186+
$this->assertEquals($nestedset->toJson(), $expected_result);
187+
188+
// clear it up
189+
$nestedset->delete(2, true);
190+
191+
// More complex case
192+
$nestedset->add('main');
193+
194+
$nestedset->add('foo', 3);
195+
$nestedset->add('bar', 3);
196+
197+
$nestedset->add('one', 4);
198+
$nestedset->add('two', 4);
199+
$nestedset->add('three', 4);
200+
201+
$nestedset->add('one', 5);
202+
$nestedset->add('two', 5);
203+
204+
$nestedset->delete(5, false);
205+
206+
$expected_result = file_get_contents('tests/expected_result_complex_non_recursive_delete.json');
207+
208+
$this->assertEquals($nestedset->toJson(), $expected_result);
209+
}
210+
172211
public function testGetElement()
173212
{
174213
$nestedset = new NestedSet_Model();

0 commit comments

Comments
 (0)