- new.tsv :=
- setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') ||
- setweight(to_tsvector('english', coalesce(new.title,'')), 'B') ||
- setweight(to_tsvector('english', coalesce(new.html,'')), 'C');
+ SELECT tsv INTO v FROM forum_node WHERE id = node_id;
+ RETURN ts_rank_cd(v || children_tsv(node_id), plainto_tsquery(srch), 32);
+ end
+ $$ LANGUAGE plpgsql;
+
+ CREATE OR REPLACE FUNCTION children_tsv(id int) RETURNS tsvector AS $$
+ declare
+ v tsvector := ''::tsvector;
+ r record;
+ begin
+ FOR r IN SELECT * FROM forum_node WHERE parent_id = id LOOP
+ v := v || r.tsv || children_tsv(r.id);
+ END LOOP;
+ RETURN v;
+ end
+ $$ LANGUAGE plpgsql;
+
+ CREATE OR REPLACE FUNCTION set_node_tsv() RETURNS TRIGGER AS $$
+ begin
+ IF (tg_op = 'INSERT') THEN
+ new.tsv :=
+ setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') ||
+ setweight(to_tsvector('english', coalesce(new.title,'')), 'B') ||
+ setweight(to_tsvector('english', coalesce(new.body,'')), 'C');
+ ELSIF (new.active_revision_id <> old.active_revision_id) OR (new.tsv IS NULL) THEN
+ new.tsv :=
+ setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') ||
+ setweight(to_tsvector('english', coalesce(new.title,'')), 'B') ||
+ setweight(to_tsvector('english', coalesce(new.body,'')), 'C');
+ END IF;