]> git.openstreetmap.org Git - osqa.git/blob - forum_modules/pgfulltext/pg_fts_install.sql
Fix OSQA 162, Error running cron/send_email_alerts.
[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 public.drop_tsv_noderevision_column () RETURNS VOID AS $$
22 begin
23         ALTER TABLE forum_noderevision DROP COLUMN tsv;
24         DROP TRIGGER IF EXISTS tsvectorupdate ON forum_noderevision;
25 end
26 $$ LANGUAGE plpgsql;
27
28 CREATE OR REPLACE FUNCTION public.tsv_noderevision_column_exists() RETURNS int AS $$
29  SELECT COUNT(attname)::int FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'forum_noderevision') AND attname = 'tsv';
30 $$ LANGUAGE 'sql';
31
32 select case when public.tsv_noderevision_column_exists()>0 then public.drop_tsv_noderevision_column()end;
33
34 drop function drop_tsv_noderevision_column();
35 drop function tsv_noderevision_column_exists();
36
37 CREATE OR REPLACE FUNCTION set_doctable_tsv() RETURNS TRIGGER AS $$
38 declare
39   root_id int;
40   doc tsvector;
41   rcount int;
42   cv tsvector;
43 begin
44     SELECT abs_parent_id INTO root_id FROM forum_node WHERE id = new.node_id;
45
46     IF root_id IS NULL THEN
47           root_id := new.node_id;
48     END IF;
49
50     SELECT count(*)::int INTO rcount FROM forum_node WHERE id = root_id;
51
52     IF rcount = 0 THEN
53         return new;
54     END IF;
55
56     doc :=
57       setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') ||
58       setweight(to_tsvector('english', coalesce(new.title,'')), 'B') ||
59       setweight(to_tsvector('english', coalesce(new.body,'')), 'C');
60
61     SELECT count(*)::int INTO rcount FROM forum_node WHERE abs_parent_id = root_id AND deleted_id IS NULL;
62
63     IF rcount > 0 THEN
64        FOR cv in SELECT setweight(to_tsvector('english', coalesce(body,'')), 'C') FROM forum_node WHERE abs_parent_id = root_id  AND deleted_id IS NULL LOOP
65            doc :=(doc || cv);
66        END LOOP;
67      END IF;
68
69     SELECT count(*)::int INTO rcount FROM forum_rootnode_doc WHERE node_id = root_id;
70
71     IF rcount > 0 THEN
72        UPDATE forum_rootnode_doc SET document = doc WHERE node_id = root_id;
73     ELSE
74        INSERT INTO forum_rootnode_doc (node_id, document) VALUES (root_id, doc);
75     END IF;
76
77   RETURN new;
78 end
79 $$ LANGUAGE plpgsql;
80
81 CREATE OR REPLACE FUNCTION public.build_doc_table() RETURNS VOID as $$
82   CREATE TABLE forum_rootnode_doc
83   (
84      node_id integer,
85      "document" tsvector,
86       PRIMARY KEY (node_id),
87       FOREIGN KEY (node_id) REFERENCES forum_node (id)    ON UPDATE NO ACTION ON DELETE NO ACTION
88   ) WITH (OIDS=FALSE);
89
90   DROP TRIGGER IF EXISTS tsvectorupdate ON forum_noderevision;
91
92   CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
93     ON forum_noderevision FOR EACH ROW EXECUTE PROCEDURE set_doctable_tsv();
94
95   CREATE INDEX doctable_tsv ON forum_rootnode_doc USING gin(document);
96 $$ LANGUAGE 'sql';
97
98 CREATE OR REPLACE FUNCTION public.doc_table_exists() RETURNS int AS $$
99  SELECT COUNT(table_name)::int FROM information_schema.tables WHERE table_name = 'forum_rootnode_doc';
100 $$ LANGUAGE 'sql';
101
102 select case when public.doc_table_exists()=0 then public.build_doc_table()end;
103
104 drop function build_doc_table();
105 drop function doc_table_exists();
106
107 UPDATE forum_noderevision SET id = id WHERE TRUE;