perf(messages): batch list enrichment to fix N+1 queries #99

Merged
icub3d merged 2 commits from feature/84-batch-message-enrichment into main 2026-07-09 02:55:01 +00:00
Owner

Summary

Fixes #84. list_messages enriched each message with three separate queries (attachments, reaction counts, thread summary) in a sequential loop — a 50-message page issued ~150 round-trips.

Fix

  • New batch storage methods list_attachments_for_messages(&[id]) and list_reaction_counts_for_messages(&[id], viewer) using IN (...) queries (mirroring the existing list_thread_summaries).
  • list_thread_summaries now returns (parent_message_id, ThreadSummary) so results can be grouped (previously it dropped the parent id, which is why the list path couldn't use it).
  • New enrich_messages helper: 3 batch queries total, assembled per-message in memory with HashMaps, preserving input order. list_messages uses it. Single-message paths (create/get/update) keep the simple enrich_message.

Net: 3 queries per page instead of 3 × N.

Tests

  • list_batches_reactions_to_correct_messages: a reaction on one of two messages appears only on that message after listing.
  • Updated thread_summaries_enrichment for the new tuple return.

Full server suite green (116 tests); clippy -D warnings clean.

Closes #84

## Summary Fixes #84. `list_messages` enriched each message with three separate queries (attachments, reaction counts, thread summary) in a sequential loop — a 50-message page issued ~150 round-trips. ## Fix - New batch storage methods `list_attachments_for_messages(&[id])` and `list_reaction_counts_for_messages(&[id], viewer)` using `IN (...)` queries (mirroring the existing `list_thread_summaries`). - `list_thread_summaries` now returns `(parent_message_id, ThreadSummary)` so results can be grouped (previously it dropped the parent id, which is why the list path couldn't use it). - New `enrich_messages` helper: 3 batch queries total, assembled per-message in memory with `HashMap`s, preserving input order. `list_messages` uses it. Single-message paths (create/get/update) keep the simple `enrich_message`. Net: **3 queries per page** instead of **3 × N**. ## Tests - `list_batches_reactions_to_correct_messages`: a reaction on one of two messages appears only on that message after listing. - Updated `thread_summaries_enrichment` for the new tuple return. Full server suite green (116 tests); `clippy -D warnings` clean. Closes #84
perf(messages): batch list enrichment to fix N+1 queries
Some checks failed
Security Audit / Gitleaks (Secrets) (pull_request) Successful in 5s
Security Audit / Trivy (SCA & IaC) (pull_request) Failing after 19s
Security Audit / PNPM Audit (JS SCA) (pull_request) Failing after 36s
Security Audit / Semgrep (SAST) (pull_request) Failing after 1m21s
CI / Client — test & lint (pull_request) Successful in 1m37s
Security Audit / Cargo Audit (Rust SCA) (pull_request) Failing after 3m42s
CI / Server — test & lint (pull_request) Successful in 5m22s
2e3ea815f0
Listing messages ran three queries per message (attachments, reaction
counts, thread summary) in a sequential loop, so a 50-message page issued
~150 round-trips.

Add batch storage methods list_attachments_for_messages and
list_reaction_counts_for_messages (IN (...) queries), and change
list_thread_summaries to return (parent_message_id, summary) so results can
be grouped. A new enrich_messages helper fetches all three in one query
each and assembles per-message in memory, preserving order. list_messages
now issues 3 queries total instead of 3*N. Single-message paths keep using
enrich_message.

Test: a listed page groups a reaction onto the correct message and leaves
the other message's reactions empty.

Closes #84

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Merge branch 'main' into feature/84-batch-message-enrichment
Some checks failed
Security Audit / PNPM Audit (JS SCA) (pull_request) Failing after 18s
Security Audit / Gitleaks (Secrets) (pull_request) Successful in 10s
Security Audit / Trivy (SCA & IaC) (pull_request) Failing after 17s
CI / Client — test & lint (pull_request) Successful in 44s
Security Audit / Semgrep (SAST) (pull_request) Failing after 56s
CI / Server — test & lint (pull_request) Successful in 1m10s
Security Audit / Cargo Audit (Rust SCA) (pull_request) Failing after 7m34s
02474b6910
icub3d merged commit 3034393523 into main 2026-07-09 02:55:01 +00:00
icub3d deleted branch feature/84-batch-message-enrichment 2026-07-09 02:55:02 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
icub3d/decentcom!99
No description provided.