Current section
Files
Jump to
Current section
Files
src/trove@internal@compactor.erl
-module(trove@internal@compactor).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/trove/internal/compactor.gleam").
-export([compact/8]).
-export_type([keyspace_compaction/0, compacted_keyspace/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type keyspace_compaction() :: {keyspace_compaction,
binary(),
trove@internal@btree:btree(bitstring(), bitstring()),
fun((bitstring(), bitstring()) -> gleam@order:order())}.
-type compacted_keyspace() :: {compacted_keyspace,
binary(),
trove@internal@btree:btree(bitstring(), bitstring())}.
-file("src/trove/internal/compactor.gleam", 123).
?DOC(false).
-spec rewrite_keyspace(
keyspace_compaction(),
trove@internal@store:store(),
trove@internal@store:store(),
integer()
) -> {ok, compacted_keyspace()} | {error, trove@internal@btree:error()}.
rewrite_keyspace(Keyspace, Old_store, New_store, Capacity) ->
Bytes_codec = trove@codec:bit_array(),
Entries = trove@internal@btree@range:'query'(
erlang:element(3, Keyspace),
Old_store,
none,
none,
forward,
Bytes_codec,
Bytes_codec,
erlang:element(4, Keyspace)
),
gleam@result:'try'(
trove@internal@btree:load_from_yielder(
Entries,
New_store,
Capacity,
Bytes_codec,
Bytes_codec,
erlang:element(4, Keyspace)
),
fun(New_tree) ->
{ok, {compacted_keyspace, erlang:element(2, Keyspace), New_tree}}
end
).
-file("src/trove/internal/compactor.gleam", 152).
?DOC(false).
-spec keyspace_to_header(compacted_keyspace()) -> trove@internal@store:keyspace_header().
keyspace_to_header(Ks) ->
{keyspace_header,
erlang:element(2, Ks),
trove@internal@btree:root(erlang:element(3, Ks)),
trove@internal@btree:size(erlang:element(3, Ks)),
trove@internal@btree:dirt(erlang:element(3, Ks))}.
-file("src/trove/internal/compactor.gleam", 71).
?DOC(false).
-spec rewrite_all(
trove@internal@btree:btree(JSV, JSW),
list(keyspace_compaction()),
trove@internal@store:store(),
trove@internal@store:store(),
integer(),
trove@codec:codec(JSV),
trove@codec:codec(JSW),
fun((JSV, JSV) -> gleam@order:order())
) -> {ok,
{trove@internal@btree:btree(JSV, JSW),
list(compacted_keyspace()),
trove@internal@store:store()}} |
{error, trove@internal@btree:error()}.
rewrite_all(
Tree,
Keyspaces,
Old_store,
New_store,
Capacity,
Key_codec,
Value_codec,
Key_compare
) ->
Default_entries = trove@internal@btree@range:'query'(
Tree,
Old_store,
none,
none,
forward,
Key_codec,
Value_codec,
Key_compare
),
gleam@result:'try'(
trove@internal@btree:load_from_yielder(
Default_entries,
New_store,
Capacity,
Key_codec,
Value_codec,
Key_compare
),
fun(New_tree) ->
gleam@result:'try'(
gleam@list:try_map(
Keyspaces,
fun(_capture) ->
rewrite_keyspace(
_capture,
Old_store,
New_store,
Capacity
)
end
),
fun(New_keyspaces) ->
Header = {header,
trove@internal@btree:root(New_tree),
trove@internal@btree:size(New_tree),
trove@internal@btree:dirt(New_tree),
gleam@list:map(New_keyspaces, fun keyspace_to_header/1)},
gleam@result:'try'(
begin
_pipe = trove@internal@store:put_header(
New_store,
Header
),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {store_error, Field@0} end
)
end,
fun(_) ->
gleam@result:'try'(
begin
_pipe@1 = trove@internal@store:sync(
New_store
),
gleam@result:map_error(
_pipe@1,
fun(Field@0) -> {store_error, Field@0} end
)
end,
fun(_) ->
{ok, {New_tree, New_keyspaces, New_store}}
end
)
end
)
end
)
end
).
-file("src/trove/internal/compactor.gleam", 33).
?DOC(false).
-spec compact(
trove@internal@btree:btree(JSJ, JSK),
list(keyspace_compaction()),
trove@internal@store:store(),
binary(),
integer(),
trove@codec:codec(JSJ),
trove@codec:codec(JSK),
fun((JSJ, JSJ) -> gleam@order:order())
) -> {ok,
{trove@internal@btree:btree(JSJ, JSK),
list(compacted_keyspace()),
trove@internal@store:store()}} |
{error, trove@internal@btree:error()}.
compact(
Tree,
Keyspaces,
Old_store,
New_store_path,
Capacity,
Key_codec,
Value_codec,
Key_compare
) ->
gleam@result:'try'(
begin
_pipe = trove@internal@store:open(New_store_path),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {store_error, Field@0} end
)
end,
fun(New_store) ->
Res = rewrite_all(
Tree,
Keyspaces,
Old_store,
New_store,
Capacity,
Key_codec,
Value_codec,
Key_compare
),
case Res of
{ok, Val} ->
{ok, Val};
{error, E} ->
_ = trove@internal@store:close(New_store),
{error, E}
end
end
).