lemmy/migrations/2020-12-02-152437_create_site_aggregates/up.sql

95 lines
2.2 KiB
PL/PgSQL

-- Add site aggregates
create table site_aggregates (
id serial primary key,
users bigint not null,
posts bigint not null,
comments bigint not null,
communities bigint not null
);
insert into site_aggregates (users, posts, comments, communities)
select ( select coalesce(count(*), 0) from user_) as users,
( select coalesce(count(*), 0) from post) as posts,
( select coalesce(count(*), 0) from comment) as comments,
( select coalesce(count(*), 0) from community) as communities;
-- Add site aggregate triggers
-- user
create function site_aggregates_user()
returns trigger language plpgsql
as $$
begin
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set users = users + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set users = users - 1;
END IF;
return null;
end $$;
create trigger site_aggregates_user
after insert or delete on user_
execute procedure site_aggregates_user();
-- post
create function site_aggregates_post()
returns trigger language plpgsql
as $$
begin
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set posts = posts + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set posts = posts - 1;
END IF;
return null;
end $$;
create trigger site_aggregates_post
after insert or delete on post
for each row
execute procedure site_aggregates_post();
-- comment
create function site_aggregates_comment()
returns trigger language plpgsql
as $$
begin
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set comments = comments + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set comments = comments - 1;
END IF;
return null;
end $$;
create trigger site_aggregates_comment
after insert or delete on comment
for each row
execute procedure site_aggregates_comment();
-- community
create function site_aggregates_community()
returns trigger language plpgsql
as $$
begin
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set communities = communities + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set communities = communities - 1;
END IF;
return null;
end $$;
create trigger site_aggregates_community
after insert or delete on community
for each row
execute procedure site_aggregates_community();