Optimize Community::set_featured_posts (#4579)

* Don't lock excess rows in Community::set_featured_posts

* Update community.rs

* Update community.rs

* Update community.rs

* Update community.rs
This commit is contained in:
dullbananas 2024-04-02 08:19:04 -07:00 committed by GitHub
parent 60f9a97dfa
commit 007e9b7aab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -29,6 +29,7 @@ use diesel::{
select, select,
sql_types, sql_types,
update, update,
BoolExpressionMethods,
ExpressionMethods, ExpressionMethods,
NullableExpressionMethods, NullableExpressionMethods,
QueryDsl, QueryDsl,
@ -150,30 +151,16 @@ impl Community {
for p in &posts { for p in &posts {
debug_assert!(p.community_id == community_id); debug_assert!(p.community_id == community_id);
} }
conn // Mark the given posts as featured and all other posts as not featured.
.build_transaction() let post_ids = posts.iter().map(|p| p.id);
.run(|conn| { update(post::table)
Box::pin(async move { .filter(post::dsl::community_id.eq(community_id))
update( // This filter is just for performance
// first remove all existing featured posts .filter(post::dsl::featured_community.or(post::dsl::id.eq_any(post_ids.clone())))
post::table, .set(post::dsl::featured_community.eq(post::dsl::id.eq_any(post_ids)))
) .execute(conn)
.filter(post::dsl::community_id.eq(community_id)) .await?;
.set(post::dsl::featured_community.eq(false)) Ok(())
.execute(conn)
.await?;
// then mark the given posts as featured
let post_ids: Vec<_> = posts.iter().map(|p| p.id).collect();
update(post::table)
.filter(post::dsl::id.eq_any(post_ids))
.set(post::dsl::featured_community.eq(true))
.execute(conn)
.await?;
Ok(())
}) as _
})
.await
} }
} }