Skip to content

Commit

Permalink
Updates the collection size on delete all matching (#2985)
Browse files Browse the repository at this point in the history
  • Loading branch information
jyeshe authored Mar 6, 2025
1 parent 100e5af commit 596132b
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 28 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ and this project adheres to

### Added

- Update Collections admin UI storage counter after deleting all
[#2986](https://github.com/OpenFn/lightning/issues/2986)

### Changed

### Fixed
Expand Down
26 changes: 24 additions & 2 deletions lib/lightning/collections.ex
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,25 @@ defmodule Lightning.Collections do
handle_delete_items(collection, items_used_mem)
end)
|> Multi.delete_all(:delete, query)
|> Multi.update_all(
:update_collection,
fn %{items_used_mem: items_used_mem} ->
if key_pattern do
increment = [byte_size_sum: -items_used_mem]

from(c in Collection,
where: c.id == ^collection.id,
update: [inc: ^increment]
)
else
from(c in Collection,
where: c.id == ^collection.id,
update: [set: [byte_size_sum: 0]]
)
end
end,
[]
)
|> Repo.transaction()
|> case do
{:ok, %{delete: {count, nil}}} -> {:ok, count}
Expand Down Expand Up @@ -438,8 +457,11 @@ defmodule Lightning.Collections do
end
end

defp handle_delete_items(collection, delta_size) do
:ok = CollectionHook.handle_delete_items(collection, delta_size)
defp handle_delete_items(collection, items_size) do
if items_size do
:ok = CollectionHook.handle_delete_items(collection, items_size)
end

{:ok, nil}
end
end
78 changes: 52 additions & 26 deletions test/lightning/collections_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -463,27 +463,22 @@ defmodule Lightning.CollectionsTest do
test "deletes an entry for the given collection" do
collection = insert(:collection)

%{key: key1, value: value1} =
insert(:collection_item, collection: collection)
key1 = "áàâãäéèêëíìîï"
key2 = "óòôõöúùûüçñabc"

%{key: key2, value: value2} =
insert(:collection_item, collection: collection)
:ok = Collections.put(collection, key1, "12345")
:ok = Collections.put(collection, key2, "12345")

byte_size1 = byte_size(key1) + byte_size(value1)
byte_size2 = byte_size(key2) + byte_size(value2)

_collection =
Repo.update!(
Ecto.Changeset.change(collection, %{
byte_size_sum: byte_size1 + byte_size2
})
)
assert Collections.get(collection, key1)
assert Collections.get(collection, key2)

assert :ok = Collections.delete(collection, key1)

refute Collections.get(collection, key1)
assert Collections.get(collection, key2)

byte_size2 = byte_size(key2) + byte_size("12345")

assert %{byte_size_sum: ^byte_size2} =
Repo.get!(Collection, collection.id)
end
Expand All @@ -510,29 +505,60 @@ defmodule Lightning.CollectionsTest do
assert {:ok, 3} = Collections.delete_all(collection)

refute Enum.any?(items, &Collections.get(collection, &1.key))

assert %{byte_size_sum: 0} = Repo.get!(Collection, collection.id)
end

test "deletes matching items of the given collection" do
collection = insert(:collection)

item1 =
insert(:collection_item, collection: collection, key: "foo:123:bar1")
:ok = Collections.put(collection, "foo:111:bär1", "12345")
:ok = Collections.put(collection, "foo:222:bär2", "12345")
:ok = Collections.put(collection, "foo:333:bär3", "12345")
:ok = Collections.put(collection, "foo:444:bár4", "12345")

item4_size = byte_size("foo:444:bár4") + byte_size("12345")

collection_size =
item4_size + 3 * (byte_size("foo:333:bär3") + byte_size("12345"))

assert %{byte_size_sum: ^collection_size} =
Repo.get!(Collection, collection.id)

assert Collections.get(collection, "foo:111:bär1")
assert Collections.get(collection, "foo:222:bär2")
assert Collections.get(collection, "foo:333:bär3")

assert {:ok, 3} = Collections.delete_all(collection, "foo:*:bär*")

refute Collections.get(collection, "foo:111:bär1")
refute Collections.get(collection, "foo:222:bär2")
refute Collections.get(collection, "foo:333:bär3")
assert Collections.get(collection, "foo:444:bár4")

assert %{byte_size_sum: ^item4_size} = Repo.get!(Collection, collection.id)
end

test "deletes all items by matching on the given collection" do
collection = insert(:collection)

:ok = Collections.put(collection, "foo:111:bär1", "12345")
:ok = Collections.put(collection, "foo:222:bär2", "12345")

item2 =
insert(:collection_item, collection: collection, key: "foo:234:bar2")
collection_size = 2 * (byte_size("foo:nnn:bärn") + byte_size("12345"))

assert %{byte_size_sum: ^collection_size} =
Repo.get!(Collection, collection.id)

item3 =
insert(:collection_item, collection: collection, key: "foo:345:bar3")
assert Collections.get(collection, "foo:111:bär1")
assert Collections.get(collection, "foo:222:bär2")

item4 =
insert(:collection_item, collection: collection, key: "foo:456:zanzibar")
assert {:ok, 2} = Collections.delete_all(collection, "foo:*:bär*")

assert {:ok, 3} = Collections.delete_all(collection, "foo:*:bar*")
refute Collections.get(collection, "foo:111:bär1")
refute Collections.get(collection, "foo:222:bär2")

refute Collections.get(collection, item1.key)
refute Collections.get(collection, item2.key)
refute Collections.get(collection, item3.key)
assert Collections.get(collection, item4.key)
assert %{byte_size_sum: 0} = Repo.get!(Collection, collection.id)
end

test "returns an :error if the collection does not exist" do
Expand Down

0 comments on commit 596132b

Please sign in to comment.