Expand in-memory storage indexes

This commit is contained in:
2026-03-18 19:43:11 +01:00
parent 4c40edfd83
commit 7a43ebd395
4 changed files with 528 additions and 73 deletions

View File

@@ -179,4 +179,127 @@ defmodule Parrhesia.Storage.Adapters.Memory.AdapterTest do
assert Enum.map(results, & &1["id"]) == [newest["id"], middle["id"]]
end
test "memory adapter counts and returns refs without duplicate overlaps across indexed filters" do
author = String.duplicate("9", 64)
tag = "shared"
older =
%{
"id" => String.duplicate("a", 64),
"pubkey" => author,
"created_at" => 1_700_000_200,
"kind" => 1,
"tags" => [["t", tag]],
"content" => "older"
}
newer =
%{
"id" => String.duplicate("b", 64),
"pubkey" => author,
"created_at" => 1_700_000_201,
"kind" => 1,
"tags" => [["t", tag]],
"content" => "newer"
}
unrelated =
%{
"id" => String.duplicate("c", 64),
"pubkey" => String.duplicate("d", 64),
"created_at" => 1_700_000_202,
"kind" => 2,
"tags" => [["t", "other"]],
"content" => "unrelated"
}
assert {:ok, _event} = Events.put_event(%{}, older)
assert {:ok, _event} = Events.put_event(%{}, newer)
assert {:ok, _event} = Events.put_event(%{}, unrelated)
filters = [
%{"authors" => [author], "kinds" => [1]},
%{"#t" => [tag]}
]
assert {:ok, 2} = Events.count(%{}, filters, [])
assert {:ok, refs} = Events.query_event_refs(%{}, filters, [])
assert Enum.map(refs, &Base.encode16(&1.id, case: :lower)) == [older["id"], newer["id"]]
end
test "memory adapter uses indexes for vanish and keeps unrelated events" do
author = String.duplicate("e", 64)
other = String.duplicate("f", 64)
own_event =
%{
"id" => String.duplicate("1", 64),
"pubkey" => author,
"created_at" => 1_700_000_300,
"kind" => 1,
"tags" => [],
"content" => "own-event"
}
giftwrap_event =
%{
"id" => String.duplicate("2", 64),
"pubkey" => other,
"created_at" => 1_700_000_301,
"kind" => 1059,
"tags" => [["p", author]],
"content" => "giftwrap"
}
other_event =
%{
"id" => String.duplicate("3", 64),
"pubkey" => other,
"created_at" => 1_700_000_302,
"kind" => 1,
"tags" => [],
"content" => "other"
}
assert {:ok, _event} = Events.put_event(%{}, own_event)
assert {:ok, _event} = Events.put_event(%{}, giftwrap_event)
assert {:ok, _event} = Events.put_event(%{}, other_event)
assert {:ok, 2} =
Events.vanish(%{}, %{"pubkey" => author, "created_at" => 1_700_000_400})
assert {:ok, nil} = Events.get_event(%{}, own_event["id"])
assert {:ok, nil} = Events.get_event(%{}, giftwrap_event["id"])
assert {:ok, remaining} = Events.get_event(%{}, other_event["id"])
assert remaining["id"] == other_event["id"]
end
test "memory admin keeps a bounded newest-first audit log" do
Enum.each(1..1_005, fn index ->
assert :ok =
Admin.append_audit_log(%{}, %{
method: if(rem(index, 2) == 0, do: "stats", else: "ping"),
actor_pubkey: if(rem(index, 3) == 0, do: "actor-a", else: "actor-b"),
params: %{index: index}
})
end)
assert {:ok, latest_logs} = Admin.list_audit_logs(%{}, limit: 3)
assert length(latest_logs) == 3
assert Enum.map(latest_logs, & &1.params.index) == [1005, 1004, 1003]
assert {:ok, actor_logs} = Admin.list_audit_logs(%{}, actor_pubkey: "actor-a", limit: 2)
assert Enum.all?(actor_logs, &(&1.actor_pubkey == "actor-a"))
assert {:ok, stats_logs} = Admin.list_audit_logs(%{}, method: :stats, limit: 2)
assert Enum.all?(stats_logs, &(&1.method == "stats"))
assert {:ok, retained_logs} = Admin.list_audit_logs(%{}, limit: 2_000)
assert length(retained_logs) == 1_000
assert Enum.any?(retained_logs, &(&1.params.index == 1005))
refute Enum.any?(retained_logs, &(&1.params.index == 1))
end
end