sql >> Base de Datos >  >> RDS >> Mysql

Mover nodo en el árbol de conjuntos anidados

Aquí hay una solución que le permite mover un nodo a cualquier posición en el árbol con solo un único parámetro de entrada:la nueva posición izquierda (newpos) del nodo.

Fundamentalmente hay tres conjuntos:

  • Crea un nuevo espacio para el subárbol.
  • Mueva el subárbol a este espacio.
  • Eliminar el antiguo espacio dejado vacante por el subárbol.

En psuedo-sql, se ve así:

//
 *  -- create new space for subtree
 *  UPDATE tags SET lpos = lpos + :width WHERE lpos >= :newpos
 *  UPDATE tags SET rpos = rpos + :width WHERE rpos >= :newpos
 * 
 *  -- move subtree into new space
 *  UPDATE tags SET lpos = lpos + :distance, rpos = rpos + :distance
 *           WHERE lpos >= :tmppos AND rpos < :tmppos + :width
 * 
 *  -- remove old space vacated by subtree
 *  UPDATE tags SET lpos = lpos - :width WHERE lpos > :oldrpos
 *  UPDATE tags SET rpos = rpos - :width WHERE rpos > :oldrpos
 */

La variable :distance es la distancia entre las posiciones nueva y antigua, :width es el tamaño del subárbol y :tmppos se utiliza para realizar un seguimiento del movimiento del subárbol durante las actualizaciones. Estas variables se definen como:

// calculate position adjustment variables
int width = node.getRpos() - node.getLpos() + 1;
int distance = newpos - node.getLpos();
int tmppos = node.getLpos();
        
// backwards movement must account for new space
if (distance < 0) {
    distance -= width;
    tmppos += width;
}

Para ver un ejemplo de código completo, consulte mi blog en

https://rogerkeays.com/how -para-mover-un-nodo-en-conjuntos-anidados-con-sql

Si le gusta esta solución, vote a favor.