From a304cc34c423cee06db1a05d855b83a0d783d79e Mon Sep 17 00:00:00 2001 From: Niels Mokkenstorm Date: Tue, 11 Aug 2026 10:42:06 +0200 Subject: [PATCH] fix: dedupe the unpaged follow reads so they agree with the paged ones --- server/src/crate_server/follow_index.gleam | 16 ++++++++-------- server/test/follow_index_test.gleam | 5 ++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/server/src/crate_server/follow_index.gleam b/server/src/crate_server/follow_index.gleam index 636d4c0..14e1845 100644 --- a/server/src/crate_server/follow_index.gleam +++ b/server/src/crate_server/follow_index.gleam @@ -168,10 +168,10 @@ fn handle(state: State, msg: Msg) -> actor.Next(State, Msg) { Following(did, reply) -> { process.send( reply, - dict.values(state.follows) - |> list.filter(fn(f) { f.did == did }) - |> list.map(fn(f) { f.subject }) - |> list.sort(string.compare), + state.follows + |> matching_values(fn(follow) { follow.did == did }, fn(follow) { + follow.subject + }), ) actor.continue(state) } @@ -189,10 +189,10 @@ fn handle(state: State, msg: Msg) -> actor.Next(State, Msg) { Followers(did, reply) -> { process.send( reply, - dict.values(state.follows) - |> list.filter(fn(f) { f.subject == did }) - |> list.map(fn(f) { f.did }) - |> list.sort(string.compare), + state.follows + |> matching_values(fn(follow) { follow.subject == did }, fn(follow) { + follow.did + }), ) actor.continue(state) } diff --git a/server/test/follow_index_test.gleam b/server/test/follow_index_test.gleam index bd72181..997e3d6 100644 --- a/server/test/follow_index_test.gleam +++ b/server/test/follow_index_test.gleam @@ -38,9 +38,12 @@ pub fn duplicate_records_are_preserved_until_their_uri_is_deleted_test() { let assert Ok(store) = follow_index.start() store.edges.upsert(follow("did:a", "did:b", "f1")) store.edges.upsert(follow("did:a", "did:b", "f2")) - assert store.edges.following("did:a") == ["did:b", "did:b"] + // One subject however many records point at it, matching the paged read. + assert store.edges.following("did:a") == ["did:b"] store.edges.delete("at://did:a/dev.mokkenstorm.crate.graph.follow/f1") assert store.edges.following("did:a") == ["did:b"] + store.edges.delete("at://did:a/dev.mokkenstorm.crate.graph.follow/f2") + assert store.edges.following("did:a") == [] } pub fn following_is_empty_until_a_did_is_seen_test() { -- 2.51.2