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

127 lines
3.1 KiB
MySQL
Raw Permalink Normal View History

2020-12-03 03:39:31 +00:00
-- Add site aggregates
create table site_aggregates (
id serial primary key,
site_id int references site on update cascade on delete cascade not null,
2020-12-20 05:09:20 +00:00
users bigint not null default 1,
posts bigint not null default 0,
comments bigint not null default 0,
communities bigint not null default 0
2020-12-03 03:39:31 +00:00
);
insert into site_aggregates (site_id, users, posts, comments, communities)
select id as site_id,
( select coalesce(count(*), 0) from user_) as users,
2020-12-03 03:39:31 +00:00
( select coalesce(count(*), 0) from post) as posts,
( select coalesce(count(*), 0) from comment) as comments,
( select coalesce(count(*), 0) from community) as communities
from site;
-- initial site add
create function site_aggregates_site()
returns trigger language plpgsql
as $$
begin
IF (TG_OP = 'INSERT') THEN
insert into site_aggregates (site_id) values (NEW.id);
ELSIF (TG_OP = 'DELETE') THEN
delete from site_aggregates where site_id = OLD.id;
END IF;
return null;
end $$;
create trigger site_aggregates_site
after insert or delete on site
for each row
execute procedure site_aggregates_site();
2020-12-03 03:39:31 +00:00
-- Add site aggregate triggers
-- user
2020-12-20 05:09:20 +00:00
create or replace function site_aggregates_user()
2020-12-03 03:39:31 +00:00
returns trigger language plpgsql
as $$
begin
2020-12-03 15:18:17 +00:00
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set users = users + 1;
ELSIF (TG_OP = 'DELETE') THEN
2020-12-20 05:09:20 +00:00
-- Join to site since the creator might not be there anymore
update site_aggregates sa
set users = users - 1
from site s
where sa.site_id = s.id;
2020-12-03 15:18:17 +00:00
END IF;
2020-12-03 03:39:31 +00:00
return null;
end $$;
2020-12-03 15:18:17 +00:00
create trigger site_aggregates_user
after insert or delete on user_
2020-12-09 16:52:10 +00:00
for each row
2020-12-03 15:18:17 +00:00
execute procedure site_aggregates_user();
2020-12-03 03:39:31 +00:00
-- post
2020-12-03 15:18:17 +00:00
create function site_aggregates_post()
2020-12-03 03:39:31 +00:00
returns trigger language plpgsql
as $$
begin
2020-12-03 15:18:17 +00:00
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set posts = posts + 1;
ELSIF (TG_OP = 'DELETE') THEN
2020-12-20 05:09:20 +00:00
update site_aggregates sa
set posts = posts - 1
from site s
where sa.site_id = s.id;
2020-12-03 15:18:17 +00:00
END IF;
2020-12-03 03:39:31 +00:00
return null;
end $$;
2020-12-03 15:18:17 +00:00
create trigger site_aggregates_post
after insert or delete on post
2020-12-07 03:17:52 +00:00
for each row
2020-12-03 15:18:17 +00:00
execute procedure site_aggregates_post();
2020-12-03 03:39:31 +00:00
-- comment
2020-12-03 15:18:17 +00:00
create function site_aggregates_comment()
2020-12-03 03:39:31 +00:00
returns trigger language plpgsql
as $$
begin
2020-12-03 15:18:17 +00:00
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set comments = comments + 1;
ELSIF (TG_OP = 'DELETE') THEN
2020-12-20 05:09:20 +00:00
update site_aggregates sa
set comments = comments - 1
from site s
where sa.site_id = s.id;
2020-12-03 15:18:17 +00:00
END IF;
2020-12-03 03:39:31 +00:00
return null;
end $$;
2020-12-03 15:18:17 +00:00
create trigger site_aggregates_comment
after insert or delete on comment
2020-12-07 03:17:52 +00:00
for each row
2020-12-03 15:18:17 +00:00
execute procedure site_aggregates_comment();
2020-12-03 03:39:31 +00:00
-- community
2020-12-03 15:18:17 +00:00
create function site_aggregates_community()
2020-12-03 03:39:31 +00:00
returns trigger language plpgsql
as $$
begin
2020-12-03 15:18:17 +00:00
IF (TG_OP = 'INSERT') THEN
update site_aggregates
set communities = communities + 1;
ELSIF (TG_OP = 'DELETE') THEN
2020-12-20 05:09:20 +00:00
update site_aggregates sa
set communities = communities - 1
from site s
where sa.site_id = s.id;
2020-12-03 15:18:17 +00:00
END IF;
2020-12-03 03:39:31 +00:00
return null;
end $$;
2020-12-03 15:18:17 +00:00
create trigger site_aggregates_community
after insert or delete on community
2020-12-07 03:17:52 +00:00
for each row
2020-12-03 15:18:17 +00:00
execute procedure site_aggregates_community();
2020-12-03 03:39:31 +00:00