X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/a9eef437702d5df7a2f97010e6798c689371808c..fda16cc8044e41ca8bd76e40c725f8f21173841e:/forum_modules/pgfulltext/pg_fts_install.sql diff --git a/forum_modules/pgfulltext/pg_fts_install.sql b/forum_modules/pgfulltext/pg_fts_install.sql old mode 100755 new mode 100644 index 72eca51..9a6b60d --- a/forum_modules/pgfulltext/pg_fts_install.sql +++ b/forum_modules/pgfulltext/pg_fts_install.sql @@ -1,38 +1,82 @@ -ALTER TABLE question ADD COLUMN tsv tsvector; - -CREATE OR REPLACE FUNCTION public.create_plpgsql_language () - RETURNS TEXT - AS $$ - CREATE LANGUAGE plpgsql; - SELECT 'language plpgsql created'::TEXT; - $$ -LANGUAGE 'sql'; - -SELECT CASE WHEN - (SELECT true::BOOLEAN - FROM pg_language - WHERE lanname='plpgsql') - THEN - (SELECT 'language already installed'::TEXT) - ELSE - (SELECT public.create_plpgsql_language()) - END; - -DROP FUNCTION public.create_plpgsql_language (); - -CREATE OR REPLACE FUNCTION set_question_tsv() RETURNS TRIGGER AS $$ -begin - new.tsv := - setweight(to_tsvector('english', coalesce(new.tagnames,'')), 'A') || - setweight(to_tsvector('english', coalesce(new.title,'')), 'B') || - setweight(to_tsvector('english', coalesce(new.summary,'')), 'C'); - RETURN new; -end -$$ LANGUAGE plpgsql; - -CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE -ON question FOR EACH ROW EXECUTE PROCEDURE set_question_tsv(); - - CREATE INDEX question_tsv ON question USING gin(tsv); - -UPDATE question SET title = title; + CREATE OR REPLACE FUNCTION public.create_plpgsql_language () + RETURNS TEXT + AS $$ + CREATE LANGUAGE plpgsql; + SELECT 'language plpgsql created'::TEXT; + $$ + LANGUAGE 'sql'; + + SELECT CASE WHEN + (SELECT true::BOOLEAN + FROM pg_language + WHERE lanname='plpgsql') + THEN + (SELECT 'language already installed'::TEXT) + ELSE + (SELECT public.create_plpgsql_language()) + END; + + DROP FUNCTION public.create_plpgsql_language (); + + CREATE OR REPLACE FUNCTION node_ranking(node_id int, srch text) RETURNS float AS $$ + declare + v tsvector; + cv tsvector; + rev_id int; + child_count int; + r record; + begin + SELECT active_revision_id INTO rev_id FROM forum_node WHERE id = node_id; + SELECT tsv INTO v FROM forum_noderevision WHERE id = rev_id; + + SELECT count(*) INTO child_count FROM forum_node WHERE abs_parent_id = node_id AND deleted_id IS NULL; + + IF child_count > 0 THEN + FOR r in SELECT * FROM forum_node WHERE abs_parent_id = node_id AND deleted_id IS NULL LOOP + SELECT tsv INTO cv FROM forum_noderevision WHERE id = r.active_revision_id; + v :=(v || cv); + END LOOP; + END IF; + + RETURN ts_rank_cd(v, plainto_tsquery('english', srch), 32); + end + $$ LANGUAGE plpgsql; + + CREATE OR REPLACE FUNCTION set_node_tsv() RETURNS TRIGGER AS $$ + begin + 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'); + + RETURN new; + end + $$ LANGUAGE plpgsql; + + CREATE OR REPLACE FUNCTION public.create_tsv_noderevision_column () RETURNS TEXT AS $$ + begin + ALTER TABLE forum_noderevision ADD COLUMN tsv tsvector; + + DROP TRIGGER IF EXISTS tsvectorupdate ON forum_noderevision; + + CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE + ON forum_noderevision FOR EACH ROW EXECUTE PROCEDURE set_node_tsv(); + + CREATE INDEX noderevision_tsv ON forum_noderevision USING gin(tsv); + + RETURN 'tsv column created'::TEXT; + end + $$ LANGUAGE plpgsql; + + SELECT CASE WHEN + (SELECT true::BOOLEAN FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'forum_noderevision') AND attname = 'tsv') + THEN + (SELECT 'Tsv column already exists'::TEXT) + ELSE + (SELECT public.create_tsv_noderevision_column()) + + END; + + DROP FUNCTION public.create_tsv_noderevision_column(); + + UPDATE forum_noderevision SET id=id WHERE TRUE; \ No newline at end of file