/**
  * Move node regarding $dest.
  *
  * @param  \BackBee\CoreDomain\NestedNode\AbstractNestedNode $node
  * @param  \BackBee\CoreDomain\NestedNode\AbstractNestedNode $dest
  * @param  string                    $position
  * @return \BackBee\CoreDomain\NestedNode\AbstractNestedNode
  * @throws InvalidArgumentException        Occurs if $node is ancestor of $dest
  */
 protected function _moveNode(AbstractNestedNode $node, AbstractNestedNode $dest, $position)
 {
     if (true === $node->isAncestorOf($dest, false)) {
         throw new InvalidArgumentException('Cannot move node as child of one of its descendants');
     }
     $this->refreshExistingNode($node)->detachFromTree($node)->refreshExistingNode($dest);
     $newleft = $this->getNewLeftFromPosition($dest, $position);
     $newlevel = $this->getNewLevelFromPosition($dest, $position);
     $newparent = $this->getNewParentFromPosition($dest, $position);
     $node->setRightnode($newleft + $node->getWeight() - 1)->setLeftnode($newleft)->setLevel($newlevel)->setRoot($dest->getRoot())->setParent($newparent);
     $this->shiftRlValues($node, $newleft, $node->getWeight());
     $this->createQueryBuilder('n')->set('n._leftnode', 'n._leftnode + :delta_node')->set('n._rightnode', 'n._rightnode + :delta_node')->set('n._level', 'n._level + :delta_level')->set('n._root', ':root')->andWhere('n._root = :node')->setParameters(array('delta_node' => $newleft - 1, 'delta_level' => $newlevel, 'root' => $dest->getRoot(), 'node' => $node))->update()->getQuery()->execute();
     return $node;
 }