public function change_position_all($id1, $id2, $before = FALSE)
{
$id1 = self::factory($this->object_name, $id1);
}
$id2 = self::factory($this->object_name, $id2);
}
if ($id1->level_column <> $id2->level_column) {
throw new Kohana_User_Exception('Error change position to node', 'Cannot move nodes with different levels');
}
if ($before == TRUE) {
if ($id1->lft > $id2->lft) {
$sql = 'UPDATE ' . $this->table_name . ' SET '
. $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' - ' . ($id1->lft - $id2->lft) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . $id2->lft . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->right_column . ' + ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->right_column . ' END, '
. $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' - ' . ($id1->lft - $id2->lft) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . $id2->lft . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->left_column . ' + ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
. 'WHERE ' . $this->left_column . ' BETWEEN ' . $id2->lft . ' AND ' . $id1->rgt;
} else {
$sql = 'UPDATE ' . $this->table_name . ' SET '
. $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' + ' . (($id2->lft - $id1->lft) - ($id1->rgt - $id1->lft + 1)) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . ($id2->lft - 1) . ' THEN ' . $this->right_column . ' - ' . (($id1->rgt - $id1->lft + 1)) . ' ELSE ' . $this->right_column . ' END, '
. $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' + ' . (($id2->lft - $id1->lft) - ($id1->rgt - $id1->lft + 1)) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . ($id2->lft - 1) . ' THEN ' . $this->left_column . ' - ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
. 'WHERE ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . ($id2->lft - 1);
}
}
else
{
if ($id1->lft > $id2->lft) {
$sql = 'UPDATE ' . $this->table_name . ' SET '
. $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' - ' . ($id1->lft - $id2->lft - ($id2->rgt - $id2->lft + 1)) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id2->rgt + 1) . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->right_column . ' + ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->right_column . ' END, '
. $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' - ' . ($id1->lft - $id2->lft - ($id2->rgt - $id2->lft + 1)) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id2->rgt + 1) . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->left_column . ' + ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
. 'WHERE ' . $this->left_column . ' BETWEEN ' . ($id2->rgt + 1) . ' AND ' . $id1->rgt;
} else {
$sql = 'UPDATE ' . $this->table_name . ' SET '
. $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' + ' . ($id2->rgt - $id1->rgt) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . $id2->rgt . ' THEN ' . $this->right_column . ' - ' . (($id1->rgt - $id1->lft + 1)) . ' ELSE ' . $this->right_column . ' END, '
. $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' + ' . ($id2->rgt - $id1->rgt) . ' '
. 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . $id2->rgt . ' THEN ' . $this->left_column . ' - ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
. 'WHERE ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id2->rgt;
}
}
$this->lock();
$this->db->query($sql);
$this->unlock();
$this->reload();
}