]> git.openstreetmap.org Git - osqa.git/blob - forum_modules/pgfulltext/pg_fts_install.sql
improved text search
[osqa.git] / forum_modules / pgfulltext / pg_fts_install.sql
1   CREATE OR REPLACE FUNCTION public.create_plpgsql_language ()
2       RETURNS TEXT
3       AS $$
4           CREATE LANGUAGE plpgsql;
5           SELECT 'language plpgsql created'::TEXT;
6       $$
7   LANGUAGE 'sql';
8
9   SELECT CASE WHEN
10         (SELECT true::BOOLEAN
11            FROM pg_language
12           WHERE lanname='plpgsql')
13       THEN
14         (SELECT 'language already installed'::TEXT)
15       ELSE
16         (SELECT public.create_plpgsql_language())
17       END;
18
19   DROP FUNCTION public.create_plpgsql_language ();
20
21   CREATE OR REPLACE FUNCTION node_ranking(node_id int, srch text) RETURNS float AS $$
22   declare
23      v tsvector;
24   begin
25      SELECT tsv INTO v FROM forum_node WHERE id = node_id;
26      RETURN ts_rank_cd(v || children_tsv(node_id), plainto_tsquery(srch), 32);
27   end
28   $$ LANGUAGE plpgsql;
29
30   CREATE OR REPLACE FUNCTION children_tsv(id int) RETURNS tsvector AS $$
31     declare
32       v tsvector := ''::tsvector;
33       r record;
34     begin
35       FOR r IN SELECT * FROM forum_node WHERE parent_id = id LOOP
36         v := v || r.tsv || children_tsv(r.id);
37       END LOOP;
38       RETURN v;
39     end
40   $$ LANGUAGE plpgsql;
41
42   CREATE OR REPLACE FUNCTION set_node_tsv() RETURNS TRIGGER AS $$
43   begin
44     IF (tg_op = 'INSERT') THEN
45       new.tsv :=
46          setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') ||
47          setweight(to_tsvector('english', coalesce(new.title,'')), 'B') ||
48          setweight(to_tsvector('english', coalesce(new.body,'')), 'C');
49     ELSIF (new.active_revision_id <> old.active_revision_id) OR (new.tsv IS NULL) THEN
50       new.tsv :=
51          setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') ||
52          setweight(to_tsvector('english', coalesce(new.title,'')), 'B') ||
53          setweight(to_tsvector('english', coalesce(new.body,'')), 'C'); 
54     END IF;
55     RETURN new;
56   end
57   $$ LANGUAGE plpgsql;
58
59   CREATE OR REPLACE FUNCTION public.create_tsv_node_column ()
60       RETURNS TEXT
61       AS $$
62           ALTER TABLE forum_node ADD COLUMN tsv tsvector;
63
64           CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
65                 ON forum_node FOR EACH ROW EXECUTE PROCEDURE set_node_tsv();
66
67               CREATE INDEX node_tsv ON forum_node USING gin(tsv);
68
69           SELECT 'tsv column created'::TEXT;
70       $$
71   LANGUAGE 'sql';
72
73   SELECT CASE WHEN
74      (SELECT true::BOOLEAN FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'forum_node') AND attname = 'tsv')
75   THEN
76      (SELECT 'Tsv column already exists'::TEXT)
77   ELSE
78      (SELECT public.create_tsv_node_column())
79
80   END;
81
82   DROP FUNCTION public.create_tsv_node_column ();
83
84   UPDATE forum_node SET id=id WHERE TRUE;