Adding SQL format checking via pg_format / pgFormatter (#3740)

* SQL format checking, 1.

* SQL format checking, 2.

* SQL format checking, 3.

* SQL format checking, 4.

* SQL format checking, 5.

* Running pg_format

* Getting rid of comment.

* Upping pg_format version.

* Using git ls-files for sql format check.

* Fixing sql lints.

* Addressing PR comments.
This commit is contained in:
Dessalines 2023-08-02 12:44:51 -04:00 committed by GitHub
parent b4380cb548
commit be1389420b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
341 changed files with 22860 additions and 12364 deletions

View file

@ -83,6 +83,18 @@ pipeline:
- rustup component add rustfmt --toolchain nightly-2023-07-10 - rustup component add rustfmt --toolchain nightly-2023-07-10
- cargo +nightly-2023-07-10 fmt -- --check - cargo +nightly-2023-07-10 fmt -- --check
sql_fmt:
image: alpine:3
commands:
- apk add bash wget perl make git
- wget https://github.com/darold/pgFormatter/archive/refs/tags/v5.5.tar.gz
- tar xzf v5.5.tar.gz
- cd pgFormatter-5.5
- perl Makefile.PL
- make && make install
- cd ..
- ./scripts/./sql_format_check.sh
# make sure api builds with default features (used by other crates relying on lemmy api) # make sure api builds with default features (used by other crates relying on lemmy api)
check_api_common_default_features: check_api_common_default_features:
image: *muslrust_image image: *muslrust_image
@ -145,7 +157,7 @@ pipeline:
environment: environment:
CARGO_HOME: .cargo CARGO_HOME: .cargo
commands: commands:
# when adding new clippy lints, make sure to also add them in scripts/fix-clippy.sh # when adding new clippy lints, make sure to also add them in scripts/lint.sh
- rustup component add clippy - rustup component add clippy
- cargo clippy --workspace --tests --all-targets --features console -- - cargo clippy --workspace --tests --all-targets --features console --
-D warnings -D deprecated -D clippy::perf -D clippy::complexity -D warnings -D deprecated -D clippy::perf -D clippy::complexity

View file

@ -1,6 +1,7 @@
-- This file was automatically created by Diesel to setup helper functions -- This file was automatically created by Diesel to setup helper functions
-- and other internal bookkeeping. This file is safe to edit, any future -- and other internal bookkeeping. This file is safe to edit, any future
-- changes will be added to existing projects as new migrations. -- changes will be added to existing projects as new migrations.
DROP FUNCTION IF EXISTS diesel_manage_updated_at (_tbl regclass);
DROP FUNCTION IF EXISTS diesel_set_updated_at ();
DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass);
DROP FUNCTION IF EXISTS diesel_set_updated_at();

View file

@ -1,10 +1,6 @@
-- This file was automatically created by Diesel to setup helper functions -- This file was automatically created by Diesel to setup helper functions
-- and other internal bookkeeping. This file is safe to edit, any future -- and other internal bookkeeping. This file is safe to edit, any future
-- changes will be added to existing projects as new migrations. -- changes will be added to existing projects as new migrations.
-- Sets up a trigger for the given table to automatically set a column called -- Sets up a trigger for the given table to automatically set a column called
-- `updated_at` whenever the row is modified (unless `updated_at` was included -- `updated_at` whenever the row is modified (unless `updated_at` was included
-- in the modified columns) -- in the modified columns)
@ -16,21 +12,25 @@
-- --
-- SELECT diesel_manage_updated_at('users'); -- SELECT diesel_manage_updated_at('users');
-- ``` -- ```
CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION diesel_manage_updated_at (_tbl regclass)
RETURNS VOID
AS $$
BEGIN BEGIN
EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s
FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl); FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl);
END; END;
$$ LANGUAGE plpgsql; $$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$ CREATE OR REPLACE FUNCTION diesel_set_updated_at ()
RETURNS TRIGGER
AS $$
BEGIN BEGIN
IF ( IF (NEW IS DISTINCT FROM OLD AND NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at) THEN
NEW IS DISTINCT FROM OLD AND NEW.updated_at := CURRENT_TIMESTAMP;
NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
) THEN
NEW.updated_at := current_timestamp;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ LANGUAGE plpgsql; $$
LANGUAGE plpgsql;

View file

@ -1,2 +1,4 @@
drop table user_ban; DROP TABLE user_ban;
drop table user_;
DROP TABLE user_;

View file

@ -1,23 +1,25 @@
create table user_ ( CREATE TABLE user_ (
id serial primary key, id serial PRIMARY KEY,
name varchar(20) not null, name varchar(20) NOT NULL,
fedi_name varchar(40) not null, fedi_name varchar(40) NOT NULL,
preferred_username varchar(20), preferred_username varchar(20),
password_encrypted text not null, password_encrypted text NOT NULL,
email text unique, email text UNIQUE,
icon bytea, icon bytea,
admin boolean default false not null, admin boolean DEFAULT FALSE NOT NULL,
banned boolean default false not null, banned boolean DEFAULT FALSE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
updated timestamp, updated timestamp,
unique(name, fedi_name) UNIQUE (name, fedi_name)
); );
create table user_ban ( CREATE TABLE user_ban (
id serial primary key, id serial PRIMARY KEY,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique (user_id) UNIQUE (user_id)
); );
insert into user_ (name, fedi_name, password_encrypted) values ('admin', 'TBD', 'TBD'); INSERT INTO user_ (name, fedi_name, password_encrypted)
VALUES ('admin', 'TBD', 'TBD');

View file

@ -1,6 +1,14 @@
drop table site; DROP TABLE site;
drop table community_user_ban;;
drop table community_moderator; DROP TABLE community_user_ban;
drop table community_follower;
drop table community; ;
drop table category;
DROP TABLE community_moderator;
DROP TABLE community_follower;
DROP TABLE community;
DROP TABLE category;

View file

@ -1,79 +1,81 @@
create table category ( CREATE TABLE category (
id serial primary key, id serial PRIMARY KEY,
name varchar(100) not null unique name varchar(100) NOT NULL UNIQUE
); );
insert into category (name) values INSERT INTO category (name)
('Discussion'), VALUES ('Discussion'),
('Humor/Memes'), ('Humor/Memes'),
('Gaming'), ('Gaming'),
('Movies'), ('Movies'),
('TV'), ('TV'),
('Music'), ('Music'),
('Literature'), ('Literature'),
('Comics'), ('Comics'),
('Photography'), ('Photography'),
('Art'), ('Art'),
('Learning'), ('Learning'),
('DIY'), ('DIY'),
('Lifestyle'), ('Lifestyle'),
('News'), ('News'),
('Politics'), ('Politics'),
('Society'), ('Society'),
('Gender/Identity/Sexuality'), ('Gender/Identity/Sexuality'),
('Race/Colonisation'), ('Race/Colonisation'),
('Religion'), ('Religion'),
('Science/Technology'), ('Science/Technology'),
('Programming/Software'), ('Programming/Software'),
('Health/Sports/Fitness'), ('Health/Sports/Fitness'),
('Porn'), ('Porn'),
('Places'), ('Places'),
('Meta'), ('Meta'),
('Other'); ('Other');
create table community ( CREATE TABLE community (
id serial primary key, id serial PRIMARY KEY,
name varchar(20) not null unique, name varchar(20) NOT NULL UNIQUE,
title varchar(100) not null, title varchar(100) NOT NULL,
description text, description text,
category_id int references category on update cascade on delete cascade not null, category_id int REFERENCES category ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
creator_id int references user_ on update cascade on delete cascade not null, creator_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
removed boolean default false not null, removed boolean DEFAULT FALSE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
updated timestamp updated timestamp
); );
create table community_moderator ( CREATE TABLE community_moderator (
id serial primary key, id serial PRIMARY KEY,
community_id int references community on update cascade on delete cascade not null, community_id int REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique (community_id, user_id) UNIQUE (community_id, user_id)
); );
create table community_follower ( CREATE TABLE community_follower (
id serial primary key, id serial PRIMARY KEY,
community_id int references community on update cascade on delete cascade not null, community_id int REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique (community_id, user_id) UNIQUE (community_id, user_id)
); );
create table community_user_ban ( CREATE TABLE community_user_ban (
id serial primary key, id serial PRIMARY KEY,
community_id int references community on update cascade on delete cascade not null, community_id int REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique (community_id, user_id) UNIQUE (community_id, user_id)
); );
insert into community (name, title, category_id, creator_id) values ('main', 'The Default Community', 1, 1); INSERT INTO community (name, title, category_id, creator_id)
VALUES ('main', 'The Default Community', 1, 1);
create table site ( CREATE TABLE site (
id serial primary key, id serial PRIMARY KEY,
name varchar(20) not null unique, name varchar(20) NOT NULL UNIQUE,
description text, description text,
creator_id int references user_ on update cascade on delete cascade not null, creator_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
updated timestamp updated timestamp
); );

View file

@ -1,4 +1,8 @@
drop table post_read; DROP TABLE post_read;
drop table post_saved;
drop table post_like; DROP TABLE post_saved;
drop table post;
DROP TABLE post_like;
DROP TABLE post;

View file

@ -1,37 +1,38 @@
create table post ( CREATE TABLE post (
id serial primary key, id serial PRIMARY KEY,
name varchar(100) not null, name varchar(100) NOT NULL,
url text, -- These are both optional, a post can just have a title url text, -- These are both optional, a post can just have a title
body text, body text,
creator_id int references user_ on update cascade on delete cascade not null, creator_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
community_id int references community on update cascade on delete cascade not null, community_id int REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
removed boolean default false not null, removed boolean DEFAULT FALSE NOT NULL,
locked boolean default false not null, locked boolean DEFAULT FALSE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
updated timestamp updated timestamp
); );
create table post_like ( CREATE TABLE post_like (
id serial primary key, id serial PRIMARY KEY,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
score smallint not null, -- -1, or 1 for dislike, like, no row for no opinion score smallint NOT NULL, -- -1, or 1 for dislike, like, no row for no opinion
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique(post_id, user_id) UNIQUE (post_id, user_id)
); );
create table post_saved ( CREATE TABLE post_saved (
id serial primary key, id serial PRIMARY KEY,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique(post_id, user_id) UNIQUE (post_id, user_id)
); );
create table post_read ( CREATE TABLE post_read (
id serial primary key, id serial PRIMARY KEY,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique(post_id, user_id) UNIQUE (post_id, user_id)
); );

View file

@ -1,3 +1,6 @@
drop table comment_saved; DROP TABLE comment_saved;
drop table comment_like;
drop table comment; DROP TABLE comment_like;
DROP TABLE comment;

View file

@ -1,29 +1,30 @@
create table comment ( CREATE TABLE comment (
id serial primary key, id serial PRIMARY KEY,
creator_id int references user_ on update cascade on delete cascade not null, creator_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
parent_id int references comment on update cascade on delete cascade, parent_id int REFERENCES COMMENT ON UPDATE CASCADE ON DELETE CASCADE,
content text not null, content text NOT NULL,
removed boolean default false not null, removed boolean DEFAULT FALSE NOT NULL,
read boolean default false not null, read boolean DEFAULT FALSE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
updated timestamp updated timestamp
); );
create table comment_like ( CREATE TABLE comment_like (
id serial primary key, id serial PRIMARY KEY,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
comment_id int references comment on update cascade on delete cascade not null, comment_id int REFERENCES COMMENT ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
score smallint not null, -- -1, or 1 for dislike, like, no row for no opinion score smallint NOT NULL, -- -1, or 1 for dislike, like, no row for no opinion
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique(comment_id, user_id) UNIQUE (comment_id, user_id)
); );
create table comment_saved ( CREATE TABLE comment_saved (
id serial primary key, id serial PRIMARY KEY,
comment_id int references comment on update cascade on delete cascade not null, comment_id int REFERENCES COMMENT ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique(comment_id, user_id) UNIQUE (comment_id, user_id)
); );

View file

@ -1,2 +1,4 @@
drop view post_view; DROP VIEW post_view;
drop function hot_rank;
DROP FUNCTION hot_rank;

View file

@ -1,51 +1,107 @@
-- Rank = ScaleFactor * sign(Score) * log(1 + abs(Score)) / (Time + 2)^Gravity -- Rank = ScaleFactor * sign(Score) * log(1 + abs(Score)) / (Time + 2)^Gravity
create or replace function hot_rank( CREATE OR REPLACE FUNCTION hot_rank (score numeric, published timestamp without time zone)
score numeric, RETURNS integer
published timestamp without time zone) AS $$
returns integer as $$ BEGIN
begin -- hours_diff:=EXTRACT(EPOCH FROM (timezone('utc',now()) - published))/3600
-- hours_diff:=EXTRACT(EPOCH FROM (timezone('utc',now()) - published))/3600 RETURN floor(10000 * log(greatest (1, score + 3)) / power(((EXTRACT(EPOCH FROM (timezone('utc', now()) - published)) / 3600) + 2), 1.8))::integer;
return floor(10000*log(greatest(1,score+3)) / power(((EXTRACT(EPOCH FROM (timezone('utc',now()) - published))/3600) + 2), 1.8))::integer; END;
end; $$ $$
LANGUAGE plpgsql; LANGUAGE plpgsql;
create view post_view as CREATE VIEW post_view AS
with all_post as with all_post AS (
( SELECT
select p.*,
p.*, (
(select name from user_ where p.creator_id = user_.id) as creator_name, SELECT
(select name from community where p.community_id = community.id) as community_name, name
(select removed from community c where p.community_id = c.id) as community_removed, FROM
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, user_
coalesce(sum(pl.score), 0) as score, WHERE
count (case when pl.score = 1 then 1 else null end) as upvotes, p.creator_id = user_.id) AS creator_name,
count (case when pl.score = -1 then 1 else null end) as downvotes, (
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank SELECT
from post p name
left join post_like pl on p.id = pl.post_id FROM
group by p.id community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
ap.*,
u.id AS user_id,
coalesce(pl.score, 0) AS my_vote,
(
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;

View file

@ -1,5 +1,10 @@
drop view community_view; DROP VIEW community_view;
drop view community_moderator_view;
drop view community_follower_view; DROP VIEW community_moderator_view;
drop view community_user_ban_view;
drop view site_view; DROP VIEW community_follower_view;
DROP VIEW community_user_ban_view;
DROP VIEW site_view;

View file

@ -1,53 +1,154 @@
create view community_view as CREATE VIEW community_view AS
with all_community as with all_community AS (
( SELECT
select *, *,
(select name from user_ u where c.creator_id = u.id) as creator_name, (
(select name from category ct where c.category_id = ct.id) as category_name, SELECT
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, name
(select count(*) from post p where p.community_id = c.id) as number_of_posts, FROM
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments user_ u
from community c WHERE
c.creator_id = u.id) AS creator_name,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments
FROM
community c
) )
SELECT
ac.*,
u.id AS user_id,
(
SELECT
cf.id::boolean
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND ac.id = cf.community_id) AS subscribed
FROM
user_ u
CROSS JOIN all_community ac
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
select CREATE VIEW community_moderator_view AS
ac.*, SELECT
u.id as user_id, *,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed (
from user_ u SELECT
cross join all_community ac name
FROM
user_ u
WHERE
cm.user_id = u.id) AS user_name,
(
SELECT
name
FROM
community c
WHERE
cm.community_id = c.id) AS community_name
FROM
community_moderator cm;
union all CREATE VIEW community_follower_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
cf.user_id = u.id) AS user_name,
(
SELECT
name
FROM
community c
WHERE
cf.community_id = c.id) AS community_name
FROM
community_follower cf;
select CREATE VIEW community_user_ban_view AS
ac.*, SELECT
null as user_id, *,
null as subscribed (
from all_community ac SELECT
; name
FROM
user_ u
WHERE
cm.user_id = u.id) AS user_name,
(
SELECT
name
FROM
community c
WHERE
cm.community_id = c.id) AS community_name
FROM
community_user_ban cm;
create view community_moderator_view as CREATE VIEW site_view AS
select *, SELECT
(select name from user_ u where cm.user_id = u.id) as user_name, *,
(select name from community c where cm.community_id = c.id) as community_name (
from community_moderator cm; SELECT
name
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_name,
(
SELECT
count(*)
FROM
user_) AS number_of_users,
(
SELECT
count(*)
FROM
post) AS number_of_posts,
(
SELECT
count(*)
FROM
comment) AS number_of_comments
FROM
site s;
create view community_follower_view as
select *,
(select name from user_ u where cf.user_id = u.id) as user_name,
(select name from community c where cf.community_id = c.id) as community_name
from community_follower cf;
create view community_user_ban_view as
select *,
(select name from user_ u where cm.user_id = u.id) as user_name,
(select name from community c where cm.community_id = c.id) as community_name
from community_user_ban cm;
create view site_view as
select *,
(select name from user_ u where s.creator_id = u.id) as creator_name,
(select count(*) from user_) as number_of_users,
(select count(*) from post) as number_of_posts,
(select count(*) from comment) as number_of_comments
from site s;

View file

@ -1,2 +1,4 @@
drop view reply_view; DROP VIEW reply_view;
drop view comment_view;
DROP VIEW comment_view;

View file

@ -1,60 +1,114 @@
create view comment_view as CREATE VIEW comment_view AS
with all_comment as with all_comment AS (
( SELECT
select c.*,
c.*, (
(select community_id from post p where p.id = c.post_id), SELECT
(select u.banned from user_ u where c.creator_id = u.id) as banned, community_id
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, FROM
(select name from user_ where c.creator_id = user_.id) as creator_name, post p
coalesce(sum(cl.score), 0) as score, WHERE
count (case when cl.score = 1 then 1 else null end) as upvotes, p.id = c.post_id),
count (case when cl.score = -1 then 1 else null end) as downvotes (
from comment c SELECT
left join comment_like cl on c.id = cl.comment_id u.banned
group by c.id FROM
user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id
) )
SELECT
ac.*,
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
select CREATE VIEW reply_view AS
ac.*, with closereply AS (
u.id as user_id, SELECT
coalesce(cl.score, 0) as my_vote, c2.id,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved c2.creator_id AS sender_id,
from user_ u c.creator_id AS recipient_id
cross join all_comment ac FROM
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id comment c
INNER JOIN comment c2 ON c.id = c2.parent_id
union all WHERE
c2.creator_id != c.creator_id
select -- Do union where post is null
ac.*, UNION
null as user_id, SELECT
null as my_vote, c.id,
null as saved c.creator_id AS sender_id,
from all_comment ac p.creator_id AS recipient_id
; FROM
comment c,
create view reply_view as post p
with closereply as ( WHERE
select c.post_id = p.id
c2.id, AND c.parent_id IS NULL
c2.creator_id as sender_id, AND c.creator_id != p.creator_id
c.creator_id as recipient_id
from comment c
inner join comment c2 on c.id = c2.parent_id
where c2.creator_id != c.creator_id
-- Do union where post is null
union
select
c.id,
c.creator_id as sender_id,
p.creator_id as recipient_id
from comment c, post p
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_view cv,
closereply
WHERE
closereply.id = cv.id;

View file

@ -1,8 +1,16 @@
drop table mod_remove_post; DROP TABLE mod_remove_post;
drop table mod_lock_post;
drop table mod_remove_comment; DROP TABLE mod_lock_post;
drop table mod_remove_community;
drop table mod_ban; DROP TABLE mod_remove_comment;
drop table mod_ban_from_community;
drop table mod_add; DROP TABLE mod_remove_community;
drop table mod_add_community;
DROP TABLE mod_ban;
DROP TABLE mod_ban_from_community;
DROP TABLE mod_add;
DROP TABLE mod_add_community;

View file

@ -1,76 +1,76 @@
create table mod_remove_post ( CREATE TABLE mod_remove_post (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
reason text, reason text,
removed boolean default true, removed boolean DEFAULT TRUE,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
create table mod_lock_post ( CREATE TABLE mod_lock_post (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
locked boolean default true, locked boolean DEFAULT TRUE,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
create table mod_remove_comment ( CREATE TABLE mod_remove_comment (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
comment_id int references comment on update cascade on delete cascade not null, comment_id int REFERENCES COMMENT ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
reason text, reason text,
removed boolean default true, removed boolean DEFAULT TRUE,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
create table mod_remove_community ( CREATE TABLE mod_remove_community (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
community_id int references community on update cascade on delete cascade not null, community_id int REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
reason text, reason text,
removed boolean default true, removed boolean DEFAULT TRUE,
expires timestamp, expires timestamp,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
-- TODO make sure you can't ban other mods -- TODO make sure you can't ban other mods
create table mod_ban_from_community ( CREATE TABLE mod_ban_from_community (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
other_user_id int references user_ on update cascade on delete cascade not null, other_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
community_id int references community on update cascade on delete cascade not null, community_id int REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
reason text, reason text,
banned boolean default true, banned boolean DEFAULT TRUE,
expires timestamp, expires timestamp,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
create table mod_ban ( CREATE TABLE mod_ban (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
other_user_id int references user_ on update cascade on delete cascade not null, other_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
reason text, reason text,
banned boolean default true, banned boolean DEFAULT TRUE,
expires timestamp, expires timestamp,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
create table mod_add_community ( CREATE TABLE mod_add_community (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
other_user_id int references user_ on update cascade on delete cascade not null, other_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
community_id int references community on update cascade on delete cascade not null, community_id int REFERENCES community ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
removed boolean default false, removed boolean DEFAULT FALSE,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
-- When removed is false that means kicked -- When removed is false that means kicked
create table mod_add ( CREATE TABLE mod_add (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
other_user_id int references user_ on update cascade on delete cascade not null, other_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
removed boolean default false, removed boolean DEFAULT FALSE,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );

View file

@ -1 +1,2 @@
drop view user_view; DROP VIEW user_view;

View file

@ -1,12 +1,43 @@
create view user_view as CREATE VIEW user_view AS
select id, SELECT
name, id,
fedi_name, name,
admin, fedi_name,
banned, admin,
published, banned,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, published,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, (
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, SELECT
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score count(*)
from user_ u; FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;

View file

@ -1,8 +1,16 @@
drop view mod_remove_post_view; DROP VIEW mod_remove_post_view;
drop view mod_lock_post_view;
drop view mod_remove_comment_view; DROP VIEW mod_lock_post_view;
drop view mod_remove_community_view;
drop view mod_ban_from_community_view; DROP VIEW mod_remove_comment_view;
drop view mod_ban_view;
drop view mod_add_community_view; DROP VIEW mod_remove_community_view;
drop view mod_add_view;
DROP VIEW mod_ban_from_community_view;
DROP VIEW mod_ban_view;
DROP VIEW mod_add_community_view;
DROP VIEW mod_add_view;

View file

@ -1,59 +1,266 @@
create view mod_remove_post_view as CREATE VIEW mod_remove_post_view AS
select mrp.*, SELECT
(select name from user_ u where mrp.mod_user_id = u.id) as mod_user_name, mrp.*,
(select name from post p where mrp.post_id = p.id) as post_name, (
(select c.id from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_id, SELECT
(select c.name from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_name name
from mod_remove_post mrp; FROM
user_ u
WHERE
mrp.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
post p
WHERE
mrp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
mrp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
mrp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_remove_post mrp;
create view mod_lock_post_view as CREATE VIEW mod_lock_post_view AS
select mlp.*, SELECT
(select name from user_ u where mlp.mod_user_id = u.id) as mod_user_name, mlp.*,
(select name from post p where mlp.post_id = p.id) as post_name, (
(select c.id from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_id, SELECT
(select c.name from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_name name
from mod_lock_post mlp; FROM
user_ u
WHERE
mlp.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
post p
WHERE
mlp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
mlp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
mlp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_lock_post mlp;
create view mod_remove_comment_view as CREATE VIEW mod_remove_comment_view AS
select mrc.*, SELECT
(select name from user_ u where mrc.mod_user_id = u.id) as mod_user_name, mrc.*,
(select c.id from comment c where mrc.comment_id = c.id) as comment_user_id, (
(select name from user_ u, comment c where mrc.comment_id = c.id and u.id = c.creator_id) as comment_user_name, SELECT
(select content from comment c where mrc.comment_id = c.id) as comment_content, name
(select p.id from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_id, FROM
(select p.name from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_name, user_ u
(select co.id from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_id, WHERE
(select co.name from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_name mrc.mod_user_id = u.id) AS mod_user_name,
from mod_remove_comment mrc; (
SELECT
c.id
FROM
comment c
WHERE
mrc.comment_id = c.id) AS comment_user_id,
(
SELECT
name
FROM
user_ u,
comment c
WHERE
mrc.comment_id = c.id
AND u.id = c.creator_id) AS comment_user_name,
(
SELECT
content
FROM
comment c
WHERE
mrc.comment_id = c.id) AS comment_content,
(
SELECT
p.id
FROM
post p,
comment c
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id) AS post_id,
(
SELECT
p.name
FROM
post p,
comment c
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id) AS post_name,
(
SELECT
co.id
FROM
comment c,
post p,
community co
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id
AND p.community_id = co.id) AS community_id,
(
SELECT
co.name
FROM
comment c,
post p,
community co
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id
AND p.community_id = co.id) AS community_name
FROM
mod_remove_comment mrc;
create view mod_remove_community_view as CREATE VIEW mod_remove_community_view AS
select mrc.*, SELECT
(select name from user_ u where mrc.mod_user_id = u.id) as mod_user_name, mrc.*,
(select c.name from community c where mrc.community_id = c.id) as community_name (
from mod_remove_community mrc; SELECT
name
FROM
user_ u
WHERE
mrc.mod_user_id = u.id) AS mod_user_name,
(
SELECT
c.name
FROM
community c
WHERE
mrc.community_id = c.id) AS community_name
FROM
mod_remove_community mrc;
create view mod_ban_from_community_view as CREATE VIEW mod_ban_from_community_view AS
select mb.*, SELECT
(select name from user_ u where mb.mod_user_id = u.id) as mod_user_name, mb.*,
(select name from user_ u where mb.other_user_id = u.id) as other_user_name, (
(select name from community c where mb.community_id = c.id) as community_name SELECT
from mod_ban_from_community mb; name
FROM
user_ u
WHERE
mb.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
user_ u
WHERE
mb.other_user_id = u.id) AS other_user_name,
(
SELECT
name
FROM
community c
WHERE
mb.community_id = c.id) AS community_name
FROM
mod_ban_from_community mb;
create view mod_ban_view as CREATE VIEW mod_ban_view AS
select mb.*, SELECT
(select name from user_ u where mb.mod_user_id = u.id) as mod_user_name, mb.*,
(select name from user_ u where mb.other_user_id = u.id) as other_user_name (
from mod_ban mb; SELECT
name
FROM
user_ u
WHERE
mb.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
user_ u
WHERE
mb.other_user_id = u.id) AS other_user_name
FROM
mod_ban mb;
create view mod_add_community_view as CREATE VIEW mod_add_community_view AS
select ma.*, SELECT
(select name from user_ u where ma.mod_user_id = u.id) as mod_user_name, ma.*,
(select name from user_ u where ma.other_user_id = u.id) as other_user_name, (
(select name from community c where ma.community_id = c.id) as community_name SELECT
from mod_add_community ma; name
FROM
user_ u
WHERE
ma.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
user_ u
WHERE
ma.other_user_id = u.id) AS other_user_name,
(
SELECT
name
FROM
community c
WHERE
ma.community_id = c.id) AS community_name
FROM
mod_add_community ma;
CREATE VIEW mod_add_view AS
SELECT
ma.*,
(
SELECT
name
FROM
user_ u
WHERE
ma.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
user_ u
WHERE
ma.other_user_id = u.id) AS other_user_name
FROM
mod_add ma;
create view mod_add_view as
select ma.*,
(select name from user_ u where ma.mod_user_id = u.id) as mod_user_name,
(select name from user_ u where ma.other_user_id = u.id) as other_user_name
from mod_add ma;

View file

@ -1,137 +1,293 @@
drop view reply_view; DROP VIEW reply_view;
drop view comment_view;
drop view community_view;
drop view post_view;
alter table community drop column deleted;
alter table post drop column deleted;
alter table comment drop column deleted;
create view community_view as DROP VIEW comment_view;
with all_community as
( DROP VIEW community_view;
select *,
(select name from user_ u where c.creator_id = u.id) as creator_name, DROP VIEW post_view;
(select name from category ct where c.category_id = ct.id) as category_name,
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, ALTER TABLE community
(select count(*) from post p where p.community_id = c.id) as number_of_posts, DROP COLUMN deleted;
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments
from community c ALTER TABLE post
DROP COLUMN deleted;
ALTER TABLE comment
DROP COLUMN deleted;
CREATE VIEW community_view AS
with all_community AS (
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
c.creator_id = u.id) AS creator_name,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments
FROM
community c
) )
SELECT
select
ac.*,
u.id as user_id,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed
from user_ u
cross join all_community ac
union all
select
ac.*,
null as user_id,
null as subscribed
from all_community ac
;
create or replace view post_view as
with all_post as
(
select
p.*,
(select name from user_ where p.creator_id = user_.id) as creator_name,
(select name from community where p.community_id = community.id) as community_name,
(select removed from community c where p.community_id = c.id) as community_removed,
(select count(*) from comment where comment.post_id = p.id) as number_of_comments,
coalesce(sum(pl.score), 0) as score,
count (case when pl.score = 1 then 1 else null end) as upvotes,
count (case when pl.score = -1 then 1 else null end) as downvotes,
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank
from post p
left join post_like pl on p.id = pl.post_id
group by p.id
)
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;
create view comment_view as
with all_comment as
(
select
c.*,
(select community_id from post p where p.id = c.post_id),
(select u.banned from user_ u where c.creator_id = u.id) as banned,
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community,
(select name from user_ where c.creator_id = user_.id) as creator_name,
coalesce(sum(cl.score), 0) as score,
count (case when cl.score = 1 then 1 else null end) as upvotes,
count (case when cl.score = -1 then 1 else null end) as downvotes
from comment c
left join comment_like cl on c.id = cl.comment_id
group by c.id
)
select
ac.*,
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved
from user_ u
cross join all_comment ac
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id
union all
select
ac.*, ac.*,
null as user_id, u.id AS user_id,
null as my_vote, (
null as saved SELECT
from all_comment ac cf.id::boolean
; FROM
community_follower cf
WHERE
u.id = cf.user_id
AND ac.id = cf.community_id) AS subscribed
FROM
user_ u
CROSS JOIN all_community ac
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
create view reply_view as CREATE OR REPLACE VIEW post_view AS
with closereply as ( with all_post AS (
select SELECT
c2.id, p.*,
c2.creator_id as sender_id, (
c.creator_id as recipient_id SELECT
from comment c name
inner join comment c2 on c.id = c2.parent_id FROM
where c2.creator_id != c.creator_id user_
-- Do union where post is null WHERE
union p.creator_id = user_.id) AS creator_name,
select (
c.id, SELECT
c.creator_id as sender_id, name
p.creator_id as recipient_id FROM
from comment c, post p community
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
select cv.*, SELECT
closereply.recipient_id ap.*,
from comment_view cv, closereply u.id AS user_id,
where closereply.id = cv.id coalesce(pl.score, 0) AS my_vote,
; (
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
CREATE VIEW comment_view AS
with all_comment AS (
SELECT
c.*,
(
SELECT
community_id
FROM
post p
WHERE
p.id = c.post_id),
(
SELECT
u.banned
FROM
user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id
)
SELECT
ac.*,
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
CREATE VIEW reply_view AS
with closereply AS (
SELECT
c2.id,
c2.creator_id AS sender_id,
c.creator_id AS recipient_id
FROM
comment c
INNER JOIN comment c2 ON c.id = c2.parent_id
WHERE
c2.creator_id != c.creator_id
-- Do union where post is null
UNION
SELECT
c.id,
c.creator_id AS sender_id,
p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
)
SELECT
cv.*,
closereply.recipient_id
FROM
comment_view cv,
closereply
WHERE
closereply.id = cv.id;

View file

@ -1,141 +1,301 @@
alter table community add column deleted boolean default false not null; ALTER TABLE community
alter table post add column deleted boolean default false not null; ADD COLUMN deleted boolean DEFAULT FALSE NOT NULL;
alter table comment add column deleted boolean default false not null;
ALTER TABLE post
ADD COLUMN deleted boolean DEFAULT FALSE NOT NULL;
ALTER TABLE comment
ADD COLUMN deleted boolean DEFAULT FALSE NOT NULL;
-- The views -- The views
drop view community_view; DROP VIEW community_view;
create view community_view as CREATE VIEW community_view AS
with all_community as with all_community AS (
( SELECT
select *, *,
(select name from user_ u where c.creator_id = u.id) as creator_name, (
(select name from category ct where c.category_id = ct.id) as category_name, SELECT
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, name
(select count(*) from post p where p.community_id = c.id) as number_of_posts, FROM
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments user_ u
from community c WHERE
c.creator_id = u.id) AS creator_name,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments
FROM
community c
) )
SELECT
select
ac.*,
u.id as user_id,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed
from user_ u
cross join all_community ac
union all
select
ac.*,
null as user_id,
null as subscribed
from all_community ac
;
drop view post_view;
create view post_view as
with all_post as
(
select
p.*,
(select name from user_ where p.creator_id = user_.id) as creator_name,
(select name from community where p.community_id = community.id) as community_name,
(select removed from community c where p.community_id = c.id) as community_removed,
(select deleted from community c where p.community_id = c.id) as community_deleted,
(select count(*) from comment where comment.post_id = p.id) as number_of_comments,
coalesce(sum(pl.score), 0) as score,
count (case when pl.score = 1 then 1 else null end) as upvotes,
count (case when pl.score = -1 then 1 else null end) as downvotes,
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank
from post p
left join post_like pl on p.id = pl.post_id
group by p.id
)
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;
drop view reply_view;
drop view comment_view;
create view comment_view as
with all_comment as
(
select
c.*,
(select community_id from post p where p.id = c.post_id),
(select u.banned from user_ u where c.creator_id = u.id) as banned,
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community,
(select name from user_ where c.creator_id = user_.id) as creator_name,
coalesce(sum(cl.score), 0) as score,
count (case when cl.score = 1 then 1 else null end) as upvotes,
count (case when cl.score = -1 then 1 else null end) as downvotes
from comment c
left join comment_like cl on c.id = cl.comment_id
group by c.id
)
select
ac.*,
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved
from user_ u
cross join all_comment ac
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id
union all
select
ac.*, ac.*,
null as user_id, u.id AS user_id,
null as my_vote, (
null as saved SELECT
from all_comment ac cf.id::boolean
; FROM
community_follower cf
WHERE
u.id = cf.user_id
AND ac.id = cf.community_id) AS subscribed
FROM
user_ u
CROSS JOIN all_community ac
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
create view reply_view as DROP VIEW post_view;
with closereply as (
select CREATE VIEW post_view AS
c2.id, with all_post AS (
c2.creator_id as sender_id, SELECT
c.creator_id as recipient_id p.*,
from comment c (
inner join comment c2 on c.id = c2.parent_id SELECT
where c2.creator_id != c.creator_id name
-- Do union where post is null FROM
union user_
select WHERE
c.id, p.creator_id = user_.id) AS creator_name,
c.creator_id as sender_id, (
p.creator_id as recipient_id SELECT
from comment c, post p name
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
select cv.*, SELECT
closereply.recipient_id ap.*,
from comment_view cv, closereply u.id AS user_id,
where closereply.id = cv.id coalesce(pl.score, 0) AS my_vote,
; (
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
DROP VIEW reply_view;
DROP VIEW comment_view;
CREATE VIEW comment_view AS
with all_comment AS (
SELECT
c.*,
(
SELECT
community_id
FROM
post p
WHERE
p.id = c.post_id),
(
SELECT
u.banned
FROM
user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id
)
SELECT
ac.*,
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
CREATE VIEW reply_view AS
with closereply AS (
SELECT
c2.id,
c2.creator_id AS sender_id,
c.creator_id AS recipient_id
FROM
comment c
INNER JOIN comment c2 ON c.id = c2.parent_id
WHERE
c2.creator_id != c.creator_id
-- Do union where post is null
UNION
SELECT
c.id,
c.creator_id AS sender_id,
p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
)
SELECT
cv.*,
closereply.recipient_id
FROM
comment_view cv,
closereply
WHERE
closereply.id = cv.id;

View file

@ -1,28 +1,68 @@
drop view community_view; DROP VIEW community_view;
create view community_view as
with all_community as CREATE VIEW community_view AS
( with all_community AS (
select *, SELECT
(select name from user_ u where c.creator_id = u.id) as creator_name, *,
(select name from category ct where c.category_id = ct.id) as category_name, (
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, SELECT
(select count(*) from post p where p.community_id = c.id) as number_of_posts, name
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments FROM
from community c user_ u
WHERE
c.creator_id = u.id) AS creator_name,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments
FROM
community c
) )
SELECT
ac.*,
u.id AS user_id,
(
SELECT
cf.id::boolean
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND ac.id = cf.community_id) AS subscribed
FROM
user_ u
CROSS JOIN all_community ac
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
select
ac.*,
u.id as user_id,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed
from user_ u
cross join all_community ac
union all
select
ac.*,
null as user_id,
null as subscribed
from all_community ac
;

View file

@ -1,29 +1,74 @@
drop view community_view; DROP VIEW community_view;
create view community_view as
with all_community as CREATE VIEW community_view AS
( with all_community AS (
select *, SELECT
(select name from user_ u where c.creator_id = u.id) as creator_name, *,
(select name from category ct where c.category_id = ct.id) as category_name, (
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, SELECT
(select count(*) from post p where p.community_id = c.id) as number_of_posts, name
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, FROM
hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank user_ u
from community c WHERE
c.creator_id = u.id) AS creator_name,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments,
hot_rank ((
SELECT
count(*)
FROM community_follower cf
WHERE
cf.community_id = c.id), c.published) AS hot_rank
FROM
community c
) )
SELECT
ac.*,
u.id AS user_id,
(
SELECT
cf.id::boolean
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND ac.id = cf.community_id) AS subscribed
FROM
user_ u
CROSS JOIN all_community ac
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
select
ac.*,
u.id as user_id,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed
from user_ u
cross join all_community ac
union all
select
ac.*,
null as user_id,
null as subscribed
from all_community ac
;

View file

@ -1 +1,3 @@
insert into user_ (name, fedi_name, password_encrypted) values ('admin', 'TBD', 'TBD'); INSERT INTO user_ (name, fedi_name, password_encrypted)
VALUES ('admin', 'TBD', 'TBD');

View file

@ -1 +1,3 @@
delete from user_ where name like 'admin'; DELETE FROM user_
WHERE name LIKE 'admin';

View file

@ -1,80 +1,190 @@
drop view community_view; DROP VIEW community_view;
drop view post_view;
alter table community drop column nsfw; DROP VIEW post_view;
alter table post drop column nsfw;
alter table user_ drop column show_nsfw; ALTER TABLE community
DROP COLUMN nsfw;
ALTER TABLE post
DROP COLUMN nsfw;
ALTER TABLE user_
DROP COLUMN show_nsfw;
-- the views -- the views
create view community_view as CREATE VIEW community_view AS
with all_community as with all_community AS (
( SELECT
select *, *,
(select name from user_ u where c.creator_id = u.id) as creator_name, (
(select name from category ct where c.category_id = ct.id) as category_name, SELECT
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, name
(select count(*) from post p where p.community_id = c.id) as number_of_posts, FROM
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, user_ u
hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank WHERE
from community c c.creator_id = u.id) AS creator_name,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments,
hot_rank ((
SELECT
count(*)
FROM community_follower cf
WHERE
cf.community_id = c.id), c.published) AS hot_rank
FROM
community c
) )
SELECT
select ac.*,
ac.*, u.id AS user_id,
u.id as user_id, (
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed SELECT
from user_ u cf.id::boolean
cross join all_community ac FROM
community_follower cf
union all WHERE
u.id = cf.user_id
select AND ac.id = cf.community_id) AS subscribed
ac.*, FROM
null as user_id, user_ u
null as subscribed CROSS JOIN all_community ac
from all_community ac UNION ALL
; SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
-- Post view -- Post view
create view post_view as CREATE VIEW post_view AS
with all_post as with all_post AS (
( SELECT
select p.*,
p.*, (
(select name from user_ where p.creator_id = user_.id) as creator_name, SELECT
(select name from community where p.community_id = community.id) as community_name, name
(select removed from community c where p.community_id = c.id) as community_removed, FROM
(select deleted from community c where p.community_id = c.id) as community_deleted, user_
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, WHERE
coalesce(sum(pl.score), 0) as score, p.creator_id = user_.id) AS creator_name,
count (case when pl.score = 1 then 1 else null end) as upvotes, (
count (case when pl.score = -1 then 1 else null end) as downvotes, SELECT
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank name
from post p FROM
left join post_like pl on p.id = pl.post_id community
group by p.id WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
select ap.*,
ap.*, u.id AS user_id,
u.id as user_id, coalesce(pl.score, 0) AS my_vote,
coalesce(pl.score, 0) as my_vote, (
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, SELECT
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, cf.id::bool
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved FROM
from user_ u community_follower cf
cross join all_post ap WHERE
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
union all (
SELECT
select pr.id::bool
ap.*, FROM
null as user_id, post_read pr
null as my_vote, WHERE
null as subscribed, u.id = pr.user_id
null as read, AND pr.post_id = ap.id) AS read,
null as saved (
from all_post ap SELECT
; ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;

View file

@ -1,79 +1,197 @@
alter table community add column nsfw boolean default false not null; ALTER TABLE community
alter table post add column nsfw boolean default false not null; ADD COLUMN nsfw boolean DEFAULT FALSE NOT NULL;
alter table user_ add column show_nsfw boolean default false not null;
ALTER TABLE post
ADD COLUMN nsfw boolean DEFAULT FALSE NOT NULL;
ALTER TABLE user_
ADD COLUMN show_nsfw boolean DEFAULT FALSE NOT NULL;
-- The views -- The views
drop view community_view; DROP VIEW community_view;
create view community_view as
with all_community as CREATE VIEW community_view AS
( with all_community AS (
select *, SELECT
(select name from user_ u where c.creator_id = u.id) as creator_name, *,
(select name from category ct where c.category_id = ct.id) as category_name, (
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, SELECT
(select count(*) from post p where p.community_id = c.id) as number_of_posts, name
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, FROM
hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank user_ u
from community c WHERE
c.creator_id = u.id) AS creator_name,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments,
hot_rank ((
SELECT
count(*)
FROM community_follower cf
WHERE
cf.community_id = c.id), c.published) AS hot_rank
FROM
community c
) )
SELECT
select ac.*,
ac.*, u.id AS user_id,
u.id as user_id, (
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed SELECT
from user_ u cf.id::boolean
cross join all_community ac FROM
community_follower cf
union all WHERE
u.id = cf.user_id
select AND ac.id = cf.community_id) AS subscribed
ac.*, FROM
null as user_id, user_ u
null as subscribed CROSS JOIN all_community ac
from all_community ac UNION ALL
; SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
-- Post view -- Post view
drop view post_view; DROP VIEW post_view;
create view post_view as
with all_post as CREATE VIEW post_view AS
( with all_post AS (
select SELECT
p.*, p.*,
(select name from user_ where p.creator_id = user_.id) as creator_name, (
(select name from community where p.community_id = community.id) as community_name, SELECT
(select removed from community c where p.community_id = c.id) as community_removed, name
(select deleted from community c where p.community_id = c.id) as community_deleted, FROM
(select nsfw from community c where p.community_id = c.id) as community_nsfw, user_
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, WHERE
coalesce(sum(pl.score), 0) as score, p.creator_id = user_.id) AS creator_name,
count (case when pl.score = 1 then 1 else null end) as upvotes, (
count (case when pl.score = -1 then 1 else null end) as downvotes, SELECT
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank name
from post p FROM
left join post_like pl on p.id = pl.post_id community
group by p.id WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
ap.*,
u.id AS user_id,
coalesce(pl.score, 0) AS my_vote,
(
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;

View file

@ -1,9 +1,30 @@
drop view site_view; DROP VIEW site_view;
CREATE VIEW site_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_name,
(
SELECT
count(*)
FROM
user_) AS number_of_users,
(
SELECT
count(*)
FROM
post) AS number_of_posts,
(
SELECT
count(*)
FROM
comment) AS number_of_comments
FROM
site s;
create view site_view as
select *,
(select name from user_ u where s.creator_id = u.id) as creator_name,
(select count(*) from user_) as number_of_users,
(select count(*) from post) as number_of_posts,
(select count(*) from comment) as number_of_comments
from site s;

View file

@ -1,10 +1,35 @@
drop view site_view; DROP VIEW site_view;
CREATE VIEW site_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_name,
(
SELECT
count(*)
FROM
user_) AS number_of_users,
(
SELECT
count(*)
FROM
post) AS number_of_posts,
(
SELECT
count(*)
FROM
comment) AS number_of_comments,
(
SELECT
count(*)
FROM
community) AS number_of_communities
FROM
site s;
create view site_view as
select *,
(select name from user_ u where s.creator_id = u.id) as creator_name,
(select count(*) from user_) as number_of_users,
(select count(*) from post) as number_of_posts,
(select count(*) from comment) as number_of_comments,
(select count(*) from community) as number_of_communities
from site s;

View file

@ -1,44 +1,113 @@
-- Post view -- Post view
drop view post_view; DROP VIEW post_view;
create view post_view as
with all_post as CREATE VIEW post_view AS
( with all_post AS (
select SELECT
p.*, p.*,
(select name from user_ where p.creator_id = user_.id) as creator_name, (
(select name from community where p.community_id = community.id) as community_name, SELECT
(select removed from community c where p.community_id = c.id) as community_removed, name
(select deleted from community c where p.community_id = c.id) as community_deleted, FROM
(select nsfw from community c where p.community_id = c.id) as community_nsfw, user_
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, WHERE
coalesce(sum(pl.score), 0) as score, p.creator_id = user_.id) AS creator_name,
count (case when pl.score = 1 then 1 else null end) as upvotes, (
count (case when pl.score = -1 then 1 else null end) as downvotes, SELECT
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank name
from post p FROM
left join post_like pl on p.id = pl.post_id community
group by p.id WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
ap.*,
u.id AS user_id,
coalesce(pl.score, 0) AS my_vote,
(
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;

View file

@ -1,47 +1,128 @@
-- Create post view, adding banned_from_community -- Create post view, adding banned_from_community
DROP VIEW post_view;
drop view post_view; CREATE VIEW post_view AS
create view post_view as with all_post AS (
with all_post as SELECT
( p.*,
select (
p.*, SELECT
(select u.banned from user_ u where p.creator_id = u.id) as banned, u.banned
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, FROM
(select name from user_ where p.creator_id = user_.id) as creator_name, user_ u
(select name from community where p.community_id = community.id) as community_name, WHERE
(select removed from community c where p.community_id = c.id) as community_removed, p.creator_id = u.id) AS banned,
(select deleted from community c where p.community_id = c.id) as community_deleted, (
(select nsfw from community c where p.community_id = c.id) as community_nsfw, SELECT
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, cb.id::bool
coalesce(sum(pl.score), 0) as score, FROM
count (case when pl.score = 1 then 1 else null end) as upvotes, community_user_ban cb
count (case when pl.score = -1 then 1 else null end) as downvotes, WHERE
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank p.creator_id = cb.user_id
from post p AND p.community_id = cb.community_id) AS banned_from_community,
left join post_like pl on p.id = pl.post_id (
group by p.id SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
ap.*,
u.id AS user_id,
coalesce(pl.score, 0) AS my_vote,
(
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;

View file

@ -1,50 +1,134 @@
drop view post_view; DROP VIEW post_view;
drop view mod_sticky_post_view;
alter table post drop column stickied;
drop table mod_sticky_post; DROP VIEW mod_sticky_post_view;
create view post_view as ALTER TABLE post
with all_post as DROP COLUMN stickied;
(
select DROP TABLE mod_sticky_post;
p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, CREATE VIEW post_view AS
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, with all_post AS (
(select name from user_ where p.creator_id = user_.id) as creator_name, SELECT
(select name from community where p.community_id = community.id) as community_name, p.*,
(select removed from community c where p.community_id = c.id) as community_removed, (
(select deleted from community c where p.community_id = c.id) as community_deleted, SELECT
(select nsfw from community c where p.community_id = c.id) as community_nsfw, u.banned
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, FROM
coalesce(sum(pl.score), 0) as score, user_ u
count (case when pl.score = 1 then 1 else null end) as upvotes, WHERE
count (case when pl.score = -1 then 1 else null end) as downvotes, p.creator_id = u.id) AS banned,
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank (
from post p SELECT
left join post_like pl on p.id = pl.post_id cb.id::bool
group by p.id FROM
community_user_ban cb
WHERE
p.creator_id = cb.user_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
ap.*,
u.id AS user_id,
coalesce(pl.score, 0) AS my_vote,
(
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;

View file

@ -1,67 +1,180 @@
-- Add the column -- Add the column
alter table post add column stickied boolean default false not null; ALTER TABLE post
ADD COLUMN stickied boolean DEFAULT FALSE NOT NULL;
-- Add the mod table -- Add the mod table
create table mod_sticky_post ( CREATE TABLE mod_sticky_post (
id serial primary key, id serial PRIMARY KEY,
mod_user_id int references user_ on update cascade on delete cascade not null, mod_user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
post_id int references post on update cascade on delete cascade not null, post_id int REFERENCES post ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
stickied boolean default true, stickied boolean DEFAULT TRUE,
when_ timestamp not null default now() when_ timestamp NOT NULL DEFAULT now()
); );
-- Add mod view -- Add mod view
create view mod_sticky_post_view as CREATE VIEW mod_sticky_post_view AS
select msp.*, SELECT
(select name from user_ u where msp.mod_user_id = u.id) as mod_user_name, msp.*,
(select name from post p where msp.post_id = p.id) as post_name, (
(select c.id from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_id, SELECT
(select c.name from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_name name
from mod_sticky_post msp; FROM
user_ u
WHERE
msp.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
post p
WHERE
msp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
msp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
msp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_sticky_post msp;
-- Recreate the view -- Recreate the view
drop view post_view; DROP VIEW post_view;
create view post_view as
with all_post as CREATE VIEW post_view AS
( with all_post AS (
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select name from community where p.community_id = community.id) as community_name, FROM
(select removed from community c where p.community_id = c.id) as community_removed, user_ u
(select deleted from community c where p.community_id = c.id) as community_deleted, WHERE
(select nsfw from community c where p.community_id = c.id) as community_nsfw, p.creator_id = u.id) AS banned,
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, (
coalesce(sum(pl.score), 0) as score, SELECT
count (case when pl.score = 1 then 1 else null end) as upvotes, cb.id::bool
count (case when pl.score = -1 then 1 else null end) as downvotes, FROM
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank community_user_ban cb
from post p WHERE
left join post_like pl on p.id = pl.post_id p.creator_id = cb.user_id
group by p.id AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
ap.*,
u.id AS user_id,
coalesce(pl.score, 0) AS my_vote,
(
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
select
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all
select
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;

View file

@ -1 +1,3 @@
alter table user_ drop column theme; ALTER TABLE user_
DROP COLUMN theme;

View file

@ -1 +1,3 @@
alter table user_ add column theme varchar(20) default 'darkly' not null; ALTER TABLE user_
ADD COLUMN theme varchar(20) DEFAULT 'darkly' NOT NULL;

View file

@ -1,2 +1,4 @@
drop view user_mention_view; DROP VIEW user_mention_view;
drop table user_mention;
DROP TABLE user_mention;

View file

@ -1,16 +1,16 @@
create table user_mention ( CREATE TABLE user_mention (
id serial primary key, id serial PRIMARY KEY,
recipient_id int references user_ on update cascade on delete cascade not null, recipient_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
comment_id int references comment on update cascade on delete cascade not null, comment_id int REFERENCES COMMENT ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
read boolean default false not null, read boolean DEFAULT FALSE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
unique(recipient_id, comment_id) UNIQUE (recipient_id, comment_id)
); );
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.post_id, c.post_id,
c.parent_id, c.parent_id,
@ -31,5 +31,9 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id um.recipient_id
from user_mention um, comment_view c FROM
where um.comment_id = c.id; user_mention um,
comment_view c
WHERE
um.comment_id = c.id;

View file

@ -1,2 +1,6 @@
alter table user_ drop column default_sort_type; ALTER TABLE user_
alter table user_ drop column default_listing_type; DROP COLUMN default_sort_type;
ALTER TABLE user_
DROP COLUMN default_listing_type;

View file

@ -1,2 +1,6 @@
alter table user_ add column default_sort_type smallint default 0 not null; ALTER TABLE user_
alter table user_ add column default_listing_type smallint default 1 not null; ADD COLUMN default_sort_type smallint DEFAULT 0 NOT NULL;
ALTER TABLE user_
ADD COLUMN default_listing_type smallint DEFAULT 1 NOT NULL;

View file

@ -1 +1,2 @@
drop table password_reset_request; DROP TABLE password_reset_request;

View file

@ -1,6 +1,7 @@
create table password_reset_request ( CREATE TABLE password_reset_request (
id serial primary key, id serial PRIMARY KEY,
user_id int references user_ on update cascade on delete cascade not null, user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
token_encrypted text not null, token_encrypted text NOT NULL,
published timestamp not null default now() published timestamp NOT NULL DEFAULT now()
); );

View file

@ -1 +1,3 @@
alter table user_ drop column lang; ALTER TABLE user_
DROP COLUMN lang;

View file

@ -1 +1,3 @@
alter table user_ add column lang varchar(20) default 'browser' not null; ALTER TABLE user_
ADD COLUMN lang varchar(20) DEFAULT 'browser' NOT NULL;

View file

@ -1,16 +1,46 @@
-- Drop the columns -- Drop the columns
drop view site_view; DROP VIEW site_view;
alter table site drop column enable_downvotes;
alter table site drop column open_registration; ALTER TABLE site
alter table site drop column enable_nsfw; DROP COLUMN enable_downvotes;
ALTER TABLE site
DROP COLUMN open_registration;
ALTER TABLE site
DROP COLUMN enable_nsfw;
-- Rebuild the views -- Rebuild the views
CREATE VIEW site_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_name,
(
SELECT
count(*)
FROM
user_) AS number_of_users,
(
SELECT
count(*)
FROM
post) AS number_of_posts,
(
SELECT
count(*)
FROM
comment) AS number_of_comments,
(
SELECT
count(*)
FROM
community) AS number_of_communities
FROM
site s;
create view site_view as
select *,
(select name from user_ u where s.creator_id = u.id) as creator_name,
(select count(*) from user_) as number_of_users,
(select count(*) from post) as number_of_posts,
(select count(*) from comment) as number_of_comments,
(select count(*) from community) as number_of_communities
from site s;

View file

@ -1,16 +1,46 @@
-- Add the column -- Add the column
alter table site add column enable_downvotes boolean default true not null; ALTER TABLE site
alter table site add column open_registration boolean default true not null; ADD COLUMN enable_downvotes boolean DEFAULT TRUE NOT NULL;
alter table site add column enable_nsfw boolean default true not null;
ALTER TABLE site
ADD COLUMN open_registration boolean DEFAULT TRUE NOT NULL;
ALTER TABLE site
ADD COLUMN enable_nsfw boolean DEFAULT TRUE NOT NULL;
-- Reload the view -- Reload the view
drop view site_view; DROP VIEW site_view;
CREATE VIEW site_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_name,
(
SELECT
count(*)
FROM
user_) AS number_of_users,
(
SELECT
count(*)
FROM
post) AS number_of_posts,
(
SELECT
count(*)
FROM
comment) AS number_of_comments,
(
SELECT
count(*)
FROM
community) AS number_of_communities
FROM
site s;
create view site_view as
select *,
(select name from user_ u where s.creator_id = u.id) as creator_name,
(select count(*) from user_) as number_of_users,
(select count(*) from post) as number_of_posts,
(select count(*) from comment) as number_of_comments,
(select count(*) from community) as number_of_communities
from site s;

View file

@ -1,169 +1,380 @@
-- the views -- the views
drop view user_mention_view; DROP VIEW user_mention_view;
drop view reply_view;
drop view comment_view; DROP VIEW reply_view;
drop view user_view;
DROP VIEW comment_view;
DROP VIEW user_view;
-- user -- user
create view user_view as CREATE VIEW user_view AS
select id, SELECT
name, id,
fedi_name, name,
admin, fedi_name,
banned, admin,
published, banned,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, published,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, (
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, SELECT
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score count(*)
from user_ u; FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;
-- post -- post
-- Recreate the view -- Recreate the view
drop view post_view; DROP VIEW post_view;
create view post_view as
with all_post as CREATE VIEW post_view AS
( with all_post AS (
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select name from community where p.community_id = community.id) as community_name, FROM
(select removed from community c where p.community_id = c.id) as community_removed, user_ u
(select deleted from community c where p.community_id = c.id) as community_deleted, WHERE
(select nsfw from community c where p.community_id = c.id) as community_nsfw, p.creator_id = u.id) AS banned,
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, (
coalesce(sum(pl.score), 0) as score, SELECT
count (case when pl.score = 1 then 1 else null end) as upvotes, cb.id::bool
count (case when pl.score = -1 then 1 else null end) as downvotes, FROM
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank community_user_ban cb
from post p WHERE
left join post_like pl on p.id = pl.post_id p.creator_id = cb.user_id
group by p.id AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
select ap.*,
ap.*, u.id AS user_id,
u.id as user_id, coalesce(pl.score, 0) AS my_vote,
coalesce(pl.score, 0) as my_vote, (
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, SELECT
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, cf.id::bool
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved FROM
from user_ u community_follower cf
cross join all_post ap WHERE
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
union all (
SELECT
select pr.id::bool
ap.*, FROM
null as user_id, post_read pr
null as my_vote, WHERE
null as subscribed, u.id = pr.user_id
null as read, AND pr.post_id = ap.id) AS read,
null as saved (
from all_post ap SELECT
; ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
-- community -- community
DROP VIEW community_view;
drop view community_view; CREATE VIEW community_view AS
create view community_view as with all_community AS (
with all_community as SELECT
( *,
select *, (
(select name from user_ u where c.creator_id = u.id) as creator_name, SELECT
(select name from category ct where c.category_id = ct.id) as category_name, name
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, FROM
(select count(*) from post p where p.community_id = c.id) as number_of_posts, user_ u
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, WHERE
hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank c.creator_id = u.id) AS creator_name,
from community c (
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments,
hot_rank ((
SELECT
count(*)
FROM community_follower cf
WHERE
cf.community_id = c.id), c.published) AS hot_rank
FROM
community c
) )
SELECT
select ac.*,
ac.*, u.id AS user_id,
u.id as user_id, (
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed SELECT
from user_ u cf.id::boolean
cross join all_community ac FROM
community_follower cf
union all WHERE
u.id = cf.user_id
select AND ac.id = cf.community_id) AS subscribed
ac.*, FROM
null as user_id, user_ u
null as subscribed CROSS JOIN all_community ac
from all_community ac UNION ALL
; SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
-- Reply and comment view -- Reply and comment view
create view comment_view as CREATE VIEW comment_view AS
with all_comment as with all_comment AS (
( SELECT
select c.*,
c.*, (
(select community_id from post p where p.id = c.post_id), SELECT
(select u.banned from user_ u where c.creator_id = u.id) as banned, community_id
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, FROM
(select name from user_ where c.creator_id = user_.id) as creator_name, post p
coalesce(sum(cl.score), 0) as score, WHERE
count (case when cl.score = 1 then 1 else null end) as upvotes, p.id = c.post_id),
count (case when cl.score = -1 then 1 else null end) as downvotes (
from comment c SELECT
left join comment_like cl on c.id = cl.comment_id u.banned
group by c.id FROM
user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id
) )
SELECT
ac.*,
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
select CREATE VIEW reply_view AS
ac.*, with closereply AS (
u.id as user_id, SELECT
coalesce(cl.score, 0) as my_vote, c2.id,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved c2.creator_id AS sender_id,
from user_ u c.creator_id AS recipient_id
cross join all_comment ac FROM
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id comment c
INNER JOIN comment c2 ON c.id = c2.parent_id
union all WHERE
c2.creator_id != c.creator_id
select -- Do union where post is null
ac.*, UNION
null as user_id, SELECT
null as my_vote, c.id,
null as saved c.creator_id AS sender_id,
from all_comment ac p.creator_id AS recipient_id
; FROM
comment c,
create view reply_view as post p
with closereply as ( WHERE
select c.post_id = p.id
c2.id, AND c.parent_id IS NULL
c2.creator_id as sender_id, AND c.creator_id != p.creator_id
c.creator_id as recipient_id
from comment c
inner join comment c2 on c.id = c2.parent_id
where c2.creator_id != c.creator_id
-- Do union where post is null
union
select
c.id,
c.creator_id as sender_id,
p.creator_id as recipient_id
from comment c, post p
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_view cv,
closereply
WHERE
closereply.id = cv.id;
-- user mention -- user mention
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.post_id, c.post_id,
c.parent_id, c.parent_id,
@ -184,41 +395,117 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id um.recipient_id
from user_mention um, comment_view c FROM
where um.comment_id = c.id; user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
-- community tables -- community tables
drop view community_moderator_view; DROP VIEW community_moderator_view;
drop view community_follower_view;
drop view community_user_ban_view;
drop view site_view;
create view community_moderator_view as DROP VIEW community_follower_view;
select *,
(select name from user_ u where cm.user_id = u.id) as user_name,
(select name from community c where cm.community_id = c.id) as community_name
from community_moderator cm;
create view community_follower_view as DROP VIEW community_user_ban_view;
select *,
(select name from user_ u where cf.user_id = u.id) as user_name,
(select name from community c where cf.community_id = c.id) as community_name
from community_follower cf;
create view community_user_ban_view as DROP VIEW site_view;
select *,
(select name from user_ u where cm.user_id = u.id) as user_name,
(select name from community c where cm.community_id = c.id) as community_name
from community_user_ban cm;
create view site_view as CREATE VIEW community_moderator_view AS
select *, SELECT
(select name from user_ u where s.creator_id = u.id) as creator_name, *,
(select count(*) from user_) as number_of_users, (
(select count(*) from post) as number_of_posts, SELECT
(select count(*) from comment) as number_of_comments, name
(select count(*) from community) as number_of_communities FROM
from site s; user_ u
WHERE
cm.user_id = u.id) AS user_name,
(
SELECT
name
FROM
community c
WHERE
cm.community_id = c.id) AS community_name
FROM
community_moderator cm;
CREATE VIEW community_follower_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
cf.user_id = u.id) AS user_name,
(
SELECT
name
FROM
community c
WHERE
cf.community_id = c.id) AS community_name
FROM
community_follower cf;
CREATE VIEW community_user_ban_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
cm.user_id = u.id) AS user_name,
(
SELECT
name
FROM
community c
WHERE
cm.community_id = c.id) AS community_name
FROM
community_user_ban cm;
CREATE VIEW site_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_name,
(
SELECT
count(*)
FROM
user_) AS number_of_users,
(
SELECT
count(*)
FROM
post) AS number_of_posts,
(
SELECT
count(*)
FROM
comment) AS number_of_comments,
(
SELECT
count(*)
FROM
community) AS number_of_communities
FROM
site s;
ALTER TABLE user_ RENAME COLUMN avatar TO icon;
ALTER TABLE user_
ALTER COLUMN icon TYPE bytea
USING icon::bytea;
alter table user_ rename column avatar to icon;
alter table user_ alter column icon type bytea using icon::bytea;

View file

@ -1,177 +1,408 @@
-- Rename to avatar -- Rename to avatar
alter table user_ rename column icon to avatar; ALTER TABLE user_ RENAME COLUMN icon TO avatar;
alter table user_ alter column avatar type text;
ALTER TABLE user_
ALTER COLUMN avatar TYPE text;
-- Rebuild nearly all the views, to include the creator avatars -- Rebuild nearly all the views, to include the creator avatars
-- user -- user
drop view user_view; DROP VIEW user_view;
create view user_view as
select id, CREATE VIEW user_view AS
name, SELECT
avatar, id,
fedi_name, name,
admin, avatar,
banned, fedi_name,
published, admin,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, banned,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, published,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, (
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score SELECT
from user_ u; count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;
-- post -- post
-- Recreate the view -- Recreate the view
drop view post_view; DROP VIEW post_view;
create view post_view as
with all_post as CREATE VIEW post_view AS
( with all_post AS (
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank WHERE
from post p p.creator_id = cb.user_id
left join post_like pl on p.id = pl.post_id AND p.community_id = cb.community_id) AS banned_from_community,
group by p.id (
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_avatar,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
select ap.*,
ap.*, u.id AS user_id,
u.id as user_id, coalesce(pl.score, 0) AS my_vote,
coalesce(pl.score, 0) as my_vote, (
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, SELECT
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, cf.id::bool
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved FROM
from user_ u community_follower cf
cross join all_post ap WHERE
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
union all (
SELECT
select pr.id::bool
ap.*, FROM
null as user_id, post_read pr
null as my_vote, WHERE
null as subscribed, u.id = pr.user_id
null as read, AND pr.post_id = ap.id) AS read,
null as saved (
from all_post ap SELECT
; ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
-- community -- community
drop view community_view; DROP VIEW community_view;
create view community_view as
with all_community as CREATE VIEW community_view AS
( with all_community AS (
select *, SELECT
(select name from user_ u where c.creator_id = u.id) as creator_name, *,
(select avatar from user_ u where c.creator_id = u.id) as creator_avatar, (
(select name from category ct where c.category_id = ct.id) as category_name, SELECT
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, name
(select count(*) from post p where p.community_id = c.id) as number_of_posts, FROM
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, user_ u
hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank WHERE
from community c c.creator_id = u.id) AS creator_name,
(
SELECT
avatar
FROM
user_ u
WHERE
c.creator_id = u.id) AS creator_avatar,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments,
hot_rank ((
SELECT
count(*)
FROM community_follower cf
WHERE
cf.community_id = c.id), c.published) AS hot_rank
FROM
community c
) )
SELECT
select ac.*,
ac.*, u.id AS user_id,
u.id as user_id, (
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed SELECT
from user_ u cf.id::boolean
cross join all_community ac FROM
community_follower cf
union all WHERE
u.id = cf.user_id
select AND ac.id = cf.community_id) AS subscribed
ac.*, FROM
null as user_id, user_ u
null as subscribed CROSS JOIN all_community ac
from all_community ac UNION ALL
; SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
-- reply and comment view -- reply and comment view
drop view reply_view; DROP VIEW reply_view;
drop view user_mention_view;
drop view comment_view; DROP VIEW user_mention_view;
create view comment_view as
with all_comment as DROP VIEW comment_view;
(
select CREATE VIEW comment_view AS
c.*, with all_comment AS (
(select community_id from post p where p.id = c.post_id), SELECT
(select u.banned from user_ u where c.creator_id = u.id) as banned, c.*,
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, (
(select name from user_ where c.creator_id = user_.id) as creator_name, SELECT
(select avatar from user_ where c.creator_id = user_.id) as creator_avatar, community_id
coalesce(sum(cl.score), 0) as score, FROM
count (case when cl.score = 1 then 1 else null end) as upvotes, post p
count (case when cl.score = -1 then 1 else null end) as downvotes WHERE
from comment c p.id = c.post_id),
left join comment_like cl on c.id = cl.comment_id (
group by c.id SELECT
u.banned
FROM
user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_avatar,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id
) )
SELECT
ac.*,
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
select CREATE VIEW reply_view AS
ac.*, with closereply AS (
u.id as user_id, SELECT
coalesce(cl.score, 0) as my_vote, c2.id,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved c2.creator_id AS sender_id,
from user_ u c.creator_id AS recipient_id
cross join all_comment ac FROM
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id comment c
INNER JOIN comment c2 ON c.id = c2.parent_id
union all WHERE
c2.creator_id != c.creator_id
select -- Do union where post is null
ac.*, UNION
null as user_id, SELECT
null as my_vote, c.id,
null as saved c.creator_id AS sender_id,
from all_comment ac p.creator_id AS recipient_id
; FROM
comment c,
create view reply_view as post p
with closereply as ( WHERE
select c.post_id = p.id
c2.id, AND c.parent_id IS NULL
c2.creator_id as sender_id, AND c.creator_id != p.creator_id
c.creator_id as recipient_id
from comment c
inner join comment c2 on c.id = c2.parent_id
where c2.creator_id != c.creator_id
-- Do union where post is null
union
select
c.id,
c.creator_id as sender_id,
p.creator_id as recipient_id
from comment c, post p
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_view cv,
closereply
WHERE
closereply.id = cv.id;
-- user mention -- user mention
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.post_id, c.post_id,
c.parent_id, c.parent_id,
@ -193,42 +424,136 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id um.recipient_id
from user_mention um, comment_view c FROM
where um.comment_id = c.id; user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
-- community views -- community views
drop view community_moderator_view; DROP VIEW community_moderator_view;
drop view community_follower_view;
drop view community_user_ban_view;
drop view site_view;
create view community_moderator_view as DROP VIEW community_follower_view;
select *,
(select name from user_ u where cm.user_id = u.id) as user_name,
(select avatar from user_ u where cm.user_id = u.id),
(select name from community c where cm.community_id = c.id) as community_name
from community_moderator cm;
create view community_follower_view as DROP VIEW community_user_ban_view;
select *,
(select name from user_ u where cf.user_id = u.id) as user_name,
(select avatar from user_ u where cf.user_id = u.id),
(select name from community c where cf.community_id = c.id) as community_name
from community_follower cf;
create view community_user_ban_view as DROP VIEW site_view;
select *,
(select name from user_ u where cm.user_id = u.id) as user_name, CREATE VIEW community_moderator_view AS
(select avatar from user_ u where cm.user_id = u.id), SELECT
(select name from community c where cm.community_id = c.id) as community_name *,
from community_user_ban cm; (
SELECT
name
FROM
user_ u
WHERE
cm.user_id = u.id) AS user_name,
(
SELECT
avatar
FROM
user_ u
WHERE
cm.user_id = u.id), (
SELECT
name
FROM
community c
WHERE
cm.community_id = c.id) AS community_name
FROM
community_moderator cm;
CREATE VIEW community_follower_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
cf.user_id = u.id) AS user_name,
(
SELECT
avatar
FROM
user_ u
WHERE
cf.user_id = u.id), (
SELECT
name
FROM
community c
WHERE
cf.community_id = c.id) AS community_name
FROM
community_follower cf;
CREATE VIEW community_user_ban_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
cm.user_id = u.id) AS user_name,
(
SELECT
avatar
FROM
user_ u
WHERE
cm.user_id = u.id), (
SELECT
name
FROM
community c
WHERE
cm.community_id = c.id) AS community_name
FROM
community_user_ban cm;
CREATE VIEW site_view AS
SELECT
*,
(
SELECT
name
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_name,
(
SELECT
avatar
FROM
user_ u
WHERE
s.creator_id = u.id) AS creator_avatar,
(
SELECT
count(*)
FROM
user_) AS number_of_users,
(
SELECT
count(*)
FROM
post) AS number_of_posts,
(
SELECT
count(*)
FROM
comment) AS number_of_comments,
(
SELECT
count(*)
FROM
community) AS number_of_communities
FROM
site s;
create view site_view as
select *,
(select name from user_ u where s.creator_id = u.id) as creator_name,
(select avatar from user_ u where s.creator_id = u.id) as creator_avatar,
(select count(*) from user_) as number_of_users,
(select count(*) from post) as number_of_posts,
(select count(*) from comment) as number_of_comments,
(select count(*) from community) as number_of_communities
from site s;

View file

@ -1,15 +1,47 @@
-- user -- user
drop view user_view; DROP VIEW user_view;
create view user_view as
select id, CREATE VIEW user_view AS
name, SELECT
avatar, id,
fedi_name, name,
admin, avatar,
banned, fedi_name,
published, admin,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, banned,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, published,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, (
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score SELECT
from user_ u; count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;

View file

@ -1,16 +1,48 @@
-- user -- user
drop view user_view; DROP VIEW user_view;
create view user_view as
select id, CREATE VIEW user_view AS
name, SELECT
avatar, id,
email, name,
fedi_name, avatar,
admin, email,
banned, fedi_name,
published, admin,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, banned,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, published,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, (
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score SELECT
from user_ u; count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;

View file

@ -1,20 +1,55 @@
-- Drop the columns -- Drop the columns
drop view user_view; DROP VIEW user_view;
alter table user_ drop column show_avatars;
alter table user_ drop column send_notifications_to_email; ALTER TABLE user_
DROP COLUMN show_avatars;
ALTER TABLE user_
DROP COLUMN send_notifications_to_email;
-- Rebuild the view -- Rebuild the view
create view user_view as CREATE VIEW user_view AS
select id, SELECT
name, id,
avatar, name,
email, avatar,
fedi_name, email,
admin, fedi_name,
banned, admin,
published, banned,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, published,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, (
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, SELECT
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score count(*)
from user_ u; FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;

View file

@ -1,22 +1,57 @@
-- Add columns -- Add columns
alter table user_ add column show_avatars boolean default true not null; ALTER TABLE user_
alter table user_ add column send_notifications_to_email boolean default false not null; ADD COLUMN show_avatars boolean DEFAULT TRUE NOT NULL;
ALTER TABLE user_
ADD COLUMN send_notifications_to_email boolean DEFAULT FALSE NOT NULL;
-- Rebuild the user_view -- Rebuild the user_view
drop view user_view; DROP VIEW user_view;
create view user_view as
select id, CREATE VIEW user_view AS
name, SELECT
avatar, id,
email, name,
fedi_name, avatar,
admin, email,
banned, fedi_name,
show_avatars, admin,
send_notifications_to_email, banned,
published, show_avatars,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, send_notifications_to_email,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, published,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, (
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score SELECT
from user_ u; count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;

View file

@ -1,16 +1,24 @@
drop index idx_post_creator; DROP INDEX idx_post_creator;
drop index idx_post_community;
drop index idx_post_like_post; DROP INDEX idx_post_community;
drop index idx_post_like_user;
drop index idx_comment_creator; DROP INDEX idx_post_like_post;
drop index idx_comment_parent;
drop index idx_comment_post;
drop index idx_comment_like_comment; DROP INDEX idx_post_like_user;
drop index idx_comment_like_user;
drop index idx_comment_like_post; DROP INDEX idx_comment_creator;
DROP INDEX idx_comment_parent;
DROP INDEX idx_comment_post;
DROP INDEX idx_comment_like_comment;
DROP INDEX idx_comment_like_user;
DROP INDEX idx_comment_like_post;
DROP INDEX idx_community_creator;
DROP INDEX idx_community_category;
drop index idx_community_creator;
drop index idx_community_category;

View file

@ -1,17 +1,25 @@
-- Go through all the tables joins, optimize every view, CTE, etc. -- Go through all the tables joins, optimize every view, CTE, etc.
create index idx_post_creator on post (creator_id); CREATE INDEX idx_post_creator ON post (creator_id);
create index idx_post_community on post (community_id);
create index idx_post_like_post on post_like (post_id); CREATE INDEX idx_post_community ON post (community_id);
create index idx_post_like_user on post_like (user_id);
create index idx_comment_creator on comment (creator_id); CREATE INDEX idx_post_like_post ON post_like (post_id);
create index idx_comment_parent on comment (parent_id);
create index idx_comment_post on comment (post_id);
create index idx_comment_like_comment on comment_like (comment_id); CREATE INDEX idx_post_like_user ON post_like (user_id);
create index idx_comment_like_user on comment_like (user_id);
create index idx_comment_like_post on comment_like (post_id); CREATE INDEX idx_comment_creator ON comment (creator_id);
CREATE INDEX idx_comment_parent ON comment (parent_id);
CREATE INDEX idx_comment_post ON comment (post_id);
CREATE INDEX idx_comment_like_comment ON comment_like (comment_id);
CREATE INDEX idx_comment_like_user ON comment_like (user_id);
CREATE INDEX idx_comment_like_post ON comment_like (post_id);
CREATE INDEX idx_community_creator ON community (creator_id);
CREATE INDEX idx_community_category ON community (category_id);
create index idx_community_creator on community (creator_id);
create index idx_community_category on community (category_id);

View file

@ -1,202 +1,457 @@
-- functions and triggers -- functions and triggers
drop trigger refresh_user on user_; DROP TRIGGER refresh_user ON user_;
drop function refresh_user();
drop trigger refresh_post on post; DROP FUNCTION refresh_user ();
drop function refresh_post();
drop trigger refresh_post_like on post_like; DROP TRIGGER refresh_post ON post;
drop function refresh_post_like();
drop trigger refresh_community on community; DROP FUNCTION refresh_post ();
drop function refresh_community();
drop trigger refresh_community_follower on community_follower; DROP TRIGGER refresh_post_like ON post_like;
drop function refresh_community_follower();
drop trigger refresh_community_user_ban on community_user_ban; DROP FUNCTION refresh_post_like ();
drop function refresh_community_user_ban();
drop trigger refresh_comment on comment; DROP TRIGGER refresh_community ON community;
drop function refresh_comment();
drop trigger refresh_comment_like on comment_like; DROP FUNCTION refresh_community ();
drop function refresh_comment_like();
DROP TRIGGER refresh_community_follower ON community_follower;
DROP FUNCTION refresh_community_follower ();
DROP TRIGGER refresh_community_user_ban ON community_user_ban;
DROP FUNCTION refresh_community_user_ban ();
DROP TRIGGER refresh_comment ON comment;
DROP FUNCTION refresh_comment ();
DROP TRIGGER refresh_comment_like ON comment_like;
DROP FUNCTION refresh_comment_like ();
-- post -- post
-- Recreate the view -- Recreate the view
drop view post_view; DROP VIEW post_view;
create view post_view as
with all_post as CREATE VIEW post_view AS
( with all_post AS (
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank WHERE
from post p p.creator_id = cb.user_id
left join post_like pl on p.id = pl.post_id AND p.community_id = cb.community_id) AS banned_from_community,
group by p.id (
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_avatar,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id
) )
SELECT
ap.*,
u.id AS user_id,
coalesce(pl.score, 0) AS my_vote,
(
SELECT
cf.id::bool
FROM
community_follower cf
WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
select DROP VIEW post_mview;
ap.*,
u.id as user_id,
coalesce(pl.score, 0) as my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed,
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read,
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved
from user_ u
cross join all_post ap
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id
union all DROP MATERIALIZED VIEW post_aggregates_mview;
select DROP VIEW post_aggregates_view;
ap.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from all_post ap
;
drop view post_mview;
drop materialized view post_aggregates_mview;
drop view post_aggregates_view;
-- user -- user
drop materialized view user_mview; DROP MATERIALIZED VIEW user_mview;
drop view user_view;
create view user_view as DROP VIEW user_view;
select id,
name, CREATE VIEW user_view AS
avatar, SELECT
email, id,
fedi_name, name,
admin, avatar,
banned, email,
show_avatars, fedi_name,
send_notifications_to_email, admin,
published, banned,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, show_avatars,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, send_notifications_to_email,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, published,
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score (
from user_ u; SELECT
count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;
-- community -- community
drop view community_mview; DROP VIEW community_mview;
drop materialized view community_aggregates_mview;
drop view community_view; DROP MATERIALIZED VIEW community_aggregates_mview;
drop view community_aggregates_view;
create view community_view as DROP VIEW community_view;
with all_community as
( DROP VIEW community_aggregates_view;
select *,
(select name from user_ u where c.creator_id = u.id) as creator_name, CREATE VIEW community_view AS
(select avatar from user_ u where c.creator_id = u.id) as creator_avatar, with all_community AS (
(select name from category ct where c.category_id = ct.id) as category_name, SELECT
(select count(*) from community_follower cf where cf.community_id = c.id) as number_of_subscribers, *,
(select count(*) from post p where p.community_id = c.id) as number_of_posts, (
(select count(*) from comment co, post p where c.id = p.community_id and p.id = co.post_id) as number_of_comments, SELECT
hot_rank((select count(*) from community_follower cf where cf.community_id = c.id), c.published) as hot_rank name
from community c FROM
user_ u
WHERE
c.creator_id = u.id) AS creator_name,
(
SELECT
avatar
FROM
user_ u
WHERE
c.creator_id = u.id) AS creator_avatar,
(
SELECT
name
FROM
category ct
WHERE
c.category_id = ct.id) AS category_name,
(
SELECT
count(*)
FROM
community_follower cf
WHERE
cf.community_id = c.id) AS number_of_subscribers,
(
SELECT
count(*)
FROM
post p
WHERE
p.community_id = c.id) AS number_of_posts,
(
SELECT
count(*)
FROM
comment co,
post p
WHERE
c.id = p.community_id
AND p.id = co.post_id) AS number_of_comments,
hot_rank ((
SELECT
count(*)
FROM community_follower cf
WHERE
cf.community_id = c.id), c.published) AS hot_rank
FROM
community c
) )
SELECT
select ac.*,
ac.*, u.id AS user_id,
u.id as user_id, (
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed SELECT
from user_ u cf.id::boolean
cross join all_community ac FROM
community_follower cf
union all WHERE
u.id = cf.user_id
select AND ac.id = cf.community_id) AS subscribed
ac.*, FROM
null as user_id, user_ u
null as subscribed CROSS JOIN all_community ac
from all_community ac UNION ALL
; SELECT
ac.*,
NULL AS user_id,
NULL AS subscribed
FROM
all_community ac;
-- reply and comment view -- reply and comment view
drop view reply_view; DROP VIEW reply_view;
drop view user_mention_view;
drop view comment_view; DROP VIEW user_mention_view;
drop view comment_mview;
drop materialized view comment_aggregates_mview; DROP VIEW comment_view;
drop view comment_aggregates_view;
create view comment_view as DROP VIEW comment_mview;
with all_comment as
( DROP MATERIALIZED VIEW comment_aggregates_mview;
select
c.*, DROP VIEW comment_aggregates_view;
(select community_id from post p where p.id = c.post_id),
(select u.banned from user_ u where c.creator_id = u.id) as banned, CREATE VIEW comment_view AS
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, with all_comment AS (
(select name from user_ where c.creator_id = user_.id) as creator_name, SELECT
(select avatar from user_ where c.creator_id = user_.id) as creator_avatar, c.*,
coalesce(sum(cl.score), 0) as score, (
count (case when cl.score = 1 then 1 else null end) as upvotes, SELECT
count (case when cl.score = -1 then 1 else null end) as downvotes community_id
from comment c FROM
left join comment_like cl on c.id = cl.comment_id post p
group by c.id WHERE
p.id = c.post_id),
(
SELECT
u.banned
FROM
user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_avatar,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id
) )
SELECT
ac.*,
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
select CREATE VIEW reply_view AS
ac.*, with closereply AS (
u.id as user_id, SELECT
coalesce(cl.score, 0) as my_vote, c2.id,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved c2.creator_id AS sender_id,
from user_ u c.creator_id AS recipient_id
cross join all_comment ac FROM
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id comment c
INNER JOIN comment c2 ON c.id = c2.parent_id
union all WHERE
c2.creator_id != c.creator_id
select -- Do union where post is null
ac.*, UNION
null as user_id, SELECT
null as my_vote, c.id,
null as saved c.creator_id AS sender_id,
from all_comment ac p.creator_id AS recipient_id
; FROM
comment c,
create view reply_view as post p
with closereply as ( WHERE
select c.post_id = p.id
c2.id, AND c.parent_id IS NULL
c2.creator_id as sender_id, AND c.creator_id != p.creator_id
c.creator_id as recipient_id
from comment c
inner join comment c2 on c.id = c2.parent_id
where c2.creator_id != c.creator_id
-- Do union where post is null
union
select
c.id,
c.creator_id as sender_id,
p.creator_id as recipient_id
from comment c, post p
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_view cv,
closereply
WHERE
closereply.id = cv.id;
-- user mention -- user mention
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.post_id, c.post_id,
c.parent_id, c.parent_id,
@ -218,6 +473,9 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id um.recipient_id
from user_mention um, comment_view c FROM
where um.comment_id = c.id; user_mention um,
comment_view c
WHERE
um.comment_id = c.id;

File diff suppressed because it is too large Load diff

View file

@ -1,34 +1,72 @@
-- Drop the triggers -- Drop the triggers
drop trigger refresh_private_message on private_message; DROP TRIGGER refresh_private_message ON private_message;
drop function refresh_private_message();
DROP FUNCTION refresh_private_message ();
-- Drop the view and table -- Drop the view and table
drop view private_message_view cascade; DROP VIEW private_message_view CASCADE;
drop table private_message;
DROP TABLE private_message;
-- Rebuild the old views -- Rebuild the old views
drop view user_view cascade; DROP VIEW user_view CASCADE;
create view user_view as
select
u.id,
u.name,
u.avatar,
u.email,
u.fedi_name,
u.admin,
u.banned,
u.show_avatars,
u.send_notifications_to_email,
u.published,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments,
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score
from user_ u;
create materialized view user_mview as select * from user_view; CREATE VIEW user_view AS
SELECT
u.id,
u.name,
u.avatar,
u.email,
u.fedi_name,
u.admin,
u.banned,
u.show_avatars,
u.send_notifications_to_email,
u.published,
(
SELECT
count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;
create unique index idx_user_mview_id on user_mview (id); CREATE MATERIALIZED VIEW user_mview AS
SELECT
*
FROM
user_view;
CREATE UNIQUE INDEX idx_user_mview_id ON user_mview (id);
-- Drop the columns -- Drop the columns
alter table user_ drop column matrix_user_id; ALTER TABLE user_
DROP COLUMN matrix_user_id;

View file

@ -1,72 +1,113 @@
-- Creating private message -- Creating private message
create table private_message ( CREATE TABLE private_message (
id serial primary key, id serial PRIMARY KEY,
creator_id int references user_ on update cascade on delete cascade not null, creator_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
recipient_id int references user_ on update cascade on delete cascade not null, recipient_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL,
content text not null, content text NOT NULL,
deleted boolean default false not null, deleted boolean DEFAULT FALSE NOT NULL,
read boolean default false not null, read boolean DEFAULT FALSE NOT NULL,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
updated timestamp updated timestamp
); );
-- Create the view and materialized view which has the avatar and creator name -- Create the view and materialized view which has the avatar and creator name
create view private_message_view as CREATE VIEW private_message_view AS
select SELECT
pm.*, pm.*,
u.name as creator_name, u.name AS creator_name,
u.avatar as creator_avatar, u.avatar AS creator_avatar,
u2.name as recipient_name, u2.name AS recipient_name,
u2.avatar as recipient_avatar u2.avatar AS recipient_avatar
from private_message pm FROM
inner join user_ u on u.id = pm.creator_id private_message pm
inner join user_ u2 on u2.id = pm.recipient_id; INNER JOIN user_ u ON u.id = pm.creator_id
INNER JOIN user_ u2 ON u2.id = pm.recipient_id;
create materialized view private_message_mview as select * from private_message_view; CREATE MATERIALIZED VIEW private_message_mview AS
SELECT
*
FROM
private_message_view;
create unique index idx_private_message_mview_id on private_message_mview (id); CREATE UNIQUE INDEX idx_private_message_mview_id ON private_message_mview (id);
-- Create the triggers -- Create the triggers
create or replace function refresh_private_message() CREATE OR REPLACE FUNCTION refresh_private_message ()
returns trigger language plpgsql RETURNS TRIGGER
as $$ LANGUAGE plpgsql
begin AS $$
refresh materialized view concurrently private_message_mview; BEGIN
return null; REFRESH MATERIALIZED VIEW CONCURRENTLY private_message_mview;
end $$; RETURN NULL;
END
$$;
create trigger refresh_private_message CREATE TRIGGER refresh_private_message
after insert or update or delete or truncate AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ON private_message
on private_message FOR EACH statement
for each statement EXECUTE PROCEDURE refresh_private_message ();
execute procedure refresh_private_message();
-- Update user to include matrix id -- Update user to include matrix id
alter table user_ add column matrix_user_id text unique; ALTER TABLE user_
ADD COLUMN matrix_user_id text UNIQUE;
drop view user_view cascade; DROP VIEW user_view CASCADE;
create view user_view as
select
u.id,
u.name,
u.avatar,
u.email,
u.matrix_user_id,
u.fedi_name,
u.admin,
u.banned,
u.show_avatars,
u.send_notifications_to_email,
u.published,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments,
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score
from user_ u;
create materialized view user_mview as select * from user_view; CREATE VIEW user_view AS
SELECT
u.id,
u.name,
u.avatar,
u.email,
u.matrix_user_id,
u.fedi_name,
u.admin,
u.banned,
u.show_avatars,
u.send_notifications_to_email,
u.published,
(
SELECT
count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;
create unique index idx_user_mview_id on user_mview (id); CREATE MATERIALIZED VIEW user_mview AS
SELECT
*
FROM
user_view;
CREATE UNIQUE INDEX idx_user_mview_id ON user_mview (id);
-- This is what a group pm table would look like -- This is what a group pm table would look like
-- Not going to do it now because of the complications -- Not going to do it now because of the complications

View file

@ -1,25 +1,37 @@
-- Drop the materialized / built views -- Drop the materialized / built views
drop view reply_view; DROP VIEW reply_view;
create view reply_view as
with closereply as ( CREATE VIEW reply_view AS
select with closereply AS (
c2.id, SELECT
c2.creator_id as sender_id, c2.id,
c.creator_id as recipient_id c2.creator_id AS sender_id,
from comment c c.creator_id AS recipient_id
inner join comment c2 on c.id = c2.parent_id FROM
where c2.creator_id != c.creator_id comment c
-- Do union where post is null INNER JOIN comment c2 ON c.id = c2.parent_id
union WHERE
select c2.creator_id != c.creator_id
c.id, -- Do union where post is null
c.creator_id as sender_id, UNION
p.creator_id as recipient_id SELECT
from comment c, post p c.id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id c.creator_id AS sender_id,
p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_view cv,
closereply
WHERE
closereply.id = cv.id;

View file

@ -1,27 +1,38 @@
-- https://github.com/dessalines/lemmy/issues/197 -- https://github.com/dessalines/lemmy/issues/197
drop view reply_view; DROP VIEW reply_view;
-- Do the reply_view referencing the comment_mview -- Do the reply_view referencing the comment_mview
create view reply_view as CREATE VIEW reply_view AS
with closereply as ( with closereply AS (
select SELECT
c2.id, c2.id,
c2.creator_id as sender_id, c2.creator_id AS sender_id,
c.creator_id as recipient_id c.creator_id AS recipient_id
from comment c FROM
inner join comment c2 on c.id = c2.parent_id comment c
where c2.creator_id != c.creator_id INNER JOIN comment c2 ON c.id = c2.parent_id
-- Do union where post is null WHERE
union c2.creator_id != c.creator_id
select -- Do union where post is null
c.id, UNION
c.creator_id as sender_id, SELECT
p.creator_id as recipient_id c.id,
from comment c, post p c.creator_id AS sender_id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_mview cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_mview cv,
closereply
WHERE
closereply.id = cv.id;

View file

@ -1 +1,2 @@
drop view user_mention_mview; DROP VIEW user_mention_mview;

View file

@ -1,14 +1,13 @@
create view user_mention_mview as CREATE VIEW user_mention_mview AS
with all_comment as with all_comment AS (
( SELECT
select ca.*
ca.* FROM
from comment_aggregates_mview ca comment_aggregates_mview ca
) )
SELECT
select
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.post_id, ac.post_id,
ac.parent_id, ac.parent_id,
@ -26,20 +25,27 @@ select
ac.score, ac.score,
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
u.id as user_id, u.id AS user_id,
coalesce(cl.score, 0) as my_vote, coalesce(cl.score, 0) AS my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, (
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved,
um.recipient_id um.recipient_id
from user_ u FROM
cross join all_comment ac user_ u
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id CROSS JOIN all_comment ac
left join user_mention um on um.comment_id = ac.id LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
union all LEFT JOIN user_mention um ON um.comment_id = ac.id
UNION ALL
select SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.post_id, ac.post_id,
ac.parent_id, ac.parent_id,
@ -57,11 +63,11 @@ select
ac.score, ac.score,
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as saved, NULL AS saved,
um.recipient_id um.recipient_id
from all_comment ac FROM
left join user_mention um on um.comment_id = ac.id all_comment ac
; LEFT JOIN user_mention um ON um.comment_id = ac.id;

View file

@ -1,2 +1,4 @@
drop index idx_user_name_lower; DROP INDEX idx_user_name_lower;
drop index idx_user_email_lower;
DROP INDEX idx_user_email_lower;

View file

@ -1,5 +1,4 @@
-- Add case insensitive username and email uniqueness -- Add case insensitive username and email uniqueness
-- An example of showing the dupes: -- An example of showing the dupes:
-- select -- select
-- max(id) as id, -- max(id) as id,
@ -8,22 +7,28 @@
-- from user_ -- from user_
-- group by lower(name) -- group by lower(name)
-- having count(*) > 1; -- having count(*) > 1;
-- Delete username dupes, keeping the first one -- Delete username dupes, keeping the first one
delete DELETE FROM user_
from user_ WHERE id NOT IN (
where id not in ( SELECT
select min(id) min(id)
from user_ FROM
group by lower(name), lower(fedi_name) user_
); GROUP BY
lower(name),
lower(fedi_name));
-- The user index -- The user index
create unique index idx_user_name_lower on user_ (lower(name)); CREATE UNIQUE INDEX idx_user_name_lower ON user_ (lower(name));
-- Email lower -- Email lower
create unique index idx_user_email_lower on user_ (lower(email)); CREATE UNIQUE INDEX idx_user_email_lower ON user_ (lower(email));
-- Set empty emails properly to null -- Set empty emails properly to null
update user_ set email = null where email = ''; UPDATE
user_
SET
email = NULL
WHERE
email = '';

View file

@ -1,132 +1,409 @@
-- Drop the dependent views -- Drop the dependent views
drop view post_view; DROP VIEW post_view;
drop view post_mview;
drop materialized view post_aggregates_mview;
drop view post_aggregates_view;
drop view mod_remove_post_view;
drop view mod_sticky_post_view;
drop view mod_lock_post_view;
drop view mod_remove_comment_view;
alter table post alter column name type varchar(100); DROP VIEW post_mview;
DROP MATERIALIZED VIEW post_aggregates_mview;
DROP VIEW post_aggregates_view;
DROP VIEW mod_remove_post_view;
DROP VIEW mod_sticky_post_view;
DROP VIEW mod_lock_post_view;
DROP VIEW mod_remove_comment_view;
ALTER TABLE post
ALTER COLUMN name TYPE varchar(100);
-- regen post view -- regen post view
create view post_aggregates_view as CREATE VIEW post_aggregates_view AS
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank WHERE
from post p p.creator_id = cb.user_id
left join post_like pl on p.id = pl.post_id AND p.community_id = cb.community_id) AS banned_from_community,
group by p.id; (
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_avatar,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id;
create materialized view post_aggregates_mview as select * from post_aggregates_view; CREATE MATERIALIZED VIEW post_aggregates_mview AS
SELECT
*
FROM
post_aggregates_view;
create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); CREATE UNIQUE INDEX idx_post_aggregates_mview_id ON post_aggregates_mview (id);
create view post_view as CREATE VIEW post_view AS
with all_post as ( with all_post AS (
select SELECT
pa.* pa.*
from post_aggregates_view pa FROM
post_aggregates_view pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
union all CREATE VIEW post_mview AS
with all_post AS (
select SELECT
ap.*, pa.*
null as user_id, FROM
null as my_vote, post_aggregates_mview pa
null as subscribed,
null as read,
null as saved
from all_post ap
;
create view post_mview as
with all_post as (
select
pa.*
from post_aggregates_mview pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
union all AND cf.community_id = ap.community_id) AS subscribed,
(
select SELECT
ap.*, pr.id::bool
null as user_id, FROM
null as my_vote, post_read pr
null as subscribed, WHERE
null as read, u.id = pr.user_id
null as saved AND pr.post_id = ap.id) AS read,
from all_post ap (
; SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
-- The mod views -- The mod views
CREATE VIEW mod_remove_post_view AS
SELECT
mrp.*,
(
SELECT
name
FROM
user_ u
WHERE
mrp.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
post p
WHERE
mrp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
mrp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
mrp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_remove_post mrp;
create view mod_remove_post_view as CREATE VIEW mod_lock_post_view AS
select mrp.*, SELECT
(select name from user_ u where mrp.mod_user_id = u.id) as mod_user_name, mlp.*,
(select name from post p where mrp.post_id = p.id) as post_name, (
(select c.id from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_id, SELECT
(select c.name from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_name name
from mod_remove_post mrp; FROM
user_ u
WHERE
mlp.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
post p
WHERE
mlp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
mlp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
mlp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_lock_post mlp;
create view mod_lock_post_view as CREATE VIEW mod_remove_comment_view AS
select mlp.*, SELECT
(select name from user_ u where mlp.mod_user_id = u.id) as mod_user_name, mrc.*,
(select name from post p where mlp.post_id = p.id) as post_name, (
(select c.id from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_id, SELECT
(select c.name from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_name name
from mod_lock_post mlp; FROM
user_ u
WHERE
mrc.mod_user_id = u.id) AS mod_user_name,
(
SELECT
c.id
FROM
comment c
WHERE
mrc.comment_id = c.id) AS comment_user_id,
(
SELECT
name
FROM
user_ u,
comment c
WHERE
mrc.comment_id = c.id
AND u.id = c.creator_id) AS comment_user_name,
(
SELECT
content
FROM
comment c
WHERE
mrc.comment_id = c.id) AS comment_content,
(
SELECT
p.id
FROM
post p,
comment c
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id) AS post_id,
(
SELECT
p.name
FROM
post p,
comment c
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id) AS post_name,
(
SELECT
co.id
FROM
comment c,
post p,
community co
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id
AND p.community_id = co.id) AS community_id,
(
SELECT
co.name
FROM
comment c,
post p,
community co
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id
AND p.community_id = co.id) AS community_name
FROM
mod_remove_comment mrc;
create view mod_remove_comment_view as CREATE VIEW mod_sticky_post_view AS
select mrc.*, SELECT
(select name from user_ u where mrc.mod_user_id = u.id) as mod_user_name, msp.*,
(select c.id from comment c where mrc.comment_id = c.id) as comment_user_id, (
(select name from user_ u, comment c where mrc.comment_id = c.id and u.id = c.creator_id) as comment_user_name, SELECT
(select content from comment c where mrc.comment_id = c.id) as comment_content, name
(select p.id from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_id, FROM
(select p.name from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_name, user_ u
(select co.id from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_id, WHERE
(select co.name from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_name msp.mod_user_id = u.id) AS mod_user_name,
from mod_remove_comment mrc; (
SELECT
name
FROM
post p
WHERE
msp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
msp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
msp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_sticky_post msp;
create view mod_sticky_post_view as
select msp.*,
(select name from user_ u where msp.mod_user_id = u.id) as mod_user_name,
(select name from post p where msp.post_id = p.id) as post_name,
(select c.id from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_id,
(select c.name from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_name
from mod_sticky_post msp;

View file

@ -1,133 +1,410 @@
-- Drop the dependent views -- Drop the dependent views
drop view post_view; DROP VIEW post_view;
drop view post_mview;
drop materialized view post_aggregates_mview; DROP VIEW post_mview;
drop view post_aggregates_view;
drop view mod_remove_post_view; DROP MATERIALIZED VIEW post_aggregates_mview;
drop view mod_sticky_post_view;
drop view mod_lock_post_view; DROP VIEW post_aggregates_view;
drop view mod_remove_comment_view;
DROP VIEW mod_remove_post_view;
DROP VIEW mod_sticky_post_view;
DROP VIEW mod_lock_post_view;
DROP VIEW mod_remove_comment_view;
-- Add the extra post limit -- Add the extra post limit
alter table post alter column name type varchar(200); ALTER TABLE post
ALTER COLUMN name TYPE varchar(200);
-- regen post view -- regen post view
create view post_aggregates_view as CREATE VIEW post_aggregates_view AS
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank WHERE
from post p p.creator_id = cb.user_id
left join post_like pl on p.id = pl.post_id AND p.community_id = cb.community_id) AS banned_from_community,
group by p.id; (
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_avatar,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id;
create materialized view post_aggregates_mview as select * from post_aggregates_view; CREATE MATERIALIZED VIEW post_aggregates_mview AS
SELECT
*
FROM
post_aggregates_view;
create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); CREATE UNIQUE INDEX idx_post_aggregates_mview_id ON post_aggregates_mview (id);
create view post_view as CREATE VIEW post_view AS
with all_post as ( with all_post AS (
select SELECT
pa.* pa.*
from post_aggregates_view pa FROM
post_aggregates_view pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
union all CREATE VIEW post_mview AS
with all_post AS (
select SELECT
ap.*, pa.*
null as user_id, FROM
null as my_vote, post_aggregates_mview pa
null as subscribed,
null as read,
null as saved
from all_post ap
;
create view post_mview as
with all_post as (
select
pa.*
from post_aggregates_mview pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
union all AND cf.community_id = ap.community_id) AS subscribed,
(
select SELECT
ap.*, pr.id::bool
null as user_id, FROM
null as my_vote, post_read pr
null as subscribed, WHERE
null as read, u.id = pr.user_id
null as saved AND pr.post_id = ap.id) AS read,
from all_post ap (
; SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
-- The mod views -- The mod views
CREATE VIEW mod_remove_post_view AS
SELECT
mrp.*,
(
SELECT
name
FROM
user_ u
WHERE
mrp.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
post p
WHERE
mrp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
mrp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
mrp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_remove_post mrp;
create view mod_remove_post_view as CREATE VIEW mod_lock_post_view AS
select mrp.*, SELECT
(select name from user_ u where mrp.mod_user_id = u.id) as mod_user_name, mlp.*,
(select name from post p where mrp.post_id = p.id) as post_name, (
(select c.id from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_id, SELECT
(select c.name from post p, community c where mrp.post_id = p.id and p.community_id = c.id) as community_name name
from mod_remove_post mrp; FROM
user_ u
WHERE
mlp.mod_user_id = u.id) AS mod_user_name,
(
SELECT
name
FROM
post p
WHERE
mlp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
mlp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
mlp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_lock_post mlp;
create view mod_lock_post_view as CREATE VIEW mod_remove_comment_view AS
select mlp.*, SELECT
(select name from user_ u where mlp.mod_user_id = u.id) as mod_user_name, mrc.*,
(select name from post p where mlp.post_id = p.id) as post_name, (
(select c.id from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_id, SELECT
(select c.name from post p, community c where mlp.post_id = p.id and p.community_id = c.id) as community_name name
from mod_lock_post mlp; FROM
user_ u
WHERE
mrc.mod_user_id = u.id) AS mod_user_name,
(
SELECT
c.id
FROM
comment c
WHERE
mrc.comment_id = c.id) AS comment_user_id,
(
SELECT
name
FROM
user_ u,
comment c
WHERE
mrc.comment_id = c.id
AND u.id = c.creator_id) AS comment_user_name,
(
SELECT
content
FROM
comment c
WHERE
mrc.comment_id = c.id) AS comment_content,
(
SELECT
p.id
FROM
post p,
comment c
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id) AS post_id,
(
SELECT
p.name
FROM
post p,
comment c
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id) AS post_name,
(
SELECT
co.id
FROM
comment c,
post p,
community co
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id
AND p.community_id = co.id) AS community_id,
(
SELECT
co.name
FROM
comment c,
post p,
community co
WHERE
mrc.comment_id = c.id
AND c.post_id = p.id
AND p.community_id = co.id) AS community_name
FROM
mod_remove_comment mrc;
create view mod_remove_comment_view as CREATE VIEW mod_sticky_post_view AS
select mrc.*, SELECT
(select name from user_ u where mrc.mod_user_id = u.id) as mod_user_name, msp.*,
(select c.id from comment c where mrc.comment_id = c.id) as comment_user_id, (
(select name from user_ u, comment c where mrc.comment_id = c.id and u.id = c.creator_id) as comment_user_name, SELECT
(select content from comment c where mrc.comment_id = c.id) as comment_content, name
(select p.id from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_id, FROM
(select p.name from post p, comment c where mrc.comment_id = c.id and c.post_id = p.id) as post_name, user_ u
(select co.id from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_id, WHERE
(select co.name from comment c, post p, community co where mrc.comment_id = c.id and c.post_id = p.id and p.community_id = co.id) as community_name msp.mod_user_id = u.id) AS mod_user_name,
from mod_remove_comment mrc; (
SELECT
name
FROM
post p
WHERE
msp.post_id = p.id) AS post_name,
(
SELECT
c.id
FROM
post p,
community c
WHERE
msp.post_id = p.id
AND p.community_id = c.id) AS community_id,
(
SELECT
c.name
FROM
post p,
community c
WHERE
msp.post_id = p.id
AND p.community_id = c.id) AS community_name
FROM
mod_sticky_post msp;
create view mod_sticky_post_view as
select msp.*,
(select name from user_ u where msp.mod_user_id = u.id) as mod_user_name,
(select name from post p where msp.post_id = p.id) as post_name,
(select c.id from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_id,
(select c.name from post p, community c where msp.post_id = p.id and p.community_id = c.id) as community_name
from mod_sticky_post msp;

View file

@ -1,117 +1,191 @@
DROP VIEW reply_view;
drop view reply_view; DROP VIEW user_mention_view;
drop view user_mention_view;
drop view user_mention_mview; DROP VIEW user_mention_mview;
drop view comment_view;
drop view comment_mview; DROP VIEW comment_view;
drop materialized view comment_aggregates_mview;
drop view comment_aggregates_view; DROP VIEW comment_mview;
DROP MATERIALIZED VIEW comment_aggregates_mview;
DROP VIEW comment_aggregates_view;
-- reply and comment view -- reply and comment view
create view comment_aggregates_view as CREATE VIEW comment_aggregates_view AS
select SELECT
c.*, c.*,
(select community_id from post p where p.id = c.post_id), (
(select u.banned from user_ u where c.creator_id = u.id) as banned, SELECT
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, community_id
(select name from user_ where c.creator_id = user_.id) as creator_name, FROM
(select avatar from user_ where c.creator_id = user_.id) as creator_avatar, post p
coalesce(sum(cl.score), 0) as score, WHERE
count (case when cl.score = 1 then 1 else null end) as upvotes, p.id = c.post_id), (
count (case when cl.score = -1 then 1 else null end) as downvotes SELECT
from comment c u.banned
left join comment_like cl on c.id = cl.comment_id FROM
group by c.id; user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_avatar,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id;
create materialized view comment_aggregates_mview as select * from comment_aggregates_view; CREATE MATERIALIZED VIEW comment_aggregates_mview AS
SELECT
*
FROM
comment_aggregates_view;
create unique index idx_comment_aggregates_mview_id on comment_aggregates_mview (id); CREATE UNIQUE INDEX idx_comment_aggregates_mview_id ON comment_aggregates_mview (id);
create view comment_view as CREATE VIEW comment_view AS
with all_comment as with all_comment AS (
( SELECT
select ca.*
ca.* FROM
from comment_aggregates_view ca comment_aggregates_view ca
) )
SELECT
select
ac.*,
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved
from user_ u
cross join all_comment ac
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id
union all
select
ac.*, ac.*,
null as user_id, u.id AS user_id,
null as my_vote, coalesce(cl.score, 0) AS my_vote,
null as saved (
from all_comment ac SELECT
; cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
create view comment_mview as CREATE VIEW comment_mview AS
with all_comment as with all_comment AS (
( SELECT
select ca.*
ca.* FROM
from comment_aggregates_mview ca comment_aggregates_mview ca
) )
SELECT
select
ac.*,
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved
from user_ u
cross join all_comment ac
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id
union all
select
ac.*, ac.*,
null as user_id, u.id AS user_id,
null as my_vote, coalesce(cl.score, 0) AS my_vote,
null as saved (
from all_comment ac SELECT
; cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS saved
FROM
all_comment ac;
-- Do the reply_view referencing the comment_mview -- Do the reply_view referencing the comment_mview
create view reply_view as CREATE VIEW reply_view AS
with closereply as ( with closereply AS (
select SELECT
c2.id, c2.id,
c2.creator_id as sender_id, c2.creator_id AS sender_id,
c.creator_id as recipient_id c.creator_id AS recipient_id
from comment c FROM
inner join comment c2 on c.id = c2.parent_id comment c
where c2.creator_id != c.creator_id INNER JOIN comment c2 ON c.id = c2.parent_id
-- Do union where post is null WHERE
union c2.creator_id != c.creator_id
select -- Do union where post is null
c.id, UNION
c.creator_id as sender_id, SELECT
p.creator_id as recipient_id c.id,
from comment c, post p c.creator_id AS sender_id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_mview cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_mview cv,
closereply
WHERE
closereply.id = cv.id;
-- user mention -- user mention
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.post_id, c.post_id,
c.parent_id, c.parent_id,
@ -133,21 +207,22 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id um.recipient_id
from user_mention um, comment_view c FROM
where um.comment_id = c.id; user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
CREATE VIEW user_mention_mview AS
create view user_mention_mview as with all_comment AS (
with all_comment as SELECT
( ca.*
select FROM
ca.* comment_aggregates_mview ca
from comment_aggregates_mview ca
) )
SELECT
select
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.post_id, ac.post_id,
ac.parent_id, ac.parent_id,
@ -165,20 +240,27 @@ select
ac.score, ac.score,
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
u.id as user_id, u.id AS user_id,
coalesce(cl.score, 0) as my_vote, coalesce(cl.score, 0) AS my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, (
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved,
um.recipient_id um.recipient_id
from user_ u FROM
cross join all_comment ac user_ u
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id CROSS JOIN all_comment ac
left join user_mention um on um.comment_id = ac.id LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
union all LEFT JOIN user_mention um ON um.comment_id = ac.id
UNION ALL
select SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.post_id, ac.post_id,
ac.parent_id, ac.parent_id,
@ -196,11 +278,11 @@ select
ac.score, ac.score,
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as saved, NULL AS saved,
um.recipient_id um.recipient_id
from all_comment ac FROM
left join user_mention um on um.comment_id = ac.id all_comment ac
; LEFT JOIN user_mention um ON um.comment_id = ac.id;

View file

@ -1,125 +1,221 @@
-- Adding community name, hot_rank, to comment_view, user_mention_view, and subscribed to comment_view -- Adding community name, hot_rank, to comment_view, user_mention_view, and subscribed to comment_view
-- Rebuild the comment view -- Rebuild the comment view
drop view reply_view; DROP VIEW reply_view;
drop view user_mention_view;
drop view user_mention_mview; DROP VIEW user_mention_view;
drop view comment_view;
drop view comment_mview; DROP VIEW user_mention_mview;
drop materialized view comment_aggregates_mview;
drop view comment_aggregates_view; DROP VIEW comment_view;
DROP VIEW comment_mview;
DROP MATERIALIZED VIEW comment_aggregates_mview;
DROP VIEW comment_aggregates_view;
-- reply and comment view -- reply and comment view
create view comment_aggregates_view as CREATE VIEW comment_aggregates_view AS
select SELECT
c.*, c.*,
(select community_id from post p where p.id = c.post_id), (
(select co.name from post p, community co where p.id = c.post_id and p.community_id = co.id) as community_name, SELECT
(select u.banned from user_ u where c.creator_id = u.id) as banned, community_id
(select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, FROM
(select name from user_ where c.creator_id = user_.id) as creator_name, post p
(select avatar from user_ where c.creator_id = user_.id) as creator_avatar, WHERE
coalesce(sum(cl.score), 0) as score, p.id = c.post_id), (
count (case when cl.score = 1 then 1 else null end) as upvotes, SELECT
count (case when cl.score = -1 then 1 else null end) as downvotes, co.name
hot_rank(coalesce(sum(cl.score) , 0), c.published) as hot_rank FROM
from comment c post p,
left join comment_like cl on c.id = cl.comment_id community co
group by c.id; WHERE
p.id = c.post_id
AND p.community_id = co.id) AS community_name,
(
SELECT
u.banned
FROM
user_ u
WHERE
c.creator_id = u.id) AS banned,
(
SELECT
cb.id::bool
FROM
community_user_ban cb,
post p
WHERE
c.creator_id = cb.user_id
AND p.id = c.post_id
AND p.community_id = cb.community_id) AS banned_from_community,
(
SELECT
name
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
c.creator_id = user_.id) AS creator_avatar,
coalesce(sum(cl.score), 0) AS score,
count(
CASE WHEN cl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN cl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(cl.score), 0), c.published) AS hot_rank
FROM
comment c
LEFT JOIN comment_like cl ON c.id = cl.comment_id
GROUP BY
c.id;
create materialized view comment_aggregates_mview as select * from comment_aggregates_view; CREATE MATERIALIZED VIEW comment_aggregates_mview AS
SELECT
*
FROM
comment_aggregates_view;
create unique index idx_comment_aggregates_mview_id on comment_aggregates_mview (id); CREATE UNIQUE INDEX idx_comment_aggregates_mview_id ON comment_aggregates_mview (id);
create view comment_view as CREATE VIEW comment_view AS
with all_comment as with all_comment AS (
( SELECT
select ca.*
ca.* FROM
from comment_aggregates_view ca comment_aggregates_view ca
) )
SELECT
select
ac.*,
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.community_id = cf.community_id) as subscribed,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved
from user_ u
cross join all_comment ac
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id
union all
select
ac.*, ac.*,
null as user_id, u.id AS user_id,
null as my_vote, coalesce(cl.score, 0) AS my_vote,
null as subscribed, (
null as saved SELECT
from all_comment ac cf.id::boolean
; FROM
community_follower cf
WHERE
u.id = cf.user_id
AND ac.community_id = cf.community_id) AS subscribed,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS saved
FROM
all_comment ac;
create view comment_mview as CREATE VIEW comment_mview AS
with all_comment as with all_comment AS (
( SELECT
select ca.*
ca.* FROM
from comment_aggregates_mview ca comment_aggregates_mview ca
) )
SELECT
select
ac.*,
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.community_id = cf.community_id) as subscribed,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved
from user_ u
cross join all_comment ac
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id
union all
select
ac.*, ac.*,
null as user_id, u.id AS user_id,
null as my_vote, coalesce(cl.score, 0) AS my_vote,
null as subscribed, (
null as saved SELECT
from all_comment ac cf.id::boolean
; FROM
community_follower cf
WHERE
u.id = cf.user_id
AND ac.community_id = cf.community_id) AS subscribed,
(
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved
FROM
user_ u
CROSS JOIN all_comment ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
UNION ALL
SELECT
ac.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS saved
FROM
all_comment ac;
-- Do the reply_view referencing the comment_mview -- Do the reply_view referencing the comment_mview
create view reply_view as CREATE VIEW reply_view AS
with closereply as ( with closereply AS (
select SELECT
c2.id, c2.id,
c2.creator_id as sender_id, c2.creator_id AS sender_id,
c.creator_id as recipient_id c.creator_id AS recipient_id
from comment c FROM
inner join comment c2 on c.id = c2.parent_id comment c
where c2.creator_id != c.creator_id INNER JOIN comment c2 ON c.id = c2.parent_id
-- Do union where post is null WHERE
union c2.creator_id != c.creator_id
select -- Do union where post is null
c.id, UNION
c.creator_id as sender_id, SELECT
p.creator_id as recipient_id c.id,
from comment c, post p c.creator_id AS sender_id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_mview cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_mview cv,
closereply
WHERE
closereply.id = cv.id;
-- user mention -- user mention
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.post_id, c.post_id,
c.parent_id, c.parent_id,
@ -143,21 +239,22 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id um.recipient_id
from user_mention um, comment_view c FROM
where um.comment_id = c.id; user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
CREATE VIEW user_mention_mview AS
create view user_mention_mview as with all_comment AS (
with all_comment as SELECT
( ca.*
select FROM
ca.* comment_aggregates_mview ca
from comment_aggregates_mview ca
) )
SELECT
select
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.post_id, ac.post_id,
ac.parent_id, ac.parent_id,
@ -177,20 +274,27 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
u.id as user_id, u.id AS user_id,
coalesce(cl.score, 0) as my_vote, coalesce(cl.score, 0) AS my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, (
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved,
um.recipient_id um.recipient_id
from user_ u FROM
cross join all_comment ac user_ u
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id CROSS JOIN all_comment ac
left join user_mention um on um.comment_id = ac.id LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
union all LEFT JOIN user_mention um ON um.comment_id = ac.id
UNION ALL
select SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.post_id, ac.post_id,
ac.parent_id, ac.parent_id,
@ -210,11 +314,11 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as saved, NULL AS saved,
um.recipient_id um.recipient_id
from all_comment ac FROM
left join user_mention um on um.comment_id = ac.id all_comment ac
; LEFT JOIN user_mention um ON um.comment_id = ac.id;

View file

@ -1,88 +1,206 @@
drop view post_view; DROP VIEW post_view;
drop view post_mview;
drop materialized view post_aggregates_mview; DROP VIEW post_mview;
drop view post_aggregates_view;
DROP MATERIALIZED VIEW post_aggregates_mview;
DROP VIEW post_aggregates_view;
-- regen post view -- regen post view
create view post_aggregates_view as CREATE VIEW post_aggregates_view AS
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), p.published) as hot_rank WHERE
from post p p.creator_id = cb.user_id
left join post_like pl on p.id = pl.post_id AND p.community_id = cb.community_id) AS banned_from_community,
group by p.id; (
SELECT
name
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_name,
(
SELECT
avatar
FROM
user_
WHERE
p.creator_id = user_.id) AS creator_avatar,
(
SELECT
name
FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), p.published) AS hot_rank
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
GROUP BY
p.id;
create materialized view post_aggregates_mview as select * from post_aggregates_view; CREATE MATERIALIZED VIEW post_aggregates_mview AS
SELECT
*
FROM
post_aggregates_view;
create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); CREATE UNIQUE INDEX idx_post_aggregates_mview_id ON post_aggregates_mview (id);
create view post_view as CREATE VIEW post_view AS
with all_post as ( with all_post AS (
select SELECT
pa.* pa.*
from post_aggregates_view pa FROM
post_aggregates_view pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
union all CREATE VIEW post_mview AS
with all_post AS (
select SELECT
ap.*, pa.*
null as user_id, FROM
null as my_vote, post_aggregates_mview pa
null as subscribed,
null as read,
null as saved
from all_post ap
;
create view post_mview as
with all_post as (
select
pa.*
from post_aggregates_mview pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
union all AND cf.community_id = ap.community_id) AS subscribed,
(
select SELECT
ap.*, pr.id::bool
null as user_id, FROM
null as my_vote, post_read pr
null as subscribed, WHERE
null as read, u.id = pr.user_id
null as saved AND pr.post_id = ap.id) AS read,
from all_post ap (
; SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;

View file

@ -1,106 +1,227 @@
-- Adds a newest_activity_time for the post_views, in order to sort by newest comment -- Adds a newest_activity_time for the post_views, in order to sort by newest comment
drop view post_view; DROP VIEW post_view;
drop view post_mview;
drop materialized view post_aggregates_mview; DROP VIEW post_mview;
drop view post_aggregates_view;
DROP MATERIALIZED VIEW post_aggregates_mview;
DROP VIEW post_aggregates_view;
-- regen post view -- regen post view
create view post_aggregates_view as CREATE VIEW post_aggregates_view AS
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), WHERE
( p.creator_id = cb.user_id
case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps AND p.community_id = cb.community_id) AS banned_from_community,
else greatest(c.recent_comment_time, p.published) (
end SELECT
) name
) as hot_rank, FROM
( user_
case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps WHERE
else greatest(c.recent_comment_time, p.published) p.creator_id = user_.id) AS creator_name,
end (
) as newest_activity_time SELECT
from post p avatar
left join post_like pl on p.id = pl.post_id FROM
left join ( user_
select post_id, WHERE
max(published) as recent_comment_time p.creator_id = user_.id) AS creator_avatar,
from comment (
group by 1 SELECT
) c on p.id = c.post_id name
group by p.id, c.recent_comment_time; FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), (
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published -- Prevents necro-bumps
ELSE
greatest (c.recent_comment_time, p.published)
END)) AS hot_rank,
(
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published -- Prevents necro-bumps
ELSE
greatest (c.recent_comment_time, p.published)
END) AS newest_activity_time
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
LEFT JOIN (
SELECT
post_id,
max(published) AS recent_comment_time
FROM
comment
GROUP BY
1) c ON p.id = c.post_id
GROUP BY
p.id,
c.recent_comment_time;
create materialized view post_aggregates_mview as select * from post_aggregates_view; CREATE MATERIALIZED VIEW post_aggregates_mview AS
SELECT
*
FROM
post_aggregates_view;
create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); CREATE UNIQUE INDEX idx_post_aggregates_mview_id ON post_aggregates_mview (id);
create view post_view as CREATE VIEW post_view AS
with all_post as ( with all_post AS (
select SELECT
pa.* pa.*
from post_aggregates_view pa FROM
post_aggregates_view pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
union all CREATE VIEW post_mview AS
with all_post AS (
select SELECT
ap.*, pa.*
null as user_id, FROM
null as my_vote, post_aggregates_mview pa
null as subscribed,
null as read,
null as saved
from all_post ap
;
create view post_mview as
with all_post as (
select
pa.*
from post_aggregates_mview pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
union all AND cf.community_id = ap.community_id) AS subscribed,
(
select SELECT
ap.*, pr.id::bool
null as user_id, FROM
null as my_vote, post_read pr
null as subscribed, WHERE
null as read, u.id = pr.user_id
null as saved AND pr.post_id = ap.id) AS read,
from all_post ap (
; SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;

View file

@ -1,112 +1,240 @@
-- Adds a newest_activity_time for the post_views, in order to sort by newest comment -- Adds a newest_activity_time for the post_views, in order to sort by newest comment
drop view post_view; DROP VIEW post_view;
drop view post_mview;
drop materialized view post_aggregates_mview; DROP VIEW post_mview;
drop view post_aggregates_view;
DROP MATERIALIZED VIEW post_aggregates_mview;
DROP VIEW post_aggregates_view;
-- Drop the columns -- Drop the columns
alter table post drop column embed_title; ALTER TABLE post
alter table post drop column embed_description; DROP COLUMN embed_title;
alter table post drop column embed_html;
alter table post drop column thumbnail_url; ALTER TABLE post
DROP COLUMN embed_description;
ALTER TABLE post
DROP COLUMN embed_html;
ALTER TABLE post
DROP COLUMN thumbnail_url;
-- regen post view -- regen post view
create view post_aggregates_view as CREATE VIEW post_aggregates_view AS
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), WHERE
( p.creator_id = cb.user_id
case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps AND p.community_id = cb.community_id) AS banned_from_community,
else greatest(c.recent_comment_time, p.published) (
end SELECT
) name
) as hot_rank, FROM
( user_
case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps WHERE
else greatest(c.recent_comment_time, p.published) p.creator_id = user_.id) AS creator_name,
end (
) as newest_activity_time SELECT
from post p avatar
left join post_like pl on p.id = pl.post_id FROM
left join ( user_
select post_id, WHERE
max(published) as recent_comment_time p.creator_id = user_.id) AS creator_avatar,
from comment (
group by 1 SELECT
) c on p.id = c.post_id name
group by p.id, c.recent_comment_time; FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), (
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published -- Prevents necro-bumps
ELSE
greatest (c.recent_comment_time, p.published)
END)) AS hot_rank,
(
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published -- Prevents necro-bumps
ELSE
greatest (c.recent_comment_time, p.published)
END) AS newest_activity_time
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
LEFT JOIN (
SELECT
post_id,
max(published) AS recent_comment_time
FROM
comment
GROUP BY
1) c ON p.id = c.post_id
GROUP BY
p.id,
c.recent_comment_time;
create materialized view post_aggregates_mview as select * from post_aggregates_view; CREATE MATERIALIZED VIEW post_aggregates_mview AS
SELECT
*
FROM
post_aggregates_view;
create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); CREATE UNIQUE INDEX idx_post_aggregates_mview_id ON post_aggregates_mview (id);
create view post_view as CREATE VIEW post_view AS
with all_post as ( with all_post AS (
select SELECT
pa.* pa.*
from post_aggregates_view pa FROM
post_aggregates_view pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
union all CREATE VIEW post_mview AS
with all_post AS (
select SELECT
ap.*, pa.*
null as user_id, FROM
null as my_vote, post_aggregates_mview pa
null as subscribed,
null as read,
null as saved
from all_post ap
;
create view post_mview as
with all_post as (
select
pa.*
from post_aggregates_mview pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
union all AND cf.community_id = ap.community_id) AS subscribed,
(
select SELECT
ap.*, pr.id::bool
null as user_id, FROM
null as my_vote, post_read pr
null as subscribed, WHERE
null as read, u.id = pr.user_id
null as saved AND pr.post_id = ap.id) AS read,
from all_post ap (
; SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;

View file

@ -1,115 +1,241 @@
-- Add the columns -- Add the columns
alter table post add column embed_title text; ALTER TABLE post
alter table post add column embed_description text; ADD COLUMN embed_title text;
alter table post add column embed_html text;
alter table post add column thumbnail_url text; ALTER TABLE post
ADD COLUMN embed_description text;
ALTER TABLE post
ADD COLUMN embed_html text;
ALTER TABLE post
ADD COLUMN thumbnail_url text;
-- Regenerate the views -- Regenerate the views
-- Adds a newest_activity_time for the post_views, in order to sort by newest comment -- Adds a newest_activity_time for the post_views, in order to sort by newest comment
drop view post_view; DROP VIEW post_view;
drop view post_mview;
drop materialized view post_aggregates_mview; DROP VIEW post_mview;
drop view post_aggregates_view;
DROP MATERIALIZED VIEW post_aggregates_mview;
DROP VIEW post_aggregates_view;
-- regen post view -- regen post view
create view post_aggregates_view as CREATE VIEW post_aggregates_view AS
select SELECT
p.*, p.*,
(select u.banned from user_ u where p.creator_id = u.id) as banned, (
(select cb.id::bool from community_user_ban cb where p.creator_id = cb.user_id and p.community_id = cb.community_id) as banned_from_community, SELECT
(select name from user_ where p.creator_id = user_.id) as creator_name, u.banned
(select avatar from user_ where p.creator_id = user_.id) as creator_avatar, FROM
(select name from community where p.community_id = community.id) as community_name, user_ u
(select removed from community c where p.community_id = c.id) as community_removed, WHERE
(select deleted from community c where p.community_id = c.id) as community_deleted, p.creator_id = u.id) AS banned,
(select nsfw from community c where p.community_id = c.id) as community_nsfw, (
(select count(*) from comment where comment.post_id = p.id) as number_of_comments, SELECT
coalesce(sum(pl.score), 0) as score, cb.id::bool
count (case when pl.score = 1 then 1 else null end) as upvotes, FROM
count (case when pl.score = -1 then 1 else null end) as downvotes, community_user_ban cb
hot_rank(coalesce(sum(pl.score) , 0), WHERE
( p.creator_id = cb.user_id
case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps AND p.community_id = cb.community_id) AS banned_from_community,
else greatest(c.recent_comment_time, p.published) (
end SELECT
) name
) as hot_rank, FROM
( user_
case when (p.published < ('now'::timestamp - '1 month'::interval)) then p.published -- Prevents necro-bumps WHERE
else greatest(c.recent_comment_time, p.published) p.creator_id = user_.id) AS creator_name,
end (
) as newest_activity_time SELECT
from post p avatar
left join post_like pl on p.id = pl.post_id FROM
left join ( user_
select post_id, WHERE
max(published) as recent_comment_time p.creator_id = user_.id) AS creator_avatar,
from comment (
group by 1 SELECT
) c on p.id = c.post_id name
group by p.id, c.recent_comment_time; FROM
community
WHERE
p.community_id = community.id) AS community_name,
(
SELECT
removed
FROM
community c
WHERE
p.community_id = c.id) AS community_removed,
(
SELECT
deleted
FROM
community c
WHERE
p.community_id = c.id) AS community_deleted,
(
SELECT
nsfw
FROM
community c
WHERE
p.community_id = c.id) AS community_nsfw,
(
SELECT
count(*)
FROM
comment
WHERE
comment.post_id = p.id) AS number_of_comments,
coalesce(sum(pl.score), 0) AS score,
count(
CASE WHEN pl.score = 1 THEN
1
ELSE
NULL
END) AS upvotes,
count(
CASE WHEN pl.score = - 1 THEN
1
ELSE
NULL
END) AS downvotes,
hot_rank (coalesce(sum(pl.score), 0), (
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published -- Prevents necro-bumps
ELSE
greatest (c.recent_comment_time, p.published)
END)) AS hot_rank,
(
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published -- Prevents necro-bumps
ELSE
greatest (c.recent_comment_time, p.published)
END) AS newest_activity_time
FROM
post p
LEFT JOIN post_like pl ON p.id = pl.post_id
LEFT JOIN (
SELECT
post_id,
max(published) AS recent_comment_time
FROM
comment
GROUP BY
1) c ON p.id = c.post_id
GROUP BY
p.id,
c.recent_comment_time;
create materialized view post_aggregates_mview as select * from post_aggregates_view; CREATE MATERIALIZED VIEW post_aggregates_mview AS
SELECT
*
FROM
post_aggregates_view;
create unique index idx_post_aggregates_mview_id on post_aggregates_mview (id); CREATE UNIQUE INDEX idx_post_aggregates_mview_id ON post_aggregates_mview (id);
create view post_view as CREATE VIEW post_view AS
with all_post as ( with all_post AS (
select SELECT
pa.* pa.*
from post_aggregates_view pa FROM
post_aggregates_view pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
AND cf.community_id = ap.community_id) AS subscribed,
(
SELECT
pr.id::bool
FROM
post_read pr
WHERE
u.id = pr.user_id
AND pr.post_id = ap.id) AS read,
(
SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;
union all CREATE VIEW post_mview AS
with all_post AS (
select SELECT
ap.*, pa.*
null as user_id, FROM
null as my_vote, post_aggregates_mview pa
null as subscribed,
null as read,
null as saved
from all_post ap
;
create view post_mview as
with all_post as (
select
pa.*
from post_aggregates_mview pa
) )
select SELECT
ap.*, ap.*,
u.id as user_id, u.id AS user_id,
coalesce(pl.score, 0) as my_vote, coalesce(pl.score, 0) AS my_vote,
(select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, (
(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, SELECT
(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved cf.id::bool
from user_ u FROM
cross join all_post ap community_follower cf
left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id WHERE
u.id = cf.user_id
union all AND cf.community_id = ap.community_id) AS subscribed,
(
select SELECT
ap.*, pr.id::bool
null as user_id, FROM
null as my_vote, post_read pr
null as subscribed, WHERE
null as read, u.id = pr.user_id
null as saved AND pr.post_id = ap.id) AS read,
from all_post ap (
; SELECT
ps.id::bool
FROM
post_saved ps
WHERE
u.id = ps.user_id
AND ps.post_id = ap.id) AS saved
FROM
user_ u
CROSS JOIN all_post ap
LEFT JOIN post_like pl ON u.id = pl.user_id
AND ap.id = pl.post_id
UNION ALL
SELECT
ap.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
all_post ap;

View file

@ -1,16 +1,17 @@
drop table activity; DROP TABLE activity;
alter table user_ ALTER TABLE user_
drop column actor_id, DROP COLUMN actor_id,
drop column private_key, DROP COLUMN private_key,
drop column public_key, DROP COLUMN public_key,
drop column bio, DROP COLUMN bio,
drop column local, DROP COLUMN local,
drop column last_refreshed_at; DROP COLUMN last_refreshed_at;
ALTER TABLE community
DROP COLUMN actor_id,
DROP COLUMN private_key,
DROP COLUMN public_key,
DROP COLUMN local,
DROP COLUMN last_refreshed_at;
alter table community
drop column actor_id,
drop column private_key,
drop column public_key,
drop column local,
drop column last_refreshed_at;

View file

@ -1,36 +1,35 @@
-- The Activitypub activity table -- The Activitypub activity table
-- All user actions must create a row here. -- All user actions must create a row here.
create table activity ( CREATE TABLE activity (
id serial primary key, id serial PRIMARY KEY,
user_id int references user_ on update cascade on delete cascade not null, -- Ensures that the user is set up here. user_id int REFERENCES user_ ON UPDATE CASCADE ON DELETE CASCADE NOT NULL, -- Ensures that the user is set up here.
data jsonb not null, data jsonb NOT NULL,
local boolean not null default true, local boolean NOT NULL DEFAULT TRUE,
published timestamp not null default now(), published timestamp NOT NULL DEFAULT now(),
updated timestamp updated timestamp
); );
-- Making sure that id is unique -- Making sure that id is unique
create unique index idx_activity_unique_apid on activity ((data ->> 'id'::text)); CREATE UNIQUE INDEX idx_activity_unique_apid ON activity ((data ->> 'id'::text));
-- Add federation columns to the two actor tables -- Add federation columns to the two actor tables
alter table user_ ALTER TABLE user_
-- TODO uniqueness constraints should be added on these 3 columns later -- TODO uniqueness constraints should be added on these 3 columns later
add column actor_id character varying(255) not null default 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local ADD COLUMN actor_id character varying(255) NOT NULL DEFAULT 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local
add column bio text, -- not on community, already has description ADD COLUMN bio text, -- not on community, already has description
add column local boolean not null default true, ADD COLUMN local boolean NOT NULL DEFAULT TRUE,
add column private_key text, -- These need to be generated from code ADD COLUMN private_key text, -- These need to be generated from code
add column public_key text, ADD COLUMN public_key text,
add column last_refreshed_at timestamp not null default now() -- Used to re-fetch federated actor periodically ADD COLUMN last_refreshed_at timestamp NOT NULL DEFAULT now() -- Used to re-fetch federated actor periodically
; ;
-- Community -- Community
alter table community ALTER TABLE community
add column actor_id character varying(255) not null default 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local ADD COLUMN actor_id character varying(255) NOT NULL DEFAULT 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local
add column local boolean not null default true, ADD COLUMN local boolean NOT NULL DEFAULT TRUE,
add column private_key text, -- These need to be generated from code ADD COLUMN private_key text, -- These need to be generated from code
add column public_key text, ADD COLUMN public_key text,
add column last_refreshed_at timestamp not null default now() -- Used to re-fetch federated actor periodically ADD COLUMN last_refreshed_at timestamp NOT NULL DEFAULT now() -- Used to re-fetch federated actor periodically
; ;
-- Don't worry about rebuilding the views right now. -- Don't worry about rebuilding the views right now.

View file

@ -1,7 +1,8 @@
alter table post ALTER TABLE post
drop column ap_id, DROP COLUMN ap_id,
drop column local; DROP COLUMN local;
ALTER TABLE comment
DROP COLUMN ap_id,
DROP COLUMN local;
alter table comment
drop column ap_id,
drop column local;

View file

@ -1,14 +1,11 @@
-- Add federation columns to post, comment -- Add federation columns to post, comment
ALTER TABLE post
alter table post
-- TODO uniqueness constraints should be added on these 3 columns later -- TODO uniqueness constraints should be added on these 3 columns later
add column ap_id character varying(255) not null default 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local ADD COLUMN ap_id character varying(255) NOT NULL DEFAULT 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local
add column local boolean not null default true ADD COLUMN local boolean NOT NULL DEFAULT TRUE;
;
alter table comment ALTER TABLE comment
-- TODO uniqueness constraints should be added on these 3 columns later -- TODO uniqueness constraints should be added on these 3 columns later
add column ap_id character varying(255) not null default 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local ADD COLUMN ap_id character varying(255) NOT NULL DEFAULT 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local
add column local boolean not null default true ADD COLUMN local boolean NOT NULL DEFAULT TRUE;
;

View file

@ -1,36 +1,69 @@
-- User table -- User table
drop view user_view cascade; DROP VIEW user_view CASCADE;
alter table user_ ALTER TABLE user_
add column fedi_name varchar(40) not null default 'http://fake.com'; ADD COLUMN fedi_name varchar(40) NOT NULL DEFAULT 'http://fake.com';
alter table user_ ALTER TABLE user_
add constraint user__name_fedi_name_key unique (name, fedi_name); ADD CONSTRAINT user__name_fedi_name_key UNIQUE (name, fedi_name);
-- Community -- Community
alter table community ALTER TABLE community
add constraint community_name_key unique (name); ADD CONSTRAINT community_name_key UNIQUE (name);
CREATE VIEW user_view AS
SELECT
u.id,
u.name,
u.avatar,
u.email,
u.matrix_user_id,
u.fedi_name,
u.admin,
u.banned,
u.show_avatars,
u.send_notifications_to_email,
u.published,
(
SELECT
count(*)
FROM
post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;
create view user_view as CREATE MATERIALIZED VIEW user_mview AS
select SELECT
u.id, *
u.name, FROM
u.avatar, user_view;
u.email,
u.matrix_user_id,
u.fedi_name,
u.admin,
u.banned,
u.show_avatars,
u.send_notifications_to_email,
u.published,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts,
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score,
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments,
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score
from user_ u;
create materialized view user_mview as select * from user_view; CREATE UNIQUE INDEX idx_user_mview_id ON user_mview (id);
create unique index idx_user_mview_id on user_mview (id);

View file

@ -1,38 +1,70 @@
-- User table -- User table
-- Need to regenerate user_view, user_mview -- Need to regenerate user_view, user_mview
drop view user_view cascade; DROP VIEW user_view CASCADE;
-- Remove the fedi_name constraint, drop that useless column -- Remove the fedi_name constraint, drop that useless column
alter table user_ ALTER TABLE user_
drop constraint user__name_fedi_name_key; DROP CONSTRAINT user__name_fedi_name_key;
alter table user_ ALTER TABLE user_
drop column fedi_name; DROP COLUMN fedi_name;
-- Community -- Community
alter table community ALTER TABLE community
drop constraint community_name_key; DROP CONSTRAINT community_name_key;
create view user_view as CREATE VIEW user_view AS
select SELECT
u.id, u.id,
u.name, u.name,
u.avatar, u.avatar,
u.email, u.email,
u.matrix_user_id, u.matrix_user_id,
u.admin, u.admin,
u.banned, u.banned,
u.show_avatars, u.show_avatars,
u.send_notifications_to_email, u.send_notifications_to_email,
u.published, u.published,
(select count(*) from post p where p.creator_id = u.id) as number_of_posts, (
(select coalesce(sum(score), 0) from post p, post_like pl where u.id = p.creator_id and p.id = pl.post_id) as post_score, SELECT
(select count(*) from comment c where c.creator_id = u.id) as number_of_comments, count(*)
(select coalesce(sum(score), 0) from comment c, comment_like cl where u.id = c.creator_id and c.id = cl.comment_id) as comment_score FROM
from user_ u; post p
WHERE
p.creator_id = u.id) AS number_of_posts,
(
SELECT
coalesce(sum(score), 0)
FROM
post p,
post_like pl
WHERE
u.id = p.creator_id
AND p.id = pl.post_id) AS post_score,
(
SELECT
count(*)
FROM
comment c
WHERE
c.creator_id = u.id) AS number_of_comments,
(
SELECT
coalesce(sum(score), 0)
FROM
comment c,
comment_like cl
WHERE
u.id = c.creator_id
AND c.id = cl.comment_id) AS comment_score
FROM
user_ u;
create materialized view user_mview as select * from user_view; CREATE MATERIALIZED VIEW user_mview AS
SELECT
*
FROM
user_view;
create unique index idx_user_mview_id on user_mview (id); CREATE UNIQUE INDEX idx_user_mview_id ON user_mview (id);

View file

@ -1,4 +1,5 @@
-- The username index -- The username index
drop index idx_user_name_lower_actor_id; DROP INDEX idx_user_name_lower_actor_id;
create unique index idx_user_name_lower on user_ (lower(name));
CREATE UNIQUE INDEX idx_user_name_lower ON user_ (lower(name));

View file

@ -1,2 +1,4 @@
drop index idx_user_name_lower; DROP INDEX idx_user_name_lower;
create unique index idx_user_name_lower_actor_id on user_ (lower(name), lower(actor_id));
CREATE UNIQUE INDEX idx_user_name_lower_actor_id ON user_ (lower(name), lower(actor_id));

View file

@ -1,21 +1,28 @@
drop materialized view private_message_mview; DROP MATERIALIZED VIEW private_message_mview;
drop view private_message_view;
alter table private_message DROP VIEW private_message_view;
drop column ap_id,
drop column local;
create view private_message_view as ALTER TABLE private_message
select DROP COLUMN ap_id,
pm.*, DROP COLUMN local;
u.name as creator_name,
u.avatar as creator_avatar,
u2.name as recipient_name,
u2.avatar as recipient_avatar
from private_message pm
inner join user_ u on u.id = pm.creator_id
inner join user_ u2 on u2.id = pm.recipient_id;
create materialized view private_message_mview as select * from private_message_view; CREATE VIEW private_message_view AS
SELECT
pm.*,
u.name AS creator_name,
u.avatar AS creator_avatar,
u2.name AS recipient_name,
u2.avatar AS recipient_avatar
FROM
private_message pm
INNER JOIN user_ u ON u.id = pm.creator_id
INNER JOIN user_ u2 ON u2.id = pm.recipient_id;
CREATE MATERIALIZED VIEW private_message_mview AS
SELECT
*
FROM
private_message_view;
CREATE UNIQUE INDEX idx_private_message_mview_id ON private_message_mview (id);
create unique index idx_private_message_mview_id on private_message_mview (id);

View file

@ -1,25 +1,32 @@
alter table private_message ALTER TABLE private_message
add column ap_id character varying(255) not null default 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local ADD COLUMN ap_id character varying(255) NOT NULL DEFAULT 'http://fake.com', -- This needs to be checked and updated in code, building from the site url if local
add column local boolean not null default true ADD COLUMN local boolean NOT NULL DEFAULT TRUE;
;
drop materialized view private_message_mview; DROP MATERIALIZED VIEW private_message_mview;
drop view private_message_view;
create view private_message_view as
select
pm.*,
u.name as creator_name,
u.avatar as creator_avatar,
u.actor_id as creator_actor_id,
u.local as creator_local,
u2.name as recipient_name,
u2.avatar as recipient_avatar,
u2.actor_id as recipient_actor_id,
u2.local as recipient_local
from private_message pm
inner join user_ u on u.id = pm.creator_id
inner join user_ u2 on u2.id = pm.recipient_id;
create materialized view private_message_mview as select * from private_message_view; DROP VIEW private_message_view;
CREATE VIEW private_message_view AS
SELECT
pm.*,
u.name AS creator_name,
u.avatar AS creator_avatar,
u.actor_id AS creator_actor_id,
u.local AS creator_local,
u2.name AS recipient_name,
u2.avatar AS recipient_avatar,
u2.actor_id AS recipient_actor_id,
u2.local AS recipient_local
FROM
private_message pm
INNER JOIN user_ u ON u.id = pm.creator_id
INNER JOIN user_ u2 ON u2.id = pm.recipient_id;
CREATE MATERIALIZED VIEW private_message_mview AS
SELECT
*
FROM
private_message_view;
CREATE UNIQUE INDEX idx_private_message_mview_id ON private_message_mview (id);
create unique index idx_private_message_mview_id on private_message_mview (id);

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,115 +1,145 @@
drop view user_mention_view; DROP VIEW user_mention_view;
drop view reply_fast_view;
drop view comment_fast_view;
drop view comment_view;
drop view user_mention_fast_view; DROP VIEW reply_fast_view;
drop table comment_aggregates_fast;
drop view comment_aggregates_view;
create view comment_aggregates_view as DROP VIEW comment_fast_view;
select
ct.*,
-- community details
p.community_id,
c.actor_id as community_actor_id,
c."local" as community_local,
c."name" as community_name,
-- creator details
u.banned as banned,
coalesce(cb.id, 0)::bool as banned_from_community,
u.actor_id as creator_actor_id,
u.local as creator_local,
u.name as creator_name,
u.avatar as creator_avatar,
-- score details
coalesce(cl.total, 0) as score,
coalesce(cl.up, 0) as upvotes,
coalesce(cl.down, 0) as downvotes,
hot_rank(coalesce(cl.total, 0), ct.published) as hot_rank
from comment ct
left join post p on ct.post_id = p.id
left join community c on p.community_id = c.id
left join user_ u on ct.creator_id = u.id
left join community_user_ban cb on ct.creator_id = cb.user_id and p.id = ct.post_id and p.community_id = cb.community_id
left join (
select
l.comment_id as id,
sum(l.score) as total,
count(case when l.score = 1 then 1 else null end) as up,
count(case when l.score = -1 then 1 else null end) as down
from comment_like l
group by comment_id
) as cl on cl.id = ct.id;
create or replace view comment_view as ( DROP VIEW comment_view;
select
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_view cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all DROP VIEW user_mention_fast_view;
select DROP TABLE comment_aggregates_fast;
DROP VIEW comment_aggregates_view;
CREATE VIEW comment_aggregates_view AS
SELECT
ct.*,
-- community details
p.community_id,
c.actor_id AS community_actor_id,
c."local" AS community_local,
c."name" AS community_name,
-- creator details
u.banned AS banned,
coalesce(cb.id, 0)::bool AS banned_from_community,
u.actor_id AS creator_actor_id,
u.local AS creator_local,
u.name AS creator_name,
u.avatar AS creator_avatar,
-- score details
coalesce(cl.total, 0) AS score,
coalesce(cl.up, 0) AS upvotes,
coalesce(cl.down, 0) AS downvotes,
hot_rank (coalesce(cl.total, 0), ct.published) AS hot_rank
FROM
comment ct
LEFT JOIN post p ON ct.post_id = p.id
LEFT JOIN community c ON p.community_id = c.id
LEFT JOIN user_ u ON ct.creator_id = u.id
LEFT JOIN community_user_ban cb ON ct.creator_id = cb.user_id
AND p.id = ct.post_id
AND p.community_id = cb.community_id
LEFT JOIN (
SELECT
l.comment_id AS id,
sum(l.score) AS total,
count(
CASE WHEN l.score = 1 THEN
1
ELSE
NULL
END) AS up,
count(
CASE WHEN l.score = - 1 THEN
1
ELSE
NULL
END) AS down
FROM
comment_like l
GROUP BY
comment_id) AS cl ON cl.id = ct.id;
CREATE OR REPLACE VIEW comment_view AS (
SELECT
cav.*,
us.user_id AS user_id,
us.my_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_saved::bool AS saved
FROM
comment_aggregates_view cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*, cav.*,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as subscribed, NULL AS subscribed,
null as saved NULL AS saved
from comment_aggregates_view cav FROM
); comment_aggregates_view cav);
create table comment_aggregates_fast as select * from comment_aggregates_view; CREATE TABLE comment_aggregates_fast AS
alter table comment_aggregates_fast add primary key (id); SELECT
*
FROM
comment_aggregates_view;
create view comment_fast_view as ALTER TABLE comment_aggregates_fast
select ADD PRIMARY KEY (id);
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_fast cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all CREATE VIEW comment_fast_view AS
SELECT
select
cav.*, cav.*,
null as user_id, us.user_id AS user_id,
null as my_vote, us.my_vote AS my_vote,
null as subscribed, us.is_subbed::bool AS subscribed,
null as saved us.is_saved::bool AS saved
from comment_aggregates_fast cav; FROM
comment_aggregates_fast cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS saved
FROM
comment_aggregates_fast cav;
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.creator_actor_id, c.creator_actor_id,
c.creator_local, c.creator_local,
@ -137,15 +167,30 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_mention um, comment_view c actor_id
where um.comment_id = c.id; FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
create view user_mention_fast_view as CREATE VIEW user_mention_fast_view AS
select SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -169,26 +214,45 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
u.id as user_id, u.id AS user_id,
coalesce(cl.score, 0) as my_vote, coalesce(cl.score, 0) AS my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, (
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_ u actor_id
cross join ( FROM
select user_ u
ca.* WHERE
from comment_aggregates_fast ca u.id = um.recipient_id) AS recipient_actor_id,
) ac (
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id SELECT
left join user_mention um on um.comment_id = ac.id local
FROM
union all user_ u
WHERE
select u.id = um.recipient_id) AS recipient_local
FROM
user_ u
CROSS JOIN (
SELECT
ca.*
FROM
comment_aggregates_fast ca) ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
LEFT JOIN user_mention um ON um.comment_id = ac.id
UNION ALL
SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -212,177 +276,220 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as saved, NULL AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from comment_aggregates_fast ac actor_id
left join user_mention um on um.comment_id = ac.id FROM
; user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
comment_aggregates_fast ac
LEFT JOIN user_mention um ON um.comment_id = ac.id;
-- Do the reply_view referencing the comment_fast_view -- Do the reply_view referencing the comment_fast_view
create view reply_fast_view as CREATE VIEW reply_fast_view AS
with closereply as ( with closereply AS (
select SELECT
c2.id, c2.id,
c2.creator_id as sender_id, c2.creator_id AS sender_id,
c.creator_id as recipient_id c.creator_id AS recipient_id
from comment c FROM
inner join comment c2 on c.id = c2.parent_id comment c
where c2.creator_id != c.creator_id INNER JOIN comment c2 ON c.id = c2.parent_id
-- Do union where post is null WHERE
union c2.creator_id != c.creator_id
select -- Do union where post is null
c.id, UNION
c.creator_id as sender_id, SELECT
p.creator_id as recipient_id c.id,
from comment c, post p c.creator_id AS sender_id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_fast_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_fast_view cv,
closereply
WHERE
closereply.id = cv.id;
-- add creator_published to the post view -- add creator_published to the post view
drop view post_fast_view; DROP VIEW post_fast_view;
drop table post_aggregates_fast;
drop view post_view;
drop view post_aggregates_view;
create view post_aggregates_view as DROP TABLE post_aggregates_fast;
select
p.*,
-- creator details
u.actor_id as creator_actor_id,
u."local" as creator_local,
u."name" as creator_name,
u.avatar as creator_avatar,
u.banned as banned,
cb.id::bool as banned_from_community,
-- community details
c.actor_id as community_actor_id,
c."local" as community_local,
c."name" as community_name,
c.removed as community_removed,
c.deleted as community_deleted,
c.nsfw as community_nsfw,
-- post score data/comment count
coalesce(ct.comments, 0) as number_of_comments,
coalesce(pl.score, 0) as score,
coalesce(pl.upvotes, 0) as upvotes,
coalesce(pl.downvotes, 0) as downvotes,
hot_rank(
coalesce(pl.score , 0), (
case
when (p.published < ('now'::timestamp - '1 month'::interval))
then p.published
else greatest(ct.recent_comment_time, p.published)
end
)
) as hot_rank,
(
case
when (p.published < ('now'::timestamp - '1 month'::interval))
then p.published
else greatest(ct.recent_comment_time, p.published)
end
) as newest_activity_time
from post p
left join user_ u on p.creator_id = u.id
left join community_user_ban cb on p.creator_id = cb.user_id and p.community_id = cb.community_id
left join community c on p.community_id = c.id
left join (
select
post_id,
count(*) as comments,
max(published) as recent_comment_time
from comment
group by post_id
) ct on ct.post_id = p.id
left join (
select
post_id,
sum(score) as score,
sum(score) filter (where score = 1) as upvotes,
-sum(score) filter (where score = -1) as downvotes
from post_like
group by post_id
) pl on pl.post_id = p.id
order by p.id;
create view post_view as DROP VIEW post_view;
select
pav.*,
us.id as user_id,
us.user_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_read::bool as read,
us.is_saved::bool as saved
from post_aggregates_view pav
cross join lateral (
select
u.id,
coalesce(cf.community_id, 0) as is_subbed,
coalesce(pr.post_id, 0) as is_read,
coalesce(ps.post_id, 0) as is_saved,
coalesce(pl.score, 0) as user_vote
from user_ u
left join community_user_ban cb on u.id = cb.user_id and cb.community_id = pav.community_id
left join community_follower cf on u.id = cf.user_id and cf.community_id = pav.community_id
left join post_read pr on u.id = pr.user_id and pr.post_id = pav.id
left join post_saved ps on u.id = ps.user_id and ps.post_id = pav.id
left join post_like pl on u.id = pl.user_id and pav.id = pl.post_id
) as us
union all DROP VIEW post_aggregates_view;
select CREATE VIEW post_aggregates_view AS
pav.*, SELECT
null as user_id, p.*,
null as my_vote, -- creator details
null as subscribed, u.actor_id AS creator_actor_id,
null as read, u."local" AS creator_local,
null as saved u."name" AS creator_name,
from post_aggregates_view pav; u.avatar AS creator_avatar,
u.banned AS banned,
cb.id::bool AS banned_from_community,
-- community details
c.actor_id AS community_actor_id,
c."local" AS community_local,
c."name" AS community_name,
c.removed AS community_removed,
c.deleted AS community_deleted,
c.nsfw AS community_nsfw,
-- post score data/comment count
coalesce(ct.comments, 0) AS number_of_comments,
coalesce(pl.score, 0) AS score,
coalesce(pl.upvotes, 0) AS upvotes,
coalesce(pl.downvotes, 0) AS downvotes,
hot_rank (coalesce(pl.score, 0), (
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published
ELSE
greatest (ct.recent_comment_time, p.published)
END)) AS hot_rank,
(
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published
ELSE
greatest (ct.recent_comment_time, p.published)
END) AS newest_activity_time
FROM
post p
LEFT JOIN user_ u ON p.creator_id = u.id
LEFT JOIN community_user_ban cb ON p.creator_id = cb.user_id
AND p.community_id = cb.community_id
LEFT JOIN community c ON p.community_id = c.id
LEFT JOIN (
SELECT
post_id,
count(*) AS comments,
max(published) AS recent_comment_time
FROM
comment
GROUP BY
post_id) ct ON ct.post_id = p.id
LEFT JOIN (
SELECT
post_id,
sum(score) AS score,
sum(score) FILTER (WHERE score = 1) AS upvotes,
- sum(score) FILTER (WHERE score = - 1) AS downvotes
FROM
post_like
GROUP BY
post_id) pl ON pl.post_id = p.id
ORDER BY
p.id;
create table post_aggregates_fast as select * from post_aggregates_view; CREATE VIEW post_view AS
alter table post_aggregates_fast add primary key (id); SELECT
pav.*,
us.id AS user_id,
us.user_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_read::bool AS read,
us.is_saved::bool AS saved
FROM
post_aggregates_view pav
CROSS JOIN LATERAL (
SELECT
u.id,
coalesce(cf.community_id, 0) AS is_subbed,
coalesce(pr.post_id, 0) AS is_read,
coalesce(ps.post_id, 0) AS is_saved,
coalesce(pl.score, 0) AS user_vote
FROM
user_ u
LEFT JOIN community_user_ban cb ON u.id = cb.user_id
AND cb.community_id = pav.community_id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cf.community_id = pav.community_id
LEFT JOIN post_read pr ON u.id = pr.user_id
AND pr.post_id = pav.id
LEFT JOIN post_saved ps ON u.id = ps.user_id
AND ps.post_id = pav.id
LEFT JOIN post_like pl ON u.id = pl.user_id
AND pav.id = pl.post_id) AS us
UNION ALL
SELECT
pav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
post_aggregates_view pav;
create view post_fast_view as CREATE TABLE post_aggregates_fast AS
select SELECT
pav.*, *
us.id as user_id, FROM
us.user_vote as my_vote, post_aggregates_view;
us.is_subbed::bool as subscribed,
us.is_read::bool as read,
us.is_saved::bool as saved
from post_aggregates_fast pav
cross join lateral (
select
u.id,
coalesce(cf.community_id, 0) as is_subbed,
coalesce(pr.post_id, 0) as is_read,
coalesce(ps.post_id, 0) as is_saved,
coalesce(pl.score, 0) as user_vote
from user_ u
left join community_user_ban cb on u.id = cb.user_id and cb.community_id = pav.community_id
left join community_follower cf on u.id = cf.user_id and cf.community_id = pav.community_id
left join post_read pr on u.id = pr.user_id and pr.post_id = pav.id
left join post_saved ps on u.id = ps.user_id and ps.post_id = pav.id
left join post_like pl on u.id = pl.user_id and pav.id = pl.post_id
) as us
union all ALTER TABLE post_aggregates_fast
ADD PRIMARY KEY (id);
CREATE VIEW post_fast_view AS
SELECT
pav.*,
us.id AS user_id,
us.user_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_read::bool AS read,
us.is_saved::bool AS saved
FROM
post_aggregates_fast pav
CROSS JOIN LATERAL (
SELECT
u.id,
coalesce(cf.community_id, 0) AS is_subbed,
coalesce(pr.post_id, 0) AS is_read,
coalesce(ps.post_id, 0) AS is_saved,
coalesce(pl.score, 0) AS user_vote
FROM
user_ u
LEFT JOIN community_user_ban cb ON u.id = cb.user_id
AND cb.community_id = pav.community_id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cf.community_id = pav.community_id
LEFT JOIN post_read pr ON u.id = pr.user_id
AND pr.post_id = pav.id
LEFT JOIN post_saved ps ON u.id = ps.user_id
AND ps.post_id = pav.id
LEFT JOIN post_like pl ON u.id = pl.user_id
AND pav.id = pl.post_id) AS us
UNION ALL
SELECT
pav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
post_aggregates_fast pav;
select
pav.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from post_aggregates_fast pav;

View file

@ -1,116 +1,146 @@
drop view user_mention_view; DROP VIEW user_mention_view;
drop view reply_fast_view;
drop view comment_fast_view;
drop view comment_view;
drop view user_mention_fast_view; DROP VIEW reply_fast_view;
drop table comment_aggregates_fast;
drop view comment_aggregates_view;
create view comment_aggregates_view as DROP VIEW comment_fast_view;
select
ct.*,
-- community details
p.community_id,
c.actor_id as community_actor_id,
c."local" as community_local,
c."name" as community_name,
-- creator details
u.banned as banned,
coalesce(cb.id, 0)::bool as banned_from_community,
u.actor_id as creator_actor_id,
u.local as creator_local,
u.name as creator_name,
u.published as creator_published,
u.avatar as creator_avatar,
-- score details
coalesce(cl.total, 0) as score,
coalesce(cl.up, 0) as upvotes,
coalesce(cl.down, 0) as downvotes,
hot_rank(coalesce(cl.total, 0), ct.published) as hot_rank
from comment ct
left join post p on ct.post_id = p.id
left join community c on p.community_id = c.id
left join user_ u on ct.creator_id = u.id
left join community_user_ban cb on ct.creator_id = cb.user_id and p.id = ct.post_id and p.community_id = cb.community_id
left join (
select
l.comment_id as id,
sum(l.score) as total,
count(case when l.score = 1 then 1 else null end) as up,
count(case when l.score = -1 then 1 else null end) as down
from comment_like l
group by comment_id
) as cl on cl.id = ct.id;
create or replace view comment_view as ( DROP VIEW comment_view;
select
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_view cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all DROP VIEW user_mention_fast_view;
select DROP TABLE comment_aggregates_fast;
DROP VIEW comment_aggregates_view;
CREATE VIEW comment_aggregates_view AS
SELECT
ct.*,
-- community details
p.community_id,
c.actor_id AS community_actor_id,
c."local" AS community_local,
c."name" AS community_name,
-- creator details
u.banned AS banned,
coalesce(cb.id, 0)::bool AS banned_from_community,
u.actor_id AS creator_actor_id,
u.local AS creator_local,
u.name AS creator_name,
u.published AS creator_published,
u.avatar AS creator_avatar,
-- score details
coalesce(cl.total, 0) AS score,
coalesce(cl.up, 0) AS upvotes,
coalesce(cl.down, 0) AS downvotes,
hot_rank (coalesce(cl.total, 0), ct.published) AS hot_rank
FROM
comment ct
LEFT JOIN post p ON ct.post_id = p.id
LEFT JOIN community c ON p.community_id = c.id
LEFT JOIN user_ u ON ct.creator_id = u.id
LEFT JOIN community_user_ban cb ON ct.creator_id = cb.user_id
AND p.id = ct.post_id
AND p.community_id = cb.community_id
LEFT JOIN (
SELECT
l.comment_id AS id,
sum(l.score) AS total,
count(
CASE WHEN l.score = 1 THEN
1
ELSE
NULL
END) AS up,
count(
CASE WHEN l.score = - 1 THEN
1
ELSE
NULL
END) AS down
FROM
comment_like l
GROUP BY
comment_id) AS cl ON cl.id = ct.id;
CREATE OR REPLACE VIEW comment_view AS (
SELECT
cav.*,
us.user_id AS user_id,
us.my_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_saved::bool AS saved
FROM
comment_aggregates_view cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*, cav.*,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as subscribed, NULL AS subscribed,
null as saved NULL AS saved
from comment_aggregates_view cav FROM
); comment_aggregates_view cav);
create table comment_aggregates_fast as select * from comment_aggregates_view; CREATE TABLE comment_aggregates_fast AS
alter table comment_aggregates_fast add primary key (id); SELECT
*
FROM
comment_aggregates_view;
create view comment_fast_view as ALTER TABLE comment_aggregates_fast
select ADD PRIMARY KEY (id);
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_fast cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all CREATE VIEW comment_fast_view AS
SELECT
select
cav.*, cav.*,
null as user_id, us.user_id AS user_id,
null as my_vote, us.my_vote AS my_vote,
null as subscribed, us.is_subbed::bool AS subscribed,
null as saved us.is_saved::bool AS saved
from comment_aggregates_fast cav; FROM
comment_aggregates_fast cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS saved
FROM
comment_aggregates_fast cav;
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.creator_actor_id, c.creator_actor_id,
c.creator_local, c.creator_local,
@ -138,15 +168,30 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_mention um, comment_view c actor_id
where um.comment_id = c.id; FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
create view user_mention_fast_view as CREATE VIEW user_mention_fast_view AS
select SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -170,26 +215,45 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
u.id as user_id, u.id AS user_id,
coalesce(cl.score, 0) as my_vote, coalesce(cl.score, 0) AS my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, (
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_ u actor_id
cross join ( FROM
select user_ u
ca.* WHERE
from comment_aggregates_fast ca u.id = um.recipient_id) AS recipient_actor_id,
) ac (
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id SELECT
left join user_mention um on um.comment_id = ac.id local
FROM
union all user_ u
WHERE
select u.id = um.recipient_id) AS recipient_local
FROM
user_ u
CROSS JOIN (
SELECT
ca.*
FROM
comment_aggregates_fast ca) ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
LEFT JOIN user_mention um ON um.comment_id = ac.id
UNION ALL
SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -213,178 +277,221 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as saved, NULL AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from comment_aggregates_fast ac actor_id
left join user_mention um on um.comment_id = ac.id FROM
; user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
comment_aggregates_fast ac
LEFT JOIN user_mention um ON um.comment_id = ac.id;
-- Do the reply_view referencing the comment_fast_view -- Do the reply_view referencing the comment_fast_view
create view reply_fast_view as CREATE VIEW reply_fast_view AS
with closereply as ( with closereply AS (
select SELECT
c2.id, c2.id,
c2.creator_id as sender_id, c2.creator_id AS sender_id,
c.creator_id as recipient_id c.creator_id AS recipient_id
from comment c FROM
inner join comment c2 on c.id = c2.parent_id comment c
where c2.creator_id != c.creator_id INNER JOIN comment c2 ON c.id = c2.parent_id
-- Do union where post is null WHERE
union c2.creator_id != c.creator_id
select -- Do union where post is null
c.id, UNION
c.creator_id as sender_id, SELECT
p.creator_id as recipient_id c.id,
from comment c, post p c.creator_id AS sender_id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_fast_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_fast_view cv,
closereply
WHERE
closereply.id = cv.id;
-- add creator_published to the post view -- add creator_published to the post view
drop view post_fast_view; DROP VIEW post_fast_view;
drop table post_aggregates_fast;
drop view post_view;
drop view post_aggregates_view;
create view post_aggregates_view as DROP TABLE post_aggregates_fast;
select
p.*,
-- creator details
u.actor_id as creator_actor_id,
u."local" as creator_local,
u."name" as creator_name,
u.published as creator_published,
u.avatar as creator_avatar,
u.banned as banned,
cb.id::bool as banned_from_community,
-- community details
c.actor_id as community_actor_id,
c."local" as community_local,
c."name" as community_name,
c.removed as community_removed,
c.deleted as community_deleted,
c.nsfw as community_nsfw,
-- post score data/comment count
coalesce(ct.comments, 0) as number_of_comments,
coalesce(pl.score, 0) as score,
coalesce(pl.upvotes, 0) as upvotes,
coalesce(pl.downvotes, 0) as downvotes,
hot_rank(
coalesce(pl.score , 0), (
case
when (p.published < ('now'::timestamp - '1 month'::interval))
then p.published
else greatest(ct.recent_comment_time, p.published)
end
)
) as hot_rank,
(
case
when (p.published < ('now'::timestamp - '1 month'::interval))
then p.published
else greatest(ct.recent_comment_time, p.published)
end
) as newest_activity_time
from post p
left join user_ u on p.creator_id = u.id
left join community_user_ban cb on p.creator_id = cb.user_id and p.community_id = cb.community_id
left join community c on p.community_id = c.id
left join (
select
post_id,
count(*) as comments,
max(published) as recent_comment_time
from comment
group by post_id
) ct on ct.post_id = p.id
left join (
select
post_id,
sum(score) as score,
sum(score) filter (where score = 1) as upvotes,
-sum(score) filter (where score = -1) as downvotes
from post_like
group by post_id
) pl on pl.post_id = p.id
order by p.id;
create view post_view as DROP VIEW post_view;
select
pav.*,
us.id as user_id,
us.user_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_read::bool as read,
us.is_saved::bool as saved
from post_aggregates_view pav
cross join lateral (
select
u.id,
coalesce(cf.community_id, 0) as is_subbed,
coalesce(pr.post_id, 0) as is_read,
coalesce(ps.post_id, 0) as is_saved,
coalesce(pl.score, 0) as user_vote
from user_ u
left join community_user_ban cb on u.id = cb.user_id and cb.community_id = pav.community_id
left join community_follower cf on u.id = cf.user_id and cf.community_id = pav.community_id
left join post_read pr on u.id = pr.user_id and pr.post_id = pav.id
left join post_saved ps on u.id = ps.user_id and ps.post_id = pav.id
left join post_like pl on u.id = pl.user_id and pav.id = pl.post_id
) as us
union all DROP VIEW post_aggregates_view;
select CREATE VIEW post_aggregates_view AS
pav.*, SELECT
null as user_id, p.*,
null as my_vote, -- creator details
null as subscribed, u.actor_id AS creator_actor_id,
null as read, u."local" AS creator_local,
null as saved u."name" AS creator_name,
from post_aggregates_view pav; u.published AS creator_published,
u.avatar AS creator_avatar,
u.banned AS banned,
cb.id::bool AS banned_from_community,
-- community details
c.actor_id AS community_actor_id,
c."local" AS community_local,
c."name" AS community_name,
c.removed AS community_removed,
c.deleted AS community_deleted,
c.nsfw AS community_nsfw,
-- post score data/comment count
coalesce(ct.comments, 0) AS number_of_comments,
coalesce(pl.score, 0) AS score,
coalesce(pl.upvotes, 0) AS upvotes,
coalesce(pl.downvotes, 0) AS downvotes,
hot_rank (coalesce(pl.score, 0), (
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published
ELSE
greatest (ct.recent_comment_time, p.published)
END)) AS hot_rank,
(
CASE WHEN (p.published < ('now'::timestamp - '1 month'::interval)) THEN
p.published
ELSE
greatest (ct.recent_comment_time, p.published)
END) AS newest_activity_time
FROM
post p
LEFT JOIN user_ u ON p.creator_id = u.id
LEFT JOIN community_user_ban cb ON p.creator_id = cb.user_id
AND p.community_id = cb.community_id
LEFT JOIN community c ON p.community_id = c.id
LEFT JOIN (
SELECT
post_id,
count(*) AS comments,
max(published) AS recent_comment_time
FROM
comment
GROUP BY
post_id) ct ON ct.post_id = p.id
LEFT JOIN (
SELECT
post_id,
sum(score) AS score,
sum(score) FILTER (WHERE score = 1) AS upvotes,
- sum(score) FILTER (WHERE score = - 1) AS downvotes
FROM
post_like
GROUP BY
post_id) pl ON pl.post_id = p.id
ORDER BY
p.id;
create table post_aggregates_fast as select * from post_aggregates_view; CREATE VIEW post_view AS
alter table post_aggregates_fast add primary key (id); SELECT
pav.*,
us.id AS user_id,
us.user_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_read::bool AS read,
us.is_saved::bool AS saved
FROM
post_aggregates_view pav
CROSS JOIN LATERAL (
SELECT
u.id,
coalesce(cf.community_id, 0) AS is_subbed,
coalesce(pr.post_id, 0) AS is_read,
coalesce(ps.post_id, 0) AS is_saved,
coalesce(pl.score, 0) AS user_vote
FROM
user_ u
LEFT JOIN community_user_ban cb ON u.id = cb.user_id
AND cb.community_id = pav.community_id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cf.community_id = pav.community_id
LEFT JOIN post_read pr ON u.id = pr.user_id
AND pr.post_id = pav.id
LEFT JOIN post_saved ps ON u.id = ps.user_id
AND ps.post_id = pav.id
LEFT JOIN post_like pl ON u.id = pl.user_id
AND pav.id = pl.post_id) AS us
UNION ALL
SELECT
pav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
post_aggregates_view pav;
create view post_fast_view as CREATE TABLE post_aggregates_fast AS
select SELECT
pav.*, *
us.id as user_id, FROM
us.user_vote as my_vote, post_aggregates_view;
us.is_subbed::bool as subscribed,
us.is_read::bool as read,
us.is_saved::bool as saved
from post_aggregates_fast pav
cross join lateral (
select
u.id,
coalesce(cf.community_id, 0) as is_subbed,
coalesce(pr.post_id, 0) as is_read,
coalesce(ps.post_id, 0) as is_saved,
coalesce(pl.score, 0) as user_vote
from user_ u
left join community_user_ban cb on u.id = cb.user_id and cb.community_id = pav.community_id
left join community_follower cf on u.id = cf.user_id and cf.community_id = pav.community_id
left join post_read pr on u.id = pr.user_id and pr.post_id = pav.id
left join post_saved ps on u.id = ps.user_id and ps.post_id = pav.id
left join post_like pl on u.id = pl.user_id and pav.id = pl.post_id
) as us
union all ALTER TABLE post_aggregates_fast
ADD PRIMARY KEY (id);
CREATE VIEW post_fast_view AS
SELECT
pav.*,
us.id AS user_id,
us.user_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_read::bool AS read,
us.is_saved::bool AS saved
FROM
post_aggregates_fast pav
CROSS JOIN LATERAL (
SELECT
u.id,
coalesce(cf.community_id, 0) AS is_subbed,
coalesce(pr.post_id, 0) AS is_read,
coalesce(ps.post_id, 0) AS is_saved,
coalesce(pl.score, 0) AS user_vote
FROM
user_ u
LEFT JOIN community_user_ban cb ON u.id = cb.user_id
AND cb.community_id = pav.community_id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cf.community_id = pav.community_id
LEFT JOIN post_read pr ON u.id = pr.user_id
AND pr.post_id = pav.id
LEFT JOIN post_saved ps ON u.id = ps.user_id
AND ps.post_id = pav.id
LEFT JOIN post_like pl ON u.id = pl.user_id
AND pav.id = pl.post_id) AS us
UNION ALL
SELECT
pav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS read,
NULL AS saved
FROM
post_aggregates_fast pav;
select
pav.*,
null as user_id,
null as my_vote,
null as subscribed,
null as read,
null as saved
from post_aggregates_fast pav;

View file

@ -1,116 +1,146 @@
drop view user_mention_view; DROP VIEW user_mention_view;
drop view reply_fast_view;
drop view comment_fast_view;
drop view comment_view;
drop view user_mention_fast_view; DROP VIEW reply_fast_view;
drop table comment_aggregates_fast;
drop view comment_aggregates_view;
create view comment_aggregates_view as DROP VIEW comment_fast_view;
select
ct.*,
-- community details
p.community_id,
c.actor_id as community_actor_id,
c."local" as community_local,
c."name" as community_name,
-- creator details
u.banned as banned,
coalesce(cb.id, 0)::bool as banned_from_community,
u.actor_id as creator_actor_id,
u.local as creator_local,
u.name as creator_name,
u.published as creator_published,
u.avatar as creator_avatar,
-- score details
coalesce(cl.total, 0) as score,
coalesce(cl.up, 0) as upvotes,
coalesce(cl.down, 0) as downvotes,
hot_rank(coalesce(cl.total, 0), ct.published) as hot_rank
from comment ct
left join post p on ct.post_id = p.id
left join community c on p.community_id = c.id
left join user_ u on ct.creator_id = u.id
left join community_user_ban cb on ct.creator_id = cb.user_id and p.id = ct.post_id and p.community_id = cb.community_id
left join (
select
l.comment_id as id,
sum(l.score) as total,
count(case when l.score = 1 then 1 else null end) as up,
count(case when l.score = -1 then 1 else null end) as down
from comment_like l
group by comment_id
) as cl on cl.id = ct.id;
create or replace view comment_view as ( DROP VIEW comment_view;
select
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_view cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all DROP VIEW user_mention_fast_view;
select DROP TABLE comment_aggregates_fast;
DROP VIEW comment_aggregates_view;
CREATE VIEW comment_aggregates_view AS
SELECT
ct.*,
-- community details
p.community_id,
c.actor_id AS community_actor_id,
c."local" AS community_local,
c."name" AS community_name,
-- creator details
u.banned AS banned,
coalesce(cb.id, 0)::bool AS banned_from_community,
u.actor_id AS creator_actor_id,
u.local AS creator_local,
u.name AS creator_name,
u.published AS creator_published,
u.avatar AS creator_avatar,
-- score details
coalesce(cl.total, 0) AS score,
coalesce(cl.up, 0) AS upvotes,
coalesce(cl.down, 0) AS downvotes,
hot_rank (coalesce(cl.total, 0), ct.published) AS hot_rank
FROM
comment ct
LEFT JOIN post p ON ct.post_id = p.id
LEFT JOIN community c ON p.community_id = c.id
LEFT JOIN user_ u ON ct.creator_id = u.id
LEFT JOIN community_user_ban cb ON ct.creator_id = cb.user_id
AND p.id = ct.post_id
AND p.community_id = cb.community_id
LEFT JOIN (
SELECT
l.comment_id AS id,
sum(l.score) AS total,
count(
CASE WHEN l.score = 1 THEN
1
ELSE
NULL
END) AS up,
count(
CASE WHEN l.score = - 1 THEN
1
ELSE
NULL
END) AS down
FROM
comment_like l
GROUP BY
comment_id) AS cl ON cl.id = ct.id;
CREATE OR REPLACE VIEW comment_view AS (
SELECT
cav.*,
us.user_id AS user_id,
us.my_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_saved::bool AS saved
FROM
comment_aggregates_view cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*, cav.*,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as subscribed, NULL AS subscribed,
null as saved NULL AS saved
from comment_aggregates_view cav FROM
); comment_aggregates_view cav);
create table comment_aggregates_fast as select * from comment_aggregates_view; CREATE TABLE comment_aggregates_fast AS
alter table comment_aggregates_fast add primary key (id); SELECT
*
FROM
comment_aggregates_view;
create view comment_fast_view as ALTER TABLE comment_aggregates_fast
select ADD PRIMARY KEY (id);
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_fast cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all CREATE VIEW comment_fast_view AS
SELECT
select
cav.*, cav.*,
null as user_id, us.user_id AS user_id,
null as my_vote, us.my_vote AS my_vote,
null as subscribed, us.is_subbed::bool AS subscribed,
null as saved us.is_saved::bool AS saved
from comment_aggregates_fast cav; FROM
comment_aggregates_fast cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS saved
FROM
comment_aggregates_fast cav;
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.creator_actor_id, c.creator_actor_id,
c.creator_local, c.creator_local,
@ -138,15 +168,30 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_mention um, comment_view c actor_id
where um.comment_id = c.id; FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
create view user_mention_fast_view as CREATE VIEW user_mention_fast_view AS
select SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -170,26 +215,45 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
u.id as user_id, u.id AS user_id,
coalesce(cl.score, 0) as my_vote, coalesce(cl.score, 0) AS my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, (
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_ u actor_id
cross join ( FROM
select user_ u
ca.* WHERE
from comment_aggregates_fast ca u.id = um.recipient_id) AS recipient_actor_id,
) ac (
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id SELECT
left join user_mention um on um.comment_id = ac.id local
FROM
union all user_ u
WHERE
select u.id = um.recipient_id) AS recipient_local
FROM
user_ u
CROSS JOIN (
SELECT
ca.*
FROM
comment_aggregates_fast ca) ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
LEFT JOIN user_mention um ON um.comment_id = ac.id
UNION ALL
SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -213,37 +277,60 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as saved, NULL AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from comment_aggregates_fast ac actor_id
left join user_mention um on um.comment_id = ac.id FROM
; user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
comment_aggregates_fast ac
LEFT JOIN user_mention um ON um.comment_id = ac.id;
-- Do the reply_view referencing the comment_fast_view -- Do the reply_view referencing the comment_fast_view
create view reply_fast_view as CREATE VIEW reply_fast_view AS
with closereply as ( with closereply AS (
select SELECT
c2.id, c2.id,
c2.creator_id as sender_id, c2.creator_id AS sender_id,
c.creator_id as recipient_id c.creator_id AS recipient_id
from comment c FROM
inner join comment c2 on c.id = c2.parent_id comment c
where c2.creator_id != c.creator_id INNER JOIN comment c2 ON c.id = c2.parent_id
-- Do union where post is null WHERE
union c2.creator_id != c.creator_id
select -- Do union where post is null
c.id, UNION
c.creator_id as sender_id, SELECT
p.creator_id as recipient_id c.id,
from comment c, post p c.creator_id AS sender_id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_fast_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_fast_view cv,
closereply
WHERE
closereply.id = cv.id;

View file

@ -1,118 +1,148 @@
drop view user_mention_view; DROP VIEW user_mention_view;
drop view reply_fast_view;
drop view comment_fast_view;
drop view comment_view;
drop view user_mention_fast_view; DROP VIEW reply_fast_view;
drop table comment_aggregates_fast;
drop view comment_aggregates_view;
create view comment_aggregates_view as DROP VIEW comment_fast_view;
select
ct.*,
-- post details
p."name" as post_name,
p.community_id,
-- community details
c.actor_id as community_actor_id,
c."local" as community_local,
c."name" as community_name,
-- creator details
u.banned as banned,
coalesce(cb.id, 0)::bool as banned_from_community,
u.actor_id as creator_actor_id,
u.local as creator_local,
u.name as creator_name,
u.published as creator_published,
u.avatar as creator_avatar,
-- score details
coalesce(cl.total, 0) as score,
coalesce(cl.up, 0) as upvotes,
coalesce(cl.down, 0) as downvotes,
hot_rank(coalesce(cl.total, 0), ct.published) as hot_rank
from comment ct
left join post p on ct.post_id = p.id
left join community c on p.community_id = c.id
left join user_ u on ct.creator_id = u.id
left join community_user_ban cb on ct.creator_id = cb.user_id and p.id = ct.post_id and p.community_id = cb.community_id
left join (
select
l.comment_id as id,
sum(l.score) as total,
count(case when l.score = 1 then 1 else null end) as up,
count(case when l.score = -1 then 1 else null end) as down
from comment_like l
group by comment_id
) as cl on cl.id = ct.id;
create or replace view comment_view as ( DROP VIEW comment_view;
select
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_view cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all DROP VIEW user_mention_fast_view;
select DROP TABLE comment_aggregates_fast;
DROP VIEW comment_aggregates_view;
CREATE VIEW comment_aggregates_view AS
SELECT
ct.*,
-- post details
p."name" AS post_name,
p.community_id,
-- community details
c.actor_id AS community_actor_id,
c."local" AS community_local,
c."name" AS community_name,
-- creator details
u.banned AS banned,
coalesce(cb.id, 0)::bool AS banned_from_community,
u.actor_id AS creator_actor_id,
u.local AS creator_local,
u.name AS creator_name,
u.published AS creator_published,
u.avatar AS creator_avatar,
-- score details
coalesce(cl.total, 0) AS score,
coalesce(cl.up, 0) AS upvotes,
coalesce(cl.down, 0) AS downvotes,
hot_rank (coalesce(cl.total, 0), ct.published) AS hot_rank
FROM
comment ct
LEFT JOIN post p ON ct.post_id = p.id
LEFT JOIN community c ON p.community_id = c.id
LEFT JOIN user_ u ON ct.creator_id = u.id
LEFT JOIN community_user_ban cb ON ct.creator_id = cb.user_id
AND p.id = ct.post_id
AND p.community_id = cb.community_id
LEFT JOIN (
SELECT
l.comment_id AS id,
sum(l.score) AS total,
count(
CASE WHEN l.score = 1 THEN
1
ELSE
NULL
END) AS up,
count(
CASE WHEN l.score = - 1 THEN
1
ELSE
NULL
END) AS down
FROM
comment_like l
GROUP BY
comment_id) AS cl ON cl.id = ct.id;
CREATE OR REPLACE VIEW comment_view AS (
SELECT
cav.*,
us.user_id AS user_id,
us.my_vote AS my_vote,
us.is_subbed::bool AS subscribed,
us.is_saved::bool AS saved
FROM
comment_aggregates_view cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*, cav.*,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as subscribed, NULL AS subscribed,
null as saved NULL AS saved
from comment_aggregates_view cav FROM
); comment_aggregates_view cav);
create table comment_aggregates_fast as select * from comment_aggregates_view; CREATE TABLE comment_aggregates_fast AS
alter table comment_aggregates_fast add primary key (id); SELECT
*
FROM
comment_aggregates_view;
create view comment_fast_view as ALTER TABLE comment_aggregates_fast
select ADD PRIMARY KEY (id);
cav.*,
us.user_id as user_id,
us.my_vote as my_vote,
us.is_subbed::bool as subscribed,
us.is_saved::bool as saved
from comment_aggregates_fast cav
cross join lateral (
select
u.id as user_id,
coalesce(cl.score, 0) as my_vote,
coalesce(cf.id, 0) as is_subbed,
coalesce(cs.id, 0) as is_saved
from user_ u
left join comment_like cl on u.id = cl.user_id and cav.id = cl.comment_id
left join comment_saved cs on u.id = cs.user_id and cs.comment_id = cav.id
left join community_follower cf on u.id = cf.user_id and cav.community_id = cf.community_id
) as us
union all CREATE VIEW comment_fast_view AS
SELECT
select
cav.*, cav.*,
null as user_id, us.user_id AS user_id,
null as my_vote, us.my_vote AS my_vote,
null as subscribed, us.is_subbed::bool AS subscribed,
null as saved us.is_saved::bool AS saved
from comment_aggregates_fast cav; FROM
comment_aggregates_fast cav
CROSS JOIN LATERAL (
SELECT
u.id AS user_id,
coalesce(cl.score, 0) AS my_vote,
coalesce(cf.id, 0) AS is_subbed,
coalesce(cs.id, 0) AS is_saved
FROM
user_ u
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND cav.id = cl.comment_id
LEFT JOIN comment_saved cs ON u.id = cs.user_id
AND cs.comment_id = cav.id
LEFT JOIN community_follower cf ON u.id = cf.user_id
AND cav.community_id = cf.community_id) AS us
UNION ALL
SELECT
cav.*,
NULL AS user_id,
NULL AS my_vote,
NULL AS subscribed,
NULL AS saved
FROM
comment_aggregates_fast cav;
create view user_mention_view as CREATE VIEW user_mention_view AS
select SELECT
c.id, c.id,
um.id as user_mention_id, um.id AS user_mention_id,
c.creator_id, c.creator_id,
c.creator_actor_id, c.creator_actor_id,
c.creator_local, c.creator_local,
@ -141,15 +171,30 @@ select
c.my_vote, c.my_vote,
c.saved, c.saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_mention um, comment_view c actor_id
where um.comment_id = c.id; FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
user_mention um,
comment_view c
WHERE
um.comment_id = c.id;
create view user_mention_fast_view as CREATE VIEW user_mention_fast_view AS
select SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -174,26 +219,45 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
u.id as user_id, u.id AS user_id,
coalesce(cl.score, 0) as my_vote, coalesce(cl.score, 0) AS my_vote,
(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved, (
SELECT
cs.id::bool
FROM
comment_saved cs
WHERE
u.id = cs.user_id
AND cs.comment_id = ac.id) AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from user_ u actor_id
cross join ( FROM
select user_ u
ca.* WHERE
from comment_aggregates_fast ca u.id = um.recipient_id) AS recipient_actor_id,
) ac (
left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id SELECT
left join user_mention um on um.comment_id = ac.id local
FROM
union all user_ u
WHERE
select u.id = um.recipient_id) AS recipient_local
FROM
user_ u
CROSS JOIN (
SELECT
ca.*
FROM
comment_aggregates_fast ca) ac
LEFT JOIN comment_like cl ON u.id = cl.user_id
AND ac.id = cl.comment_id
LEFT JOIN user_mention um ON um.comment_id = ac.id
UNION ALL
SELECT
ac.id, ac.id,
um.id as user_mention_id, um.id AS user_mention_id,
ac.creator_id, ac.creator_id,
ac.creator_actor_id, ac.creator_actor_id,
ac.creator_local, ac.creator_local,
@ -218,37 +282,60 @@ select
ac.upvotes, ac.upvotes,
ac.downvotes, ac.downvotes,
ac.hot_rank, ac.hot_rank,
null as user_id, NULL AS user_id,
null as my_vote, NULL AS my_vote,
null as saved, NULL AS saved,
um.recipient_id, um.recipient_id,
(select actor_id from user_ u where u.id = um.recipient_id) as recipient_actor_id, (
(select local from user_ u where u.id = um.recipient_id) as recipient_local SELECT
from comment_aggregates_fast ac actor_id
left join user_mention um on um.comment_id = ac.id FROM
; user_ u
WHERE
u.id = um.recipient_id) AS recipient_actor_id,
(
SELECT
local
FROM
user_ u
WHERE
u.id = um.recipient_id) AS recipient_local
FROM
comment_aggregates_fast ac
LEFT JOIN user_mention um ON um.comment_id = ac.id;
-- Do the reply_view referencing the comment_fast_view -- Do the reply_view referencing the comment_fast_view
create view reply_fast_view as CREATE VIEW reply_fast_view AS
with closereply as ( with closereply AS (
select SELECT
c2.id, c2.id,
c2.creator_id as sender_id, c2.creator_id AS sender_id,
c.creator_id as recipient_id c.creator_id AS recipient_id
from comment c FROM
inner join comment c2 on c.id = c2.parent_id comment c
where c2.creator_id != c.creator_id INNER JOIN comment c2 ON c.id = c2.parent_id
-- Do union where post is null WHERE
union c2.creator_id != c.creator_id
select -- Do union where post is null
c.id, UNION
c.creator_id as sender_id, SELECT
p.creator_id as recipient_id c.id,
from comment c, post p c.creator_id AS sender_id,
where c.post_id = p.id and c.parent_id is null and c.creator_id != p.creator_id p.creator_id AS recipient_id
FROM
comment c,
post p
WHERE
c.post_id = p.id
AND c.parent_id IS NULL
AND c.creator_id != p.creator_id
) )
select cv.*, SELECT
closereply.recipient_id cv.*,
from comment_fast_view cv, closereply closereply.recipient_id
where closereply.id = cv.id FROM
; comment_fast_view cv,
closereply
WHERE
closereply.id = cv.id;

View file

@ -1,20 +1,34 @@
ALTER TABLE community
ALTER COLUMN actor_id SET NOT NULL;
alter table community alter column actor_id set not null; ALTER TABLE community
alter table community alter column actor_id set default 'http://fake.com'; ALTER COLUMN actor_id SET DEFAULT 'http://fake.com';
alter table user_ alter column actor_id set not null;
alter table user_ alter column actor_id set default 'http://fake.com';
drop function generate_unique_changeme; ALTER TABLE user_
ALTER COLUMN actor_id SET NOT NULL;
update community ALTER TABLE user_
set actor_id = 'http://fake.com' ALTER COLUMN actor_id SET DEFAULT 'http://fake.com';
where actor_id like 'changeme_%';
update user_ DROP FUNCTION generate_unique_changeme;
set actor_id = 'http://fake.com'
where actor_id like 'changeme_%';
drop index idx_user_lower_actor_id; UPDATE
create unique index idx_user_name_lower_actor_id on user_ (lower(name), lower(actor_id)); community
SET
actor_id = 'http://fake.com'
WHERE
actor_id LIKE 'changeme_%';
UPDATE
user_
SET
actor_id = 'http://fake.com'
WHERE
actor_id LIKE 'changeme_%';
DROP INDEX idx_user_lower_actor_id;
CREATE UNIQUE INDEX idx_user_name_lower_actor_id ON user_ (lower(name), lower(actor_id));
DROP INDEX idx_community_lower_actor_id;
drop index idx_community_lower_actor_id;

View file

@ -1,50 +1,78 @@
-- Following this issue : https://github.com/LemmyNet/lemmy/issues/957 -- Following this issue : https://github.com/LemmyNet/lemmy/issues/957
-- Creating a unique changeme actor_id -- Creating a unique changeme actor_id
create or replace function generate_unique_changeme() CREATE OR REPLACE FUNCTION generate_unique_changeme ()
returns text language sql RETURNS text
as $$ LANGUAGE sql
select 'changeme_' || string_agg (substr('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789', ceil (random() * 62)::integer, 1), '') AS $$
from generate_series(1, 20) SELECT
'changeme_' || string_agg(substr('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789', ceil(random() * 62)::integer, 1), '')
FROM
generate_series(1, 20)
$$; $$;
-- Need to delete the possible community and user dupes for ones that don't start with the fake one -- Need to delete the possible community and user dupes for ones that don't start with the fake one
-- A few test inserts, to make sure this removes later dupes -- A few test inserts, to make sure this removes later dupes
-- insert into community (name, title, category_id, creator_id) values ('testcom', 'another testcom', 1, 2); -- insert into community (name, title, category_id, creator_id) values ('testcom', 'another testcom', 1, 2);
delete from community a using ( DELETE FROM community a USING (
select min(id) as id, actor_id SELECT
from community min(id) AS id,
group by actor_id having count(*) > 1 actor_id
) b FROM
where a.actor_id = b.actor_id community
and a.id <> b.id; GROUP BY
actor_id
HAVING
count(*) > 1) b
WHERE
a.actor_id = b.actor_id
AND a.id <> b.id;
delete from user_ a using ( DELETE FROM user_ a USING (
select min(id) as id, actor_id SELECT
from user_ min(id) AS id,
group by actor_id having count(*) > 1 actor_id
) b FROM
where a.actor_id = b.actor_id user_
and a.id <> b.id; GROUP BY
actor_id
HAVING
count(*) > 1) b
WHERE
a.actor_id = b.actor_id
AND a.id <> b.id;
-- Replacing the current default on the columns, to the unique one -- Replacing the current default on the columns, to the unique one
update community UPDATE
set actor_id = generate_unique_changeme() community
where actor_id = 'http://fake.com'; SET
actor_id = generate_unique_changeme ()
WHERE
actor_id = 'http://fake.com';
update user_ UPDATE
set actor_id = generate_unique_changeme() user_
where actor_id = 'http://fake.com'; SET
actor_id = generate_unique_changeme ()
WHERE
actor_id = 'http://fake.com';
-- Add the unique indexes -- Add the unique indexes
alter table community alter column actor_id set not null; ALTER TABLE community
alter table community alter column actor_id set default generate_unique_changeme(); ALTER COLUMN actor_id SET NOT NULL;
alter table user_ alter column actor_id set not null; ALTER TABLE community
alter table user_ alter column actor_id set default generate_unique_changeme(); ALTER COLUMN actor_id SET DEFAULT generate_unique_changeme ();
ALTER TABLE user_
ALTER COLUMN actor_id SET NOT NULL;
ALTER TABLE user_
ALTER COLUMN actor_id SET DEFAULT generate_unique_changeme ();
-- Add lowercase uniqueness too -- Add lowercase uniqueness too
drop index idx_user_name_lower_actor_id; DROP INDEX idx_user_name_lower_actor_id;
create unique index idx_user_lower_actor_id on user_ (lower(actor_id));
CREATE UNIQUE INDEX idx_user_lower_actor_id ON user_ (lower(actor_id));
CREATE UNIQUE INDEX idx_community_lower_actor_id ON community (lower(actor_id));
create unique index idx_community_lower_actor_id on community (lower(actor_id));

View file

@ -1,11 +1,14 @@
-- Drop first -- Drop first
drop view community_view; DROP VIEW community_view;
drop view community_aggregates_view;
drop view community_fast_view;
drop table community_aggregates_fast;
create view community_aggregates_view as DROP VIEW community_aggregates_view;
select
DROP VIEW community_fast_view;
DROP TABLE community_aggregates_fast;
CREATE VIEW community_aggregates_view AS
SELECT
c.id, c.id,
c.name, c.name,
c.title, c.title,
@ -22,79 +25,96 @@ select
c.actor_id, c.actor_id,
c.local, c.local,
c.last_refreshed_at, c.last_refreshed_at,
u.actor_id as creator_actor_id, u.actor_id AS creator_actor_id,
u.local as creator_local, u.local AS creator_local,
u.name as creator_name, u.name AS creator_name,
u.preferred_username as creator_preferred_username, u.preferred_username AS creator_preferred_username,
u.avatar as creator_avatar, u.avatar AS creator_avatar,
cat.name as category_name, cat.name AS category_name,
coalesce(cf.subs, 0) as number_of_subscribers, coalesce(cf.subs, 0) AS number_of_subscribers,
coalesce(cd.posts, 0) as number_of_posts, coalesce(cd.posts, 0) AS number_of_posts,
coalesce(cd.comments, 0) as number_of_comments, coalesce(cd.comments, 0) AS number_of_comments,
hot_rank(cf.subs, c.published) as hot_rank hot_rank (cf.subs, c.published) AS hot_rank
from community c FROM
left join user_ u on c.creator_id = u.id community c
left join category cat on c.category_id = cat.id LEFT JOIN user_ u ON c.creator_id = u.id
left join ( LEFT JOIN category cat ON c.category_id = cat.id
select LEFT JOIN (
p.community_id, SELECT
count(distinct p.id) as posts, p.community_id,
count(distinct ct.id) as comments count(DISTINCT p.id) AS posts,
from post p count(DISTINCT ct.id) AS comments
join comment ct on p.id = ct.post_id FROM
group by p.community_id post p
) cd on cd.community_id = c.id JOIN comment ct ON p.id = ct.post_id
left join ( GROUP BY
select p.community_id) cd ON cd.community_id = c.id
community_id, LEFT JOIN (
count(*) as subs SELECT
from community_follower community_id,
group by community_id count(*) AS subs
) cf on cf.community_id = c.id; FROM
community_follower
GROUP BY
community_id) cf ON cf.community_id = c.id;
create view community_view as CREATE VIEW community_view AS
select SELECT
cv.*, cv.*,
us.user as user_id, us.user AS user_id,
us.is_subbed::bool as subscribed us.is_subbed::bool AS subscribed
from community_aggregates_view cv FROM
cross join lateral ( community_aggregates_view cv
select CROSS JOIN LATERAL (
u.id as user, SELECT
coalesce(cf.community_id, 0) as is_subbed u.id AS user,
from user_ u coalesce(cf.community_id, 0) AS is_subbed
left join community_follower cf on u.id = cf.user_id and cf.community_id = cv.id FROM
) as us user_ u
LEFT JOIN community_follower cf ON u.id = cf.user_id
union all AND cf.community_id = cv.id) AS us
UNION ALL
select SELECT
cv.*, cv.*,
null as user_id, NULL AS user_id,
null as subscribed NULL AS subscribed
from community_aggregates_view cv; FROM
community_aggregates_view cv;
-- The community fast table -- The community fast table
CREATE TABLE community_aggregates_fast AS
SELECT
*
FROM
community_aggregates_view;
create table community_aggregates_fast as select * from community_aggregates_view; ALTER TABLE community_aggregates_fast
alter table community_aggregates_fast add primary key (id); ADD PRIMARY KEY (id);
create view community_fast_view as CREATE VIEW community_fast_view AS
select SELECT
ac.*, ac.*,
u.id as user_id, u.id AS user_id,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed (
from user_ u SELECT
cross join ( cf.id::boolean
select FROM
ca.* community_follower cf
from community_aggregates_fast ca WHERE
) ac u.id = cf.user_id
AND ac.id = cf.community_id) AS subscribed
FROM
user_ u
CROSS JOIN (
SELECT
ca.*
FROM
community_aggregates_fast ca) ac
UNION ALL
SELECT
caf.*,
NULL AS user_id,
NULL AS subscribed
FROM
community_aggregates_fast caf;
union all
select
caf.*,
null as user_id,
null as subscribed
from community_aggregates_fast caf;

View file

@ -1,11 +1,14 @@
-- Drop first -- Drop first
drop view community_view; DROP VIEW community_view;
drop view community_aggregates_view;
drop view community_fast_view;
drop table community_aggregates_fast;
create view community_aggregates_view as DROP VIEW community_aggregates_view;
select
DROP VIEW community_fast_view;
DROP TABLE community_aggregates_fast;
CREATE VIEW community_aggregates_view AS
SELECT
c.id, c.id,
c.name, c.name,
c.title, c.title,
@ -22,79 +25,96 @@ select
c.actor_id, c.actor_id,
c.local, c.local,
c.last_refreshed_at, c.last_refreshed_at,
u.actor_id as creator_actor_id, u.actor_id AS creator_actor_id,
u.local as creator_local, u.local AS creator_local,
u.name as creator_name, u.name AS creator_name,
u.preferred_username as creator_preferred_username, u.preferred_username AS creator_preferred_username,
u.avatar as creator_avatar, u.avatar AS creator_avatar,
cat.name as category_name, cat.name AS category_name,
coalesce(cf.subs, 0) as number_of_subscribers, coalesce(cf.subs, 0) AS number_of_subscribers,
coalesce(cd.posts, 0) as number_of_posts, coalesce(cd.posts, 0) AS number_of_posts,
coalesce(cd.comments, 0) as number_of_comments, coalesce(cd.comments, 0) AS number_of_comments,
hot_rank(cf.subs, c.published) as hot_rank hot_rank (cf.subs, c.published) AS hot_rank
from community c FROM
left join user_ u on c.creator_id = u.id community c
left join category cat on c.category_id = cat.id LEFT JOIN user_ u ON c.creator_id = u.id
left join ( LEFT JOIN category cat ON c.category_id = cat.id
select LEFT JOIN (
p.community_id, SELECT
count(distinct p.id) as posts, p.community_id,
count(distinct ct.id) as comments count(DISTINCT p.id) AS posts,
from post p count(DISTINCT ct.id) AS comments
left join comment ct on p.id = ct.post_id FROM
group by p.community_id post p
) cd on cd.community_id = c.id LEFT JOIN comment ct ON p.id = ct.post_id
left join ( GROUP BY
select p.community_id) cd ON cd.community_id = c.id
community_id, LEFT JOIN (
count(*) as subs SELECT
from community_follower community_id,
group by community_id count(*) AS subs
) cf on cf.community_id = c.id; FROM
community_follower
GROUP BY
community_id) cf ON cf.community_id = c.id;
create view community_view as CREATE VIEW community_view AS
select SELECT
cv.*, cv.*,
us.user as user_id, us.user AS user_id,
us.is_subbed::bool as subscribed us.is_subbed::bool AS subscribed
from community_aggregates_view cv FROM
cross join lateral ( community_aggregates_view cv
select CROSS JOIN LATERAL (
u.id as user, SELECT
coalesce(cf.community_id, 0) as is_subbed u.id AS user,
from user_ u coalesce(cf.community_id, 0) AS is_subbed
left join community_follower cf on u.id = cf.user_id and cf.community_id = cv.id FROM
) as us user_ u
LEFT JOIN community_follower cf ON u.id = cf.user_id
union all AND cf.community_id = cv.id) AS us
UNION ALL
select SELECT
cv.*, cv.*,
null as user_id, NULL AS user_id,
null as subscribed NULL AS subscribed
from community_aggregates_view cv; FROM
community_aggregates_view cv;
-- The community fast table -- The community fast table
CREATE TABLE community_aggregates_fast AS
SELECT
*
FROM
community_aggregates_view;
create table community_aggregates_fast as select * from community_aggregates_view; ALTER TABLE community_aggregates_fast
alter table community_aggregates_fast add primary key (id); ADD PRIMARY KEY (id);
create view community_fast_view as CREATE VIEW community_fast_view AS
select SELECT
ac.*, ac.*,
u.id as user_id, u.id AS user_id,
(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed (
from user_ u SELECT
cross join ( cf.id::boolean
select FROM
ca.* community_follower cf
from community_aggregates_fast ca WHERE
) ac u.id = cf.user_id
AND ac.id = cf.community_id) AS subscribed
FROM
user_ u
CROSS JOIN (
SELECT
ca.*
FROM
community_aggregates_fast ca) ac
UNION ALL
SELECT
caf.*,
NULL AS user_id,
NULL AS subscribed
FROM
community_aggregates_fast caf;
union all
select
caf.*,
null as user_id,
null as subscribed
from community_aggregates_fast caf;

View file

@ -1,27 +1,55 @@
-- Drop the uniques -- Drop the uniques
alter table private_message drop constraint idx_private_message_ap_id; ALTER TABLE private_message
alter table post drop constraint idx_post_ap_id; DROP CONSTRAINT idx_private_message_ap_id;
alter table comment drop constraint idx_comment_ap_id;
alter table user_ drop constraint idx_user_actor_id;
alter table community drop constraint idx_community_actor_id;
alter table private_message alter column ap_id set not null; ALTER TABLE post
alter table private_message alter column ap_id set default 'http://fake.com'; DROP CONSTRAINT idx_post_ap_id;
alter table post alter column ap_id set not null; ALTER TABLE comment
alter table post alter column ap_id set default 'http://fake.com'; DROP CONSTRAINT idx_comment_ap_id;
alter table comment alter column ap_id set not null; ALTER TABLE user_
alter table comment alter column ap_id set default 'http://fake.com'; DROP CONSTRAINT idx_user_actor_id;
update private_message ALTER TABLE community
set ap_id = 'http://fake.com' DROP CONSTRAINT idx_community_actor_id;
where ap_id like 'changeme_%';
update post ALTER TABLE private_message
set ap_id = 'http://fake.com' ALTER COLUMN ap_id SET NOT NULL;
where ap_id like 'changeme_%';
ALTER TABLE private_message
ALTER COLUMN ap_id SET DEFAULT 'http://fake.com';
ALTER TABLE post
ALTER COLUMN ap_id SET NOT NULL;
ALTER TABLE post
ALTER COLUMN ap_id SET DEFAULT 'http://fake.com';
ALTER TABLE comment
ALTER COLUMN ap_id SET NOT NULL;
ALTER TABLE comment
ALTER COLUMN ap_id SET DEFAULT 'http://fake.com';
UPDATE
private_message
SET
ap_id = 'http://fake.com'
WHERE
ap_id LIKE 'changeme_%';
UPDATE
post
SET
ap_id = 'http://fake.com'
WHERE
ap_id LIKE 'changeme_%';
UPDATE
comment
SET
ap_id = 'http://fake.com'
WHERE
ap_id LIKE 'changeme_%';
update comment
set ap_id = 'http://fake.com'
where ap_id like 'changeme_%';

Some files were not shown because too many files have changed in this diff Show more