CREATE LANGUAGE plpgsql;
DROP FUNCTION initRank();
DROP FUNCTION normalizeGraph();
DROP FUNCTION saveRank();
DROP FUNCTION sumParent(integer);
DROP FUNCTION normalizeRank();
-- Initialisation des valeurs de pagerank de chaque page
CREATE OR REPLACE FUNCTION initRank() RETURNS integer AS $$
DECLARE
nb_nodes FLOAT; -- Nombre de noeuds (ou pages) dans le graphe
BEGIN
SELECT count(*) INTO nb_nodes FROM page;
UPDATE page SET page_rank = 1::float/nb_nodes, page_rank_old = 1::float/nb_nodes;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
-- Normalisation des poids des liens du graphe
CREATE OR REPLACE FUNCTION normalizeGraph() RETURNS integer AS $$
DECLARE
res RECORD; -- Liste d'adjacences des noeuds sortant d'un noeud (outlink)
BEGIN
FOR res IN
SELECT link_parent_id as id, count(link_parent_id) as nb_nodes
FROM link
GROUP BY link_parent_id
LOOP
UPDATE link SET link_weight = 1::float/res.nb_nodes::float
WHERE link_parent_id = res.id;
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
-- Sauvegarde de la valeur de pagerank
CREATE OR REPLACE FUNCTION saveRank() RETURNS integer AS $$
DECLARE
res RECORD; -- Liste des valeurs de pagerank de chaque noeud
BEGIN
FOR res IN
SELECT page_id AS id, page_rank AS rank FROM page
LOOP
UPDATE page SET page_rank_old = res.rank
WHERE page_id = res.id;
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
-- Effectue la somme des poids des noeuds entrant d'un noeud
CREATE OR REPLACE FUNCTION sumParent(integer) RETURNS float AS $$
DECLARE
node_id ALIAS FOR $1; -- Noeud (ou page) à pondérer
in_nodes RECORD; -- Ensemble des liens entrants du noeud (ou page)
sum FLOAT; -- pondération
BEGIN
sum := 0;
-- Parcourt de tous les noeuds entrant de node.id
FOR in_nodes IN
SELECT link_weight AS weight, page_rank AS rank
FROM link, page
WHERE link_parent_id = page_id
AND link_child_id = node_id
ORDER BY link_parent_id
LOOP
sum := sum + (in_nodes.rank * in_nodes.weight);
END LOOP;
RETURN sum;
END;
$$ LANGUAGE plpgsql;
-- Normalisation des valeurs de pagerank
CREATE OR REPLACE FUNCTION normalizeRank() RETURNS integer AS $$
DECLARE
node RECORD;
sum FLOAT;
BEGIN
sum := 0;
-- Parcourt de tous les noeuds afin d'obtenir la somme des pagerank
FOR node IN
SELECT page_rank AS rank
FROM page
ORDER BY page_id
LOOP
sum := sum + node.rank;
END LOOP;
-- Parcourt de tous les noeuds afin de normaliser le pagerank
FOR node IN
SELECT page_id AS id, page_rank AS rank
FROM page
ORDER BY page_id
LOOP
UPDATE page SET page_rank = (node.rank/sum)
WHERE page_id = node.id;
END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
-- Calcul du pagerank du graphe
CREATE OR REPLACE FUNCTION computePageRank(float) RETURNS integer AS $$
DECLARE
epsilon ALIAS FOR $1;
node RECORD;
sum FLOAT;
t INTEGER;
test FLOAT;
BEGIN
t := 0;
sum := 0;
test := 0;
-- Initialisation des valeurs de pagerank en fonction du nombre de noeud (ou page)
PERFORM initRank();
--RAISE NOTICE 'initRank()';
-- Normalisation des poids des liens du graphe
PERFORM normalizeGraph();
--RAISE NOTICE 'normalizeGraph()';
LOOP
--RAISE NOTICE 'LOOP(%)', t;
--RAISE NOTICE 'epsilon(%)', epsilon;
test := 0;
-- Sauvegarde des nouvelles valeur de pagerank
PERFORM saveRank();
-- RAISE NOTICE 'saveRank()';
-- Parcourt de tous les noeuds en vue d'une pondération des valeurs de pagerank
FOR node IN
SELECT page_id AS id FROM page
ORDER BY page_id
LOOP
sum := sumParent(node.id);
RAISE NOTICE 'sumParent(%)', node.id;
UPDATE page SET page_rank = sum
WHERE page_id = node.id;
RAISE NOTICE 'Noeud(%):(%)', node.id, sum ;
END LOOP;
-- Normalisation des valeurs de pagerank
PERFORM normalizeRank();
-- Parcourt de tous les noeuds afin de verifier l'ecart entre les valeurs
FOR node IN
SELECT page_rank AS rank, page_rank_old AS rankold
FROM page
ORDER BY page_id
LOOP
test := test + abs(node.rank - node.rankold);
END LOOP;
t := t + 1;
RAISE NOTICE 'test de epsilon avec (%)', test;
EXIT WHEN epsilon >= test;
END LOOP;
RAISE NOTICE '(%) boucle(s) executée(s)', t;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
indexer$# RETURN 1;
indexer$# END;
indexer$# $$ LANGUAGE plpgsql;
ERREUR: unterminated string
CONTEXTE : compile of PL/pgSQL function "computepagerank" near line 59
indexer=#