Files
sql/docker-entrypoint-initdb.d/5_nestedsets.sql
2025-09-12 12:54:16 +02:00

49 lines
1.1 KiB
PL/PgSQL

ALTER TABLE famille
ADD gauche int, droite int;
-- fonction auxiliaire récursive : reçoit le compteur 'n', retourne le compteur mis à jour
CREATE OR REPLACE FUNCTION set_bounds(p_code INT, n INT)
RETURNS INT AS $$
DECLARE
child RECORD;
BEGIN
-- left
UPDATE famille SET gauche = n WHERE code = p_code;
n := n + 1;
-- parcours des enfants
FOR child IN
SELECT code FROM famille WHERE code_parent = p_code ORDER BY code
LOOP
n := set_bounds(child.code, n);
END LOOP;
-- right
UPDATE famille SET droite = n WHERE code = p_code;
n := n + 1;
RETURN n;
END;
$$ LANGUAGE plpgsql;
-- fonction principale : initialise et lance la reconstruction
CREATE OR REPLACE FUNCTION rebuild_nested_sets()
RETURNS VOID AS $$
DECLARE
root RECORD;
n INT := 1;
BEGIN
-- remise à zéro (optionnel)
UPDATE famille SET gauche = NULL, droite = NULL;
-- pour chaque racine
FOR root IN
SELECT code FROM famille WHERE code_parent IS NULL ORDER BY code
LOOP
n := set_bounds(root.code, n);
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT rebuild_nested_sets();