Bonjour à tous,
Je me suis inspiré d'un excellent article sur http://sqlpro.developpez.com/cours/arborescence/ pour écrire des procédures d'insertion, suppression, déplacement, copie et clone. Cette arborescence permet de manipuler plusieurs arbres. Pour y parvenir j'ai créé 3 tables
arborescence => Représente un noeud et sa racine (pour gérer plusieurs arbres)
arborescence_info => Permet de nommer un noeud dans plusieurs langue
arborescence_borne => Permet d'affecter plusieurs borne gauche et droite pour un noeud (cas des clones : un noeud peut être présent à plusieurs endroit de l'arborescence, ce n'est pas une copie mais bien le même objet).
Mon soucis concerne la copie et le clone de sous-arbre :
Mes procédures comportent 2 paramètres, le noeud à dupliquer et le père de l'endroit où l'on souhaite l'insérer (on ajoute à droite des fils déjà existant).
Concernant la copie de sous arbre :
- On récupère les informations des noeuds à dupliquer et du père du nouvelle emplacement
- On récupère le nombre de noeud composant le sous-arbre à dupliquer
- On décale les bornes droite >= au père de 2 * nbNoeud
- On décale les bornes gauche > au père de 2 * nbNoeud
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 UPDATE arborescence_borne INNER JOIN arborescence ON arb_id = arbo_arb_id SET arbo_borne_droite = arbo_borne_droite + (2 * nbNoeud) WHERE arbo_borne_droite >= borneDroitePere AND arb_racine_arb_id = racinePere;
- On calcule le deltaBorne => (borneDroitePere + (2 * nbNoeud) - 1) - borneDroiteDuplique)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 UPDATE arborescence_borne INNER JOIN arbo_borne_droite ON arb_id = arbo_arb_id SET arbo_borne_gauche = arbo_borne_gauche + (2 * nbNoeud) WHERE arbo_borne_gauche > borneDroitePere AND arb_racine_arb_id = racinePere;
- On calcule le deltaNiveau => niveauP - (niveauDuplique + 1)
- On boucle (WHILE) pour l'insertion des noeuds, de la borne gauche à la borne droite du noeud à dupliquer.
Le résultat de cette procédure est que des noeuds sont copiés mais pas ceux désirés.
Concernant le clonage de noeud :
- On récupère les informations des noeuds à dupliquer et du père du nouvelle emplacement
- On récupère le nombre de noeud composant le sous-arbre à dupliquer
- On décale les bornes droite >= au père de 2 * nbNoeud
- On décale les bornes gauche > au père de 2 * nbNoeud
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 UPDATE arborescence_borne INNER JOIN arborescence ON arb_id = arbo_arb_id SET arbo_borne_droite = arbo_borne_droite + (2 * nbNoeud) WHERE arbo_borne_droite >= borneDroitePere AND arb_racine_arb_id = racinePere;
- On calcule le deltaBorne => (borneDroitePere + (2 * nbNoeud) - 1) - borneDroiteDuplique)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 UPDATE arborescence_borne INNER JOIN arbo_borne_droite ON arb_id = arbo_arb_id SET arbo_borne_gauche = arbo_borne_gauche + (2 * nbNoeud) WHERE arbo_borne_gauche > borneDroitePere AND arb_racine_arb_id = racinePere;
- On calcule le deltaNiveau => niveauP - niveauDuplique + 1
- On ajoute les bornes au noeud dans arborescence_borne
Là encore les résultats sont incohérent.
Je pense que cela viens du fait que je décale les bornes des éléments à droite du père avant de parcourir le sous arbre à dupliquer.
Partager