perf: batch-load reaction counts for posts embedded in discussion endpoints#105
Merged
perf: batch-load reaction counts for posts embedded in discussion endpoints#105
Conversation
…points When reactions are displayed on the discussion list or discussion show page, the firstPost (and lastPost on show) are serialized as embedded resources. The existing beforeSerialization hook on PostResource::Index only fires for direct post listing requests, not for posts embedded within discussions. Add beforeSerialization hooks on DiscussionResource::Index and Show to pre-load reaction counts for all embedded posts in a single batch query, eliminating per-post reaction queries (3 queries per discussion previously).
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
When the reactions extension is active, loading the discussion list triggered 3 extra queries per discussion — one for reaction counts, one for the actor's reaction, and one for all reaction types. With 20 discussions on a page, that's 60 additional queries.
The existing
beforeSerializationhook onPostResource::Indexcorrectly batches these queries when posts are loaded directly (e.g. when opening a discussion). However, it does not fire when posts are embedded asfirstPost/lastPostwithin discussion responses — theDiscussionResource::IndexandDiscussionResource::Showendpoints have no equivalent hook.Solution
Add
beforeSerializationhooks onDiscussionResource::IndexandDiscussionResource::Showthat collect the embeddedfirstPost/lastPostmodels and pass them all toLoadReactionCounts::forPosts()in a single batch before serialization begins.firstPostfrom all discussions in the result set — 3 queries total regardless of page sizefirstPostandlastPostfrom the single discussion — 3 queries totalChanges
extend.php: addbeforeSerializationonDiscussionResource::IndexandDiscussionResource::ShowRelates to flarum/framework#4502