-
-
Notifications
You must be signed in to change notification settings - Fork 859
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
remove n^2 part of person triggers, improve community aggregate trigg…
…er (#3739) * remove n^2 part of person triggers, improve community aggregate trigger * comment out comment_score tests since previously they only accidentally succeeded * empty
- Loading branch information
1 parent
8f9f1ae
commit 6e47955
Showing
3 changed files
with
135 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
80 changes: 80 additions & 0 deletions
80
migrations/2023-07-27-134652_remove-expensive-broken-trigger/down.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
create or replace function person_aggregates_comment_count() | ||
returns trigger language plpgsql | ||
as $$ | ||
begin | ||
IF (was_restored_or_created(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set comment_count = comment_count + 1 where person_id = NEW.creator_id; | ||
ELSIF (was_removed_or_deleted(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set comment_count = comment_count - 1 where person_id = OLD.creator_id; | ||
|
||
-- If the comment gets deleted, the score calculation trigger won't fire, | ||
-- so you need to re-calculate | ||
update person_aggregates ua | ||
set comment_score = cd.score | ||
from ( | ||
select u.id, | ||
coalesce(0, sum(cl.score)) as score | ||
-- User join because comments could be empty | ||
from person u | ||
left join comment c on u.id = c.creator_id and c.deleted = 'f' and c.removed = 'f' | ||
left join comment_like cl on c.id = cl.comment_id | ||
group by u.id | ||
) cd | ||
where ua.person_id = OLD.creator_id; | ||
END IF; | ||
return null; | ||
end $$; | ||
|
||
create or replace function person_aggregates_post_count() | ||
returns trigger language plpgsql | ||
as $$ | ||
begin | ||
IF (was_restored_or_created(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set post_count = post_count + 1 where person_id = NEW.creator_id; | ||
|
||
ELSIF (was_removed_or_deleted(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set post_count = post_count - 1 where person_id = OLD.creator_id; | ||
|
||
-- If the post gets deleted, the score calculation trigger won't fire, | ||
-- so you need to re-calculate | ||
update person_aggregates ua | ||
set post_score = pd.score | ||
from ( | ||
select u.id, | ||
coalesce(0, sum(pl.score)) as score | ||
-- User join because posts could be empty | ||
from person u | ||
left join post p on u.id = p.creator_id and p.deleted = 'f' and p.removed = 'f' | ||
left join post_like pl on p.id = pl.post_id | ||
group by u.id | ||
) pd | ||
where ua.person_id = OLD.creator_id; | ||
|
||
END IF; | ||
return null; | ||
end $$; | ||
|
||
create or replace function community_aggregates_comment_count() | ||
returns trigger language plpgsql | ||
as $$ | ||
begin | ||
IF (was_restored_or_created(TG_OP, OLD, NEW)) THEN | ||
update community_aggregates ca | ||
set comments = comments + 1 from comment c, post p | ||
where p.id = c.post_id | ||
and p.id = NEW.post_id | ||
and ca.community_id = p.community_id; | ||
ELSIF (was_removed_or_deleted(TG_OP, OLD, NEW)) THEN | ||
update community_aggregates ca | ||
set comments = comments - 1 from comment c, post p | ||
where p.id = c.post_id | ||
and p.id = OLD.post_id | ||
and ca.community_id = p.community_id; | ||
|
||
END IF; | ||
return null; | ||
end $$; |
47 changes: 47 additions & 0 deletions
47
migrations/2023-07-27-134652_remove-expensive-broken-trigger/up.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
create or replace function person_aggregates_comment_count() | ||
returns trigger language plpgsql | ||
as $$ | ||
begin | ||
IF (was_restored_or_created(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set comment_count = comment_count + 1 where person_id = NEW.creator_id; | ||
ELSIF (was_removed_or_deleted(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set comment_count = comment_count - 1 where person_id = OLD.creator_id; | ||
END IF; | ||
return null; | ||
end $$; | ||
|
||
create or replace function person_aggregates_post_count() | ||
returns trigger language plpgsql | ||
as $$ | ||
begin | ||
IF (was_restored_or_created(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set post_count = post_count + 1 where person_id = NEW.creator_id; | ||
|
||
ELSIF (was_removed_or_deleted(TG_OP, OLD, NEW)) THEN | ||
update person_aggregates | ||
set post_count = post_count - 1 where person_id = OLD.creator_id; | ||
END IF; | ||
return null; | ||
end $$; | ||
|
||
create or replace function community_aggregates_comment_count() | ||
returns trigger language plpgsql | ||
as $$ | ||
begin | ||
IF (was_restored_or_created(TG_OP, OLD, NEW)) THEN | ||
update community_aggregates ca | ||
set comments = comments + 1 from post p | ||
where p.id = NEW.post_id | ||
and ca.community_id = p.community_id; | ||
ELSIF (was_removed_or_deleted(TG_OP, OLD, NEW)) THEN | ||
update community_aggregates ca | ||
set comments = comments - 1 from post p | ||
where p.id = OLD.post_id | ||
and ca.community_id = p.community_id; | ||
|
||
END IF; | ||
return null; | ||
end $$; |