Mysql
 sql >> Database >  >> RDS >> Mysql

Sposta il nodo nell'albero degli insiemi nidificati

Ecco una soluzione che ti consente di spostare un nodo in qualsiasi posizione nell'albero con un solo parametro di input:la nuova posizione a sinistra (newpos) del nodo.

Fondamentalmente ci sono tre set:

  • Crea nuovo spazio per il sottoalbero.
  • Sposta il sottoalbero in questo spazio.
  • Rimuovi il vecchio spazio lasciato libero dal sottoalbero.

In psuedo-sql, appare così:

//
 *  -- 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 variabile :distance è la distanza tra la nuova e la vecchia posizione, :width è la dimensione del sottoalbero e :tmppos è usato per tenere traccia del sottoalbero che viene spostato durante gli aggiornamenti. Queste variabili sono definite come:

// 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;
}

Per un esempio di codice completo, vedere il mio blog all'indirizzo

https://rogerkeays.com/how -per-spostare-un-nodo-in-insiemi-nidificati-con-sql

Se ti piace questa soluzione, vota verso l'alto.