mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-09 08:04:45 +00:00
MergeQueryExecutor's winner-picker tie-breaks equal created_at by id ASC, but each per-stream cursor sorted by created_at DESC only, and repeated authors/kinds opened duplicate cursors: - id tie-break: thread the IndexingStrategy through run()/prepareStreams and append ", id ASC" to the per-stream ORDER BY when useAndIndexIdOnOrderBy is set — matching every sibling query in QueryBuilder. The id-indexed order comes straight off the index (no extra sort, lazy cursor preserved), so the merge now matches the single-SQL path byte-for-byte on same-second same-author events. Without the id index the tie stays in rowid order (a valid NIP-01 newest-N); documented on the class. - dedup: streamCount/prepareStreams now operate on distinct authors and kinds, so a filter with a repeated pubkey can no longer open two identical cursors and emit each matching event twice (the single-SQL IN(…) path already dedups). Adds two MergeQueryCorrectnessTest cases the suite was missing: a within-stream same-second tie sliced by the limit, and duplicate authors. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EZeWww5TJnzBZKPoc6mvU