DECLARE
tag_row RECORD;
one_tag RECORD;
blog_row RECORD;
BEGIN
CREATE TEMPORARY TABLE tags AS
SELECT
DISTINCT (LOWER (_freetag_blog.tag)) AS tag,
COUNT (tag)
FROM _freetag_blog
JOIN _freetagged_object_blog
ON (_freetag_blog.id = _freetagged_object_blog.tag_id)
WHERE _freetagged_object_blog.object_tree <@ site_path
AND (_freetag_blog.rating & (1 << (1 - 1))) = 0
AND (_freetagged_object_blog.rating & (1 << (1 - 1))) = 0
GROUP BY tag
ORDER BY 2 DESC
OFFSET 0
LIMIT nb_tags_max;
-- requete de selection des tags
FOR tag_row IN
SELECT tag
FROM tags
ORDER BY RANDOM ()
OFFSET 0
LIMIT 10 LOOP
SELECT id, raw_tag INTO one_tag
FROM _freetag_blog
JOIN _freetagged_object_blog
ON (_freetag_blog.id = _freetagged_object_blog.tag_id)
WHERE _freetag_blog.tag = tag_row.tag
GROUP BY
_freetag_blog.id,
_freetag_blog.raw_tag
ORDER BY COUNT (_freetagged_object_blog.tag_id) DESC
LIMIT 1;
FOR blog_row IN
SELECT
_blog.id,
_blog.parent_id,
_blog.path,
_blog.data,
_blog.date_creation,
_blog.date_publishing,
_blog.date_modification,
_blog.reference,
_blog.name,
_blog.main_host,
_blog.base_host,
_blog.description,
_blog.rating,
tag_row.tag::varchar,
one_tag.raw_tag,
(COALESCE (rank, 0))::smallint
FROM _blog
JOIN _freetagged_object_blog
ON (_blog.path = _freetagged_object_blog.object_tree)
LEFT JOIN _top_blog
ON (_blog.id = _top_blog.id )
WHERE _blog.path <@ site_path
AND _freetagged_object_blog.tag_id = one_tag.id
AND (_blog.rating & (1 << (1 - 1))) = 0
AND COALESCE (rank, 0) > min_blog_rank
GROUP BY
_blog.id,
_blog.parent_id,
_blog.path,
_blog.data,
_blog.date_creation,
_blog.date_publishing,
_blog.date_modification,
_blog.reference,
_blog.name,
_blog.main_host,
_blog.base_host,
_blog.description,
_blog.rating,
rank
ORDER BY RANDOM () * COALESCE (rank, 0) DESC
OFFSET 0
LIMIT blogs_per_tag LOOP
RETURN NEXT blog_row;
END LOOP;
END LOOP;
END;