diff options
Diffstat (limited to 'web/converse/migrations/2018-05-01-141548_add-users')
-rw-r--r-- | web/converse/migrations/2018-05-01-141548_add-users/down.sql | 63 | ||||
-rw-r--r-- | web/converse/migrations/2018-05-01-141548_add-users/up.sql | 83 |
2 files changed, 146 insertions, 0 deletions
diff --git a/web/converse/migrations/2018-05-01-141548_add-users/down.sql b/web/converse/migrations/2018-05-01-141548_add-users/down.sql new file mode 100644 index 000000000000..61fd222e18cf --- /dev/null +++ b/web/converse/migrations/2018-05-01-141548_add-users/down.sql @@ -0,0 +1,63 @@ +-- First restore the old columns: +ALTER TABLE threads ADD COLUMN author_name VARCHAR; +ALTER TABLE threads ADD COLUMN author_email VARCHAR; +ALTER TABLE posts ADD COLUMN author_name VARCHAR; +ALTER TABLE posts ADD COLUMN author_email VARCHAR; + +-- Then select the data back into them: +UPDATE threads SET author_name = users.name, + author_email = users.email + FROM users + WHERE threads.user_id = users.id; + +UPDATE posts SET author_name = users.name, + author_email = users.email + FROM users + WHERE posts.user_id = users.id; + +-- add the constraints back: +ALTER TABLE threads ALTER COLUMN author_name SET NOT NULL; +ALTER TABLE threads ALTER COLUMN author_email SET NOT NULL; +ALTER TABLE posts ALTER COLUMN author_name SET NOT NULL; +ALTER TABLE posts ALTER COLUMN author_email SET NOT NULL; + +-- reset the index view: +CREATE OR REPLACE VIEW thread_index AS + SELECT t.id AS thread_id, + t.title AS title, + t.author_name AS thread_author, + t.posted AS created, + t.sticky AS sticky, + p.id AS post_id, + p.author_name AS post_author, + p.posted AS posted + FROM threads t + JOIN (SELECT DISTINCT ON (thread_id) + id, thread_id, author_name, posted + FROM posts + ORDER BY thread_id, id DESC) AS p + ON t.id = p.thread_id + ORDER BY t.sticky DESC, p.id DESC; + +-- reset the search view: +DROP MATERIALIZED VIEW search_index; +CREATE MATERIALIZED VIEW search_index AS + SELECT p.id AS post_id, + p.author_name AS author, + t.id AS thread_id, + t.title AS title, + p.body AS body, + setweight(to_tsvector('english', t.title), 'B') || + setweight(to_tsvector('english', p.body), 'A') || + setweight(to_tsvector('simple', t.author_name), 'C') || + setweight(to_tsvector('simple', p.author_name), 'C') AS document + FROM posts p + JOIN threads t + ON t.id = p.thread_id; + +CREATE INDEX idx_fts_search ON search_index USING gin(document); + +-- and drop the users table and columns: +ALTER TABLE posts DROP COLUMN user_id; +ALTER TABLE threads DROP COLUMN user_id; +DROP TABLE users; diff --git a/web/converse/migrations/2018-05-01-141548_add-users/up.sql b/web/converse/migrations/2018-05-01-141548_add-users/up.sql new file mode 100644 index 000000000000..fcb7133e8e41 --- /dev/null +++ b/web/converse/migrations/2018-05-01-141548_add-users/up.sql @@ -0,0 +1,83 @@ +-- This query creates a users table and migrates the existing user +-- information (from the posts table) into it. + +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + email VARCHAR NOT NULL UNIQUE, + name VARCHAR NOT NULL, + admin BOOLEAN NOT NULL DEFAULT false +); + +-- Insert the 'anonymous' user explicitly: +INSERT INTO users (name, email) + VALUES ('Anonymous', 'anonymous@nothing.org'); + +INSERT INTO users (id, email, name) + SELECT nextval('users_id_seq'), + author_email AS email, + author_name AS name + FROM posts + WHERE author_email != 'anonymous@nothing.org' + GROUP BY name, email; + +-- Create the 'user_id' column in the relevant tables (initially +-- without a not-null constraint) and populate it with the data +-- selected above: +ALTER TABLE posts ADD COLUMN user_id INTEGER REFERENCES users (id); +UPDATE posts SET user_id = users.id + FROM users + WHERE users.email = posts.author_email; + +ALTER TABLE threads ADD COLUMN user_id INTEGER REFERENCES users (id); +UPDATE threads SET user_id = users.id + FROM users + WHERE users.email = threads.author_email; + +-- Add the constraints: +ALTER TABLE posts ALTER COLUMN user_id SET NOT NULL; +ALTER TABLE threads ALTER COLUMN user_id SET NOT NULL; + +-- Update the index view: +CREATE OR REPLACE VIEW thread_index AS + SELECT t.id AS thread_id, + t.title AS title, + ta.name AS thread_author, + t.posted AS created, + t.sticky AS sticky, + p.id AS post_id, + pa.name AS post_author, + p.posted AS posted + FROM threads t + JOIN (SELECT DISTINCT ON (thread_id) + id, thread_id, user_id, posted + FROM posts + ORDER BY thread_id, id DESC) AS p + ON t.id = p.thread_id + JOIN users ta ON ta.id = t.user_id + JOIN users pa ON pa.id = p.user_id + ORDER BY t.sticky DESC, p.id DESC; + +-- Update the search view: +DROP MATERIALIZED VIEW search_index; +CREATE MATERIALIZED VIEW search_index AS + SELECT p.id AS post_id, + pa.name AS author, + t.id AS thread_id, + t.title AS title, + p.body AS body, + setweight(to_tsvector('english', t.title), 'B') || + setweight(to_tsvector('english', p.body), 'A') || + setweight(to_tsvector('simple', ta.name), 'C') || + setweight(to_tsvector('simple', pa.name), 'C') AS document + FROM posts p + JOIN threads t ON t.id = p.thread_id + JOIN users ta ON ta.id = t.user_id + JOIN users pa ON pa.id = p.user_id; + +CREATE INDEX idx_fts_search ON search_index USING gin(document); + +-- And drop the old fields: +ALTER TABLE posts DROP COLUMN author_name; +ALTER TABLE posts DROP COLUMN author_email; +ALTER TABLE threads DROP COLUMN author_name; +ALTER TABLE threads DROP COLUMN author_email; |