All pastes #400975 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-03-19 01:12 UTC
rendered paste body
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=#