]> git.openstreetmap.org Git - osqa.git/blob - forum_modules/pgfulltext/pg_fts_install.sql
verify the correct installation of fts triggers at startup
[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      cv tsvector;
25      rev_id int;
26      child_count int;
27      r record;
28   begin
29      SELECT active_revision_id INTO rev_id FROM forum_node WHERE id = node_id;
30      SELECT tsv INTO v FROM forum_noderevision WHERE id = rev_id;
31
32     SELECT  count(*) INTO child_count FROM forum_node WHERE abs_parent_id = node_id AND NOT deleted;
33
34     IF child_count > 0 THEN
35        FOR r in SELECT * FROM forum_node WHERE abs_parent_id = node_id  AND NOT deleted LOOP
36            SELECT tsv INTO cv FROM forum_noderevision WHERE id = r.active_revision_id;
37            v :=(v || cv);
38        END LOOP;
39      END IF;
40
41      RETURN ts_rank_cd(v, plainto_tsquery('english', srch), 32);
42   end
43   $$ LANGUAGE plpgsql;
44
45   CREATE OR REPLACE FUNCTION set_node_tsv() RETURNS TRIGGER AS $$
46   begin
47       new.tsv :=
48          setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') ||
49          setweight(to_tsvector('english', coalesce(new.title,'')), 'B') ||
50          setweight(to_tsvector('english', coalesce(new.body,'')), 'C');
51
52     RETURN new;
53   end
54   $$ LANGUAGE plpgsql;
55
56   CREATE OR REPLACE FUNCTION public.create_tsv_noderevision_column () RETURNS TEXT AS $$
57   begin
58           ALTER TABLE forum_noderevision ADD COLUMN tsv tsvector;
59
60           DROP TRIGGER IF EXISTS tsvectorupdate ON forum_noderevision;
61
62           CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
63                 ON forum_noderevision FOR EACH ROW EXECUTE PROCEDURE set_node_tsv();
64
65               CREATE INDEX noderevision_tsv ON forum_noderevision USING gin(tsv);
66
67           RETURN 'tsv column created'::TEXT;
68   end
69   $$ LANGUAGE plpgsql;
70
71   SELECT CASE WHEN
72      (SELECT true::BOOLEAN FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'forum_noderevision') AND attname = 'tsv')
73   THEN
74      (SELECT 'Tsv column already exists'::TEXT)
75   ELSE
76      (SELECT public.create_tsv_noderevision_column())
77
78   END;
79
80   DROP FUNCTION public.create_tsv_noderevision_column();
81
82   UPDATE forum_noderevision SET id=id WHERE TRUE;