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
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 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 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 deltaBorne => (borneDroitePere + (2 * nbNoeud) - 1) - borneDroiteDuplique)

- 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
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 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 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 deltaBorne => (borneDroitePere + (2 * nbNoeud) - 1) - borneDroiteDuplique)

- 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.