rails_event_store_active_record 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rails_event_store_active_record.rb +1 -0
- data/lib/rails_event_store_active_record/batch_enumerator.rb +37 -0
- data/lib/rails_event_store_active_record/event_repository.rb +14 -12
- data/lib/rails_event_store_active_record/event_repository_reader.rb +24 -15
- data/lib/rails_event_store_active_record/version.rb +1 -1
- data/rails_event_store_active_record.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e48d5961480e62370dc58515c5547f58fb76c32b9f8f7edbab71b3369614ac8
|
4
|
+
data.tar.gz: a896d6cf151521d88fb35edb5bcdbaf00e2a49980bbf4b4f2345a994c6716446
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf060accdb07a4cd2d17855c5c064b32eb816b92753cf27f92cd98883fbfc0bbe9e975d633e31bcb2e1baef4c3a3b1ffeadf7eb437dfa0b148b2d5a43fcb8d54
|
7
|
+
data.tar.gz: 35d51b518967785f80500ff4be0b014cc5604400f0c020df4deebf4906a7100b5ade2166b9de59d91e8318a7165a61a63bb409d9db31b489f956a3cf8812c4d2
|
@@ -6,6 +6,7 @@ require 'rails_event_store_active_record/generators/limit_for_event_id_generator
|
|
6
6
|
require 'rails_event_store_active_record/generators/binary_data_and_metadata_generator'
|
7
7
|
require 'rails_event_store_active_record/event'
|
8
8
|
require 'rails_event_store_active_record/event_repository'
|
9
|
+
require 'rails_event_store_active_record/batch_enumerator'
|
9
10
|
require 'rails_event_store_active_record/event_repository_reader'
|
10
11
|
require 'rails_event_store_active_record/index_violation_detector'
|
11
12
|
require 'rails_event_store_active_record/pg_linearized_event_repository'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsEventStoreActiveRecord
|
4
|
+
class BatchEnumerator
|
5
|
+
def initialize(batch_size, total_limit, reader)
|
6
|
+
@batch_size = batch_size
|
7
|
+
@total_limit = total_limit
|
8
|
+
@reader = reader
|
9
|
+
end
|
10
|
+
|
11
|
+
def each
|
12
|
+
return to_enum unless block_given?
|
13
|
+
offset_id = nil
|
14
|
+
|
15
|
+
0.step(total_limit - 1, batch_size) do |batch_offset|
|
16
|
+
batch_limit = [batch_size, total_limit - batch_offset].min
|
17
|
+
results, offset_id = reader.call(offset_id, batch_limit)
|
18
|
+
|
19
|
+
break if results.empty?
|
20
|
+
yield results
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def first
|
25
|
+
each.first
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_a
|
29
|
+
each.to_a
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :batch_size, :total_limit, :reader
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -12,9 +12,13 @@ module RailsEventStoreActiveRecord
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def append_to_stream(events, stream, expected_version)
|
15
|
-
|
16
|
-
|
17
|
-
event
|
15
|
+
records, event_ids = [], []
|
16
|
+
Array(events).each do |event|
|
17
|
+
records << build_event_hash(event)
|
18
|
+
event_ids << event.event_id
|
19
|
+
end
|
20
|
+
add_to_stream(event_ids, stream, expected_version, true) do
|
21
|
+
Event.import(records)
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
@@ -23,9 +27,7 @@ module RailsEventStoreActiveRecord
|
|
23
27
|
(event_ids - Event.where(id: event_ids).pluck(:id)).each do |id|
|
24
28
|
raise RubyEventStore::EventNotFound.new(id)
|
25
29
|
end
|
26
|
-
add_to_stream(event_ids, stream, expected_version, nil)
|
27
|
-
event_id
|
28
|
-
end
|
30
|
+
add_to_stream(event_ids, stream, expected_version, nil)
|
29
31
|
end
|
30
32
|
|
31
33
|
def delete_stream(stream)
|
@@ -68,14 +70,14 @@ module RailsEventStoreActiveRecord
|
|
68
70
|
|
69
71
|
private
|
70
72
|
|
71
|
-
def add_to_stream(
|
73
|
+
def add_to_stream(event_ids, stream, expected_version, include_global)
|
72
74
|
last_stream_version = ->(stream_) { EventInStream.where(stream: stream_.name).order("position DESC").first.try(:position) }
|
73
75
|
resolved_version = expected_version.resolve_for(stream, last_stream_version)
|
74
76
|
|
75
77
|
start_transaction do
|
76
|
-
|
78
|
+
yield if block_given?
|
79
|
+
in_stream = event_ids.flat_map.with_index do |event_id, index|
|
77
80
|
position = compute_position(resolved_version, index)
|
78
|
-
event_id = to_event_id.call(element)
|
79
81
|
collection = []
|
80
82
|
collection.unshift({
|
81
83
|
stream: SERIALIZED_GLOBAL_STREAM_NAME,
|
@@ -114,13 +116,13 @@ module RailsEventStoreActiveRecord
|
|
114
116
|
IndexViolationDetector.new.detect(message)
|
115
117
|
end
|
116
118
|
|
117
|
-
def
|
118
|
-
|
119
|
+
def build_event_hash(serialized_record)
|
120
|
+
{
|
119
121
|
id: serialized_record.event_id,
|
120
122
|
data: serialized_record.data,
|
121
123
|
metadata: serialized_record.metadata,
|
122
124
|
event_type: serialized_record.event_type
|
123
|
-
|
125
|
+
}
|
124
126
|
end
|
125
127
|
|
126
128
|
# Overwritten in a sub-class
|
@@ -9,7 +9,7 @@ module RailsEventStoreActiveRecord
|
|
9
9
|
|
10
10
|
def last_stream_event(stream)
|
11
11
|
record = EventInStream.where(stream: stream.name).order('position DESC, id DESC').first
|
12
|
-
record &&
|
12
|
+
record && build_serialized_record(record)
|
13
13
|
end
|
14
14
|
|
15
15
|
def read(spec)
|
@@ -18,16 +18,19 @@ module RailsEventStoreActiveRecord
|
|
18
18
|
stream = read_scope(spec)
|
19
19
|
|
20
20
|
if spec.batched?
|
21
|
-
batch_reader = ->(
|
22
|
-
|
21
|
+
batch_reader = ->(offset_id, limit) do
|
22
|
+
records = offset_id.nil? ? stream.limit(limit) : stream.where(start_offset_condition(spec, offset_id)).limit(limit)
|
23
|
+
[records.map(&method(:build_serialized_record)), records.last]
|
24
|
+
end
|
25
|
+
BatchEnumerator.new(spec.batch_size, spec.limit, batch_reader).each
|
23
26
|
elsif spec.first?
|
24
27
|
record = stream.first
|
25
|
-
|
28
|
+
build_serialized_record(record) if record
|
26
29
|
elsif spec.last?
|
27
30
|
record = stream.last
|
28
|
-
|
31
|
+
build_serialized_record(record) if record
|
29
32
|
else
|
30
|
-
stream.map(&method(:
|
33
|
+
stream.map(&method(:build_serialized_record)).each
|
31
34
|
end
|
32
35
|
end
|
33
36
|
|
@@ -55,25 +58,31 @@ module RailsEventStoreActiveRecord
|
|
55
58
|
specification.stream.global? ? EventRepository::SERIALIZED_GLOBAL_STREAM_NAME : specification.stream.name
|
56
59
|
end
|
57
60
|
|
58
|
-
def
|
59
|
-
event_record =
|
60
|
-
EventInStream.find_by!(event_id: specification.start, stream: normalize_stream_name(specification))
|
61
|
+
def start_offset_condition(specification, record_id)
|
61
62
|
condition = specification.forward? ? 'event_store_events_in_streams.id > ?' : 'event_store_events_in_streams.id < ?'
|
62
|
-
[condition,
|
63
|
+
[condition, record_id]
|
63
64
|
end
|
64
65
|
|
65
|
-
def
|
66
|
-
event_record =
|
67
|
-
EventInStream.find_by!(event_id: specification.stop, stream: normalize_stream_name(specification))
|
66
|
+
def stop_offset_condition(specification, record_id)
|
68
67
|
condition = specification.forward? ? 'event_store_events_in_streams.id < ?' : 'event_store_events_in_streams.id > ?'
|
69
|
-
[condition,
|
68
|
+
[condition, record_id]
|
69
|
+
end
|
70
|
+
|
71
|
+
def start_condition(specification)
|
72
|
+
start_offset_condition(specification,
|
73
|
+
EventInStream.find_by!(event_id: specification.start, stream: normalize_stream_name(specification)))
|
74
|
+
end
|
75
|
+
|
76
|
+
def stop_condition(specification)
|
77
|
+
stop_offset_condition(specification,
|
78
|
+
EventInStream.find_by!(event_id: specification.stop, stream: normalize_stream_name(specification)))
|
70
79
|
end
|
71
80
|
|
72
81
|
def order(spec)
|
73
82
|
spec.forward? ? 'ASC' : 'DESC'
|
74
83
|
end
|
75
84
|
|
76
|
-
def
|
85
|
+
def build_serialized_record(record)
|
77
86
|
RubyEventStore::SerializedRecord.new(
|
78
87
|
event_id: record.event.id,
|
79
88
|
metadata: record.event.metadata,
|
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
26
|
spec.require_paths = ['lib']
|
27
27
|
|
28
|
-
spec.add_dependency 'ruby_event_store', '= 1.1.
|
28
|
+
spec.add_dependency 'ruby_event_store', '= 1.1.1'
|
29
29
|
spec.add_dependency 'activesupport', '>= 3.0'
|
30
30
|
spec.add_dependency 'activemodel', '>= 3.0'
|
31
31
|
spec.add_dependency 'activerecord-import', '>= 1.0.2'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_event_store_active_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arkency
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_event_store
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.1.
|
19
|
+
version: 1.1.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.1.
|
26
|
+
version: 1.1.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- bin/console
|
82
82
|
- bin/setup
|
83
83
|
- lib/rails_event_store_active_record.rb
|
84
|
+
- lib/rails_event_store_active_record/batch_enumerator.rb
|
84
85
|
- lib/rails_event_store_active_record/event.rb
|
85
86
|
- lib/rails_event_store_active_record/event_repository.rb
|
86
87
|
- lib/rails_event_store_active_record/event_repository_reader.rb
|