mirror of
https://github.com/postgres/pgweb.git
synced 2025-08-01 15:54:53 +00:00

This hasn't worked for a few years (since 900946df
) and nobody has
complained. Getting rid of it allows similifying a few things on the
search server side as well.
105 lines
4.9 KiB
PL/PgSQL
105 lines
4.9 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION archives_search(query text, _lists int, firstdate timestamptz, lastdate timestamptz, startofs int, hitsperpage int, sort char)
|
|
RETURNS TABLE (listname text, year int, month int, msgnum int, date timestamptz, subject text, author text, headline text, rank float)
|
|
AS $$
|
|
DECLARE
|
|
tsq tsquery;
|
|
qry text;
|
|
hits int;
|
|
hit RECORD;
|
|
curs refcursor;
|
|
pagecount int;
|
|
listary int[];
|
|
BEGIN
|
|
tsq := plainto_tsquery(query);
|
|
IF numnode(tsq) = 0 THEN
|
|
RETURN QUERY SELECT NULL::text, 0, 0, NULL::int, NULL::timestamptz, NULL::text, NULL::text, NULL::text, NULL:: float;
|
|
RETURN;
|
|
END IF;
|
|
|
|
hits := 0;
|
|
|
|
IF _lists IS NULL THEN
|
|
SELECT INTO pagecount sum(lists.pagecount) FROM lists;
|
|
IF sort = 'd' THEN
|
|
OPEN curs FOR SELECT m.list,m.year,m.month,m.msgnum,ts_rank_cd(m.fti,tsq) FROM messages m WHERE m.fti @@ tsq AND m.date>COALESCE(firstdate,'1900-01-01') ORDER BY m.date DESC LIMIT 1000;
|
|
ELSE
|
|
OPEN curs FOR SELECT m.list,m.year,m.month,m.msgnum,ts_rank_cd(m.fti,tsq) FROM messages m WHERE m.fti @@ tsq AND m.date>COALESCE(firstdate,'1900-01-01') ORDER BY ts_rank_cd(m.fti,tsq) DESC LIMIT 1000;
|
|
END IF;
|
|
ELSE
|
|
IF _lists < 0 THEN
|
|
SELECT INTO listary ARRAY(SELECT id FROM lists WHERE grp=-_lists);
|
|
ELSE
|
|
listary = ARRAY[_lists];
|
|
END IF;
|
|
SELECT INTO pagecount sum(lists.pagecount) FROM lists WHERE id=ANY(listary);
|
|
IF sort = 'd' THEN
|
|
OPEN curs FOR SELECT m.list,m.year,m.month,m.msgnum,ts_rank_cd(m.fti,tsq) FROM messages m WHERE (m.list=ANY(listary)) AND m.fti @@ tsq AND m.date>COALESCE(firstdate,'1900-01-01') ORDER BY m.date DESC LIMIT 1000;
|
|
ELSE
|
|
OPEN curs FOR SELECT m.list,m.year,m.month,m.msgnum,ts_rank_cd(m.fti,tsq) FROM messages m WHERE (m.list=ANY(listary)) AND m.fti @@ tsq AND m.date>COALESCE(firstdate,'1900-01-01') ORDER BY ts_rank_cd(m.fti,tsq) DESC LIMIT 1000;
|
|
END IF;
|
|
END IF;
|
|
LOOP
|
|
FETCH curs INTO hit;
|
|
IF NOT FOUND THEN
|
|
EXIT;
|
|
END IF;
|
|
hits := hits+1;
|
|
IF (hits < startofs+1) OR (hits > startofs + hitsperpage) THEN
|
|
CONTINUE;
|
|
END IF;
|
|
RETURN QUERY SELECT lists.name::text, hit.year, hit.month, hit.msgnum, messages.date, messages.subject::text, messages.author::text, ts_headline(messages.txt,tsq,'StartSel="[[[[[[",StopSel="]]]]]]"'), hit.ts_rank_cd::float FROM messages INNER JOIN lists ON messages.list=lists.id WHERE messages.list=hit.list AND messages.year=hit.year AND messages.month=hit.month AND messages.msgnum=hit.msgnum;
|
|
END LOOP;
|
|
|
|
listname := NULL; msgnum := NULL; date := NULL; subject := NULL; author := NULL; headline := NULL; rank := NULL;
|
|
year=hits;
|
|
month=pagecount;
|
|
RETURN NEXT;
|
|
END;
|
|
$$
|
|
LANGUAGE 'plpgsql';
|
|
ALTER FUNCTION archives_search(text, int, timestamptz, timestamptz, int, int, char) SET default_text_search_config = 'public.pg';
|
|
|
|
|
|
CREATE OR REPLACE FUNCTION site_search(query text, startofs int, hitsperpage int, _suburl text, includeinternal boolean DEFAULT False)
|
|
RETURNS TABLE (siteid int, baseurl text, suburl text, title text, headline text, rank float)
|
|
AS $$
|
|
DECLARE
|
|
tsq tsquery;
|
|
qry text;
|
|
hits int;
|
|
hit RECORD;
|
|
curs refcursor;
|
|
pagecount int;
|
|
BEGIN
|
|
tsq := plainto_tsquery('public.pg', query);
|
|
IF numnode(tsq) = 0 THEN
|
|
siteid = 0;baseurl=NULL;suburl=NULL;title=NULL;headline=NULL;rank=0;
|
|
RETURN NEXT;
|
|
RETURN;
|
|
END IF;
|
|
|
|
hits := 0;
|
|
|
|
SELECT INTO pagecount sites.pagecount FROM sites WHERE id=1;
|
|
IF _suburl IS NULL THEN
|
|
OPEN curs FOR SELECT sites.id AS siteid, sites.baseurl, webpages.suburl, ts_rank_cd(fti,tsq) * relprio AS ts_rank_cd FROM webpages INNER JOIN sites ON webpages.site=sites.id WHERE fti @@ tsq AND site=1 AND (includeinternal OR NOT isinternal) ORDER BY ts_rank_cd(fti,tsq) * relprio DESC LIMIT 1000;
|
|
ELSE
|
|
OPEN curs FOR SELECT sites.id AS siteid, sites.baseurl, webpages.suburl, ts_rank_cd(fti,tsq) * relprio AS ts_rank_cd FROM webpages INNER JOIN sites ON webpages.site=sites.id WHERE fti @@ tsq AND site=1 AND webpages.suburl LIKE _suburl||'%' AND (includeinternal OR NOT isinternal) ORDER BY ts_rank_cd(fti,tsq) * relprio DESC LIMIT 1000;
|
|
END IF;
|
|
LOOP
|
|
FETCH curs INTO hit;
|
|
IF NOT FOUND THEN
|
|
EXIT;
|
|
END IF;
|
|
hits := hits+1;
|
|
IF (hits < startofs+1) OR (hits > startofs+hitsperpage) THEN
|
|
CONTINUE;
|
|
END IF;
|
|
RETURN QUERY SELECT hit.siteid, hit.baseurl::text, hit.suburl::text, webpages.title::text, ts_headline(webpages.txt,tsq,'StartSel="[[[[[[",StopSel="]]]]]]"'), hit.ts_rank_cd::float * relprio FROM webpages WHERE webpages.site=hit.siteid AND webpages.suburl=hit.suburl;
|
|
END LOOP;
|
|
RETURN QUERY SELECT pagecount, NULL::text, NULL::text, NULL::text, NULL::text, hits::float;
|
|
END;
|
|
$$
|
|
LANGUAGE 'plpgsql';
|
|
ALTER FUNCTION site_search(text, int, int, text, bool) SET default_text_search_config = 'public.pg';
|