Skip to content

Commit 8060344

Browse files
authored
Merge pull request #297 from emizio/lm/handle_gaps_in_stream_forward_or_back
Stream.stream_forward and Stream.stream_backward should handle gaps
2 parents 362f087 + aa24810 commit 8060344

2 files changed

Lines changed: 57 additions & 4 deletions

File tree

lib/event_store/streams/stream.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ defmodule EventStore.Streams.Stream do
256256
fn next_version ->
257257
case read_storage_forward(conn, stream, next_version, read_batch_size, opts) do
258258
{:ok, []} -> {:halt, next_version}
259-
{:ok, events} -> {events, next_version + length(events)}
259+
{:ok, events} -> {events, List.last(events).event_number + 1}
260260
end
261261
end,
262262
fn _next_version -> :ok end
@@ -282,7 +282,7 @@ defmodule EventStore.Streams.Stream do
282282
next_version ->
283283
case read_storage_backward(conn, stream, next_version, read_batch_size, opts) do
284284
{:ok, []} -> {:halt, next_version}
285-
{:ok, events} -> {events, next_version - length(events)}
285+
{:ok, events} -> {events, List.last(events).event_number - 1}
286286
end
287287
end,
288288
fn _next_version -> :ok end

test/streams/all_stream_test.exs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ defmodule EventStore.Streams.AllStreamTest do
2828
end
2929

3030
describe "stream forward" do
31-
setup [:append_events_to_streams]
31+
setup [:append_events_to_streams, :enable_hard_deletes]
3232

3333
test "should stream events from all streams using single event batch size", %{
3434
conn: conn,
@@ -94,10 +94,31 @@ defmodule EventStore.Streams.AllStreamTest do
9494
assert Enum.map(read_events, & &1.event_number) == [1, 2, 3, 4, 5, 6]
9595
assert Enum.map(read_events, & &1.stream_version) == [1, 2, 3, 1, 2, 3]
9696
end
97+
98+
test "should handle gaps in all stream", %{
99+
conn: conn,
100+
schema: schema,
101+
serializer: serializer,
102+
stream1_uuid: stream1_uuid
103+
} do
104+
105+
:ok = EventStore.delete_stream(stream1_uuid, :stream_exists, :hard)
106+
107+
read_events =
108+
Stream.stream_forward(conn, @all_stream, 0,
109+
read_batch_size: 1,
110+
schema: schema,
111+
serializer: serializer
112+
)
113+
|> Enum.to_list()
114+
115+
assert length(read_events) == 3
116+
assert Enum.map(read_events, & &1.event_number) == [4, 5, 6]
117+
end
97118
end
98119

99120
describe "stream backward" do
100-
setup [:append_events_to_streams]
121+
setup [:append_events_to_streams, :enable_hard_deletes]
101122

102123
test "should stream events from all streams using single event batch size", %{
103124
conn: conn,
@@ -181,6 +202,27 @@ defmodule EventStore.Streams.AllStreamTest do
181202
assert Enum.map(read_events, & &1.event_number) == [3, 2, 1]
182203
assert Enum.map(read_events, & &1.stream_version) == [3, 2, 1]
183204
end
205+
206+
test "should handle gaps in all stream", %{
207+
conn: conn,
208+
schema: schema,
209+
serializer: serializer,
210+
stream2_uuid: stream2_uuid
211+
} do
212+
213+
:ok = EventStore.delete_stream(stream2_uuid, :stream_exists, :hard)
214+
215+
read_events =
216+
Stream.stream_backward(conn, @all_stream, -1,
217+
read_batch_size: 1,
218+
schema: schema,
219+
serializer: serializer
220+
)
221+
|> Enum.to_list()
222+
223+
assert length(read_events) == 3
224+
assert Enum.map(read_events, & &1.event_number) == [3, 2, 1]
225+
end
184226
end
185227

186228
describe "subscribe to all streams" do
@@ -284,4 +326,15 @@ defmodule EventStore.Streams.AllStreamTest do
284326

285327
{stream_uuid, events}
286328
end
329+
330+
defp enable_hard_deletes(_context) do
331+
restart_event_store_with_config(enable_hard_deletes: true)
332+
end
333+
334+
defp restart_event_store_with_config(config) do
335+
stop_supervised!(TestEventStore)
336+
start_supervised!({TestEventStore, config})
337+
338+
:ok
339+
end
287340
end

0 commit comments

Comments
 (0)