From a27b7f8d1f0c31097b77e4551aaf7dabe2b9ae3d Mon Sep 17 00:00:00 2001 From: Dessalines Date: Sun, 20 Dec 2020 00:09:20 -0500 Subject: [PATCH] Fix site aggs. --- lemmy_db/src/aggregates/site_aggregates.rs | 22 ++++++++++---- lemmy_db/src/source/site.rs | 4 +++ .../up.sql | 29 ++++++++++++------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/lemmy_db/src/aggregates/site_aggregates.rs b/lemmy_db/src/aggregates/site_aggregates.rs index 794dd5318..df3cad6f1 100644 --- a/lemmy_db/src/aggregates/site_aggregates.rs +++ b/lemmy_db/src/aggregates/site_aggregates.rs @@ -27,6 +27,7 @@ mod tests { comment::{Comment, CommentForm}, community::{Community, CommunityForm}, post::{Post, PostForm}, + site::{Site, SiteForm}, user::{UserForm, User_}, }, tests::establish_unpooled_connection, @@ -68,6 +69,20 @@ mod tests { let inserted_user = User_::create(&conn, &new_user).unwrap(); + let site_form = SiteForm { + name: "test_site".into(), + description: None, + icon: None, + banner: None, + creator_id: inserted_user.id, + enable_downvotes: true, + open_registration: true, + enable_nsfw: true, + updated: None, + }; + + Site::create(&conn, &site_form).unwrap(); + let new_community = CommunityForm { name: "TIL_site_agg".into(), creator_id: inserted_user.id, @@ -165,10 +180,7 @@ mod tests { let user_num_deleted = User_::delete(&conn, inserted_user.id).unwrap(); assert_eq!(1, user_num_deleted); - let site_aggregates_after_delete = SiteAggregates::read(&conn).unwrap(); - assert_eq!(0, site_aggregates_after_delete.users); - assert_eq!(0, site_aggregates_after_delete.communities); - assert_eq!(0, site_aggregates_after_delete.posts); - assert_eq!(0, site_aggregates_after_delete.comments); + let after_delete = SiteAggregates::read(&conn); + assert!(after_delete.is_err()); } } diff --git a/lemmy_db/src/source/site.rs b/lemmy_db/src/source/site.rs index 1224e0ab7..8775191e1 100644 --- a/lemmy_db/src/source/site.rs +++ b/lemmy_db/src/source/site.rs @@ -50,6 +50,10 @@ impl Crud for Site { .set(new_site) .get_result::(conn) } + fn delete(conn: &PgConnection, site_id: i32) -> Result { + use crate::schema::site::dsl::*; + diesel::delete(site.find(site_id)).execute(conn) + } } impl Site { diff --git a/migrations/2020-12-02-152437_create_site_aggregates/up.sql b/migrations/2020-12-02-152437_create_site_aggregates/up.sql index cc76a5c75..b10a5f419 100644 --- a/migrations/2020-12-02-152437_create_site_aggregates/up.sql +++ b/migrations/2020-12-02-152437_create_site_aggregates/up.sql @@ -2,7 +2,7 @@ create table site_aggregates ( id serial primary key, site_id int references site on update cascade on delete cascade not null, - users bigint not null default 0, + users bigint not null default 1, posts bigint not null default 0, comments bigint not null default 0, communities bigint not null default 0 @@ -36,7 +36,7 @@ execute procedure site_aggregates_site(); -- Add site aggregate triggers -- user -create function site_aggregates_user() +create or replace function site_aggregates_user() returns trigger language plpgsql as $$ begin @@ -44,8 +44,11 @@ begin update site_aggregates set users = users + 1; ELSIF (TG_OP = 'DELETE') THEN - update site_aggregates - set users = users - 1; + -- 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; END IF; return null; end $$; @@ -64,8 +67,10 @@ begin update site_aggregates set posts = posts + 1; ELSIF (TG_OP = 'DELETE') THEN - update site_aggregates - set posts = posts - 1; + update site_aggregates sa + set posts = posts - 1 + from site s + where sa.site_id = s.id; END IF; return null; end $$; @@ -84,8 +89,10 @@ begin update site_aggregates set comments = comments + 1; ELSIF (TG_OP = 'DELETE') THEN - update site_aggregates - set comments = comments - 1; + update site_aggregates sa + set comments = comments - 1 + from site s + where sa.site_id = s.id; END IF; return null; end $$; @@ -104,8 +111,10 @@ begin update site_aggregates set communities = communities + 1; ELSIF (TG_OP = 'DELETE') THEN - update site_aggregates - set communities = communities - 1; + update site_aggregates sa + set communities = communities - 1 + from site s + where sa.site_id = s.id; END IF; return null; end $$;