CREATE EXTENSION pg_trgm; CREATE TABLE books ( id varchar(16) primary key, title text, authors text[], contributor text, publisher text, description text, tags text[], date text, lang varchar(3), isbn varchar(13), file_size integer, cover boolean, active boolean, upload_date timestamp, tsv tsvector ); -- Books column indexes CREATE INDEX CONCURRENTLY books_lang_idx ON books (lang); CREATE INDEX CONCURRENTLY books_isbn_idx ON books (isbn); -- Books trigram indexes CREATE INDEX CONCURRENTLY books_title_idx ON books USING GIN (title gin_trgm_ops); CREATE INDEX CONCURRENTLY books_contributor_idx ON books USING GIN (contributor gin_trgm_ops); CREATE INDEX CONCURRENTLY books_publisher_idx ON books USING GIN (publisher gin_trgm_ops); CREATE FUNCTION text(text[]) RETURNS text immutable AS $$ select $1::text $$ language sql; CREATE INDEX CONCURRENTLY books_authors_idx ON books USING GIN (text(authors) gin_trgm_ops); CREATE INDEX CONCURRENTLY books_tags_idx ON books USING GIN (text(tags) gin_trgm_ops); -- Books text search index CREATE FUNCTION books_trigger() RETURNS trigger AS $$ declare lang_config regconfig; begin lang_config := 'simple'; if new.lang = 'da' then lang_config := 'danish'; elsif new.lang = 'nl' then lang_config := 'dutch'; elsif new.lang = 'en' then lang_config := 'english'; elsif new.lang = 'fi' then lang_config := 'finnish'; elsif new.lang = 'fr' then lang_config := 'french'; elsif new.lang = 'de' then lang_config :='german'; elsif new.lang = 'hu' then lang_config :='hungarian'; elsif new.lang = 'it' then lang_config :='italian'; elsif new.lang = 'no' then lang_config :='norwegian'; elsif new.lang = 'pt' then lang_config :='portuguese'; elsif new.lang = 'ro' then lang_config :='romanian'; elsif new.lang = 'ru' then lang_config :='russian'; elsif new.lang = 'es' then lang_config :='spanish'; elsif new.lang = 'sv' then lang_config :='swedish'; elsif new.lang = 'tr' then lang_config :='turkish'; end if; new.tsv := setweight(to_tsvector(lang_config, coalesce(new.title,'')), 'A') || setweight(to_tsvector('simple', coalesce(array_to_string(new.authors, ' '),'')), 'A') || setweight(to_tsvector('simple', coalesce(new.contributor,'')), 'B') || setweight(to_tsvector('simple', coalesce(new.publisher,'')), 'B') || setweight(to_tsvector(lang_config, coalesce(array_to_string(new.tags, ' '),'')), 'C') || setweight(to_tsvector(lang_config, coalesce(new.description,'')), 'D'); return new; end $$ LANGUAGE plpgsql; CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON books FOR EACH ROW EXECUTE PROCEDURE books_trigger(); CREATE INDEX CONCURRENTLY books_idx ON books USING GIN (tsv); CREATE TABLE news ( id serial unique, date timestamp, text text ); CREATE TABLE users ( id serial unique, username varchar(255) unique, password bytea, salt bytea, role varchar(255) );