sandthorn_driver_sequel 3.2.1 → 4.0.0
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/README.md +2 -4
- data/lib/sandthorn_driver_sequel/access/aggregate_access.rb +0 -4
- data/lib/sandthorn_driver_sequel/access/event_access.rb +11 -15
- data/lib/sandthorn_driver_sequel/errors.rb +0 -14
- data/lib/sandthorn_driver_sequel/event_query.rb +3 -2
- data/lib/sandthorn_driver_sequel/event_store.rb +10 -98
- data/lib/sandthorn_driver_sequel/event_store_context.rb +3 -3
- data/lib/sandthorn_driver_sequel/migration.rb +20 -3
- data/lib/sandthorn_driver_sequel/storage.rb +0 -9
- data/lib/sandthorn_driver_sequel/version.rb +1 -1
- data/lib/sandthorn_driver_sequel/wrappers/event_wrapper.rb +1 -1
- data/lib/sandthorn_driver_sequel/wrappers.rb +0 -1
- data/lib/sandthorn_driver_sequel.rb +0 -26
- data/sandthorn_driver_sequel.gemspec +2 -3
- data/spec/aggregate_access_spec.rb +0 -10
- data/spec/benchmark_spec.rb +6 -35
- data/spec/configuration_spec.rb +0 -29
- data/spec/driver_interface_spec.rb +0 -7
- data/spec/event_access_spec.rb +4 -22
- data/spec/event_store_spec.rb +43 -73
- data/spec/event_store_with_context_spec.rb +5 -5
- data/spec/get_events_spec.rb +12 -47
- data/spec/migration_specifying_domain_spec.rb +6 -6
- data/spec/saving_events_spec.rb +22 -28
- data/spec/storage_spec.rb +1 -0
- metadata +8 -31
- data/lib/sandthorn_driver_sequel/access/snapshot_access.rb +0 -105
- data/lib/sandthorn_driver_sequel/wrappers/snapshot_wrapper.rb +0 -19
- data/spec/asking_for_aggregates_to_snapshot_spec.rb +0 -66
- data/spec/saving_snapshot_spec.rb +0 -69
- data/spec/snapshot_access_spec.rb +0 -110
data/spec/event_access_spec.rb
CHANGED
@@ -17,10 +17,7 @@ module SandthornDriverSequel
|
|
17
17
|
let(:storage) { Storage.new(db, :test) }
|
18
18
|
let(:event_serializer) { -> (data) { YAML.dump(data) } }
|
19
19
|
let(:event_deserializer) { -> (data) { YAML.load(data) } }
|
20
|
-
let(:snapshot_serializer) { -> (data) { YAML.dump(data) } }
|
21
|
-
let(:snapshot_deserializer) { -> (data) { YAML.load(data) } }
|
22
20
|
let(:aggregate_access) { AggregateAccess.new(storage) }
|
23
|
-
let(:snapshot_access) { SnapshotAccess.new(storage, snapshot_serializer, snapshot_deserializer)}
|
24
21
|
let(:access) { EventAccess.new(storage, event_serializer, event_deserializer) }
|
25
22
|
|
26
23
|
|
@@ -29,11 +26,13 @@ module SandthornDriverSequel
|
|
29
26
|
{
|
30
27
|
aggregate_version: 1,
|
31
28
|
event_name: "new",
|
32
|
-
|
29
|
+
event_data: "new_data",
|
30
|
+
event_metadata: nil
|
33
31
|
},{
|
34
32
|
aggregate_version: 2,
|
35
33
|
event_name: "foo",
|
36
|
-
|
34
|
+
event_data: "foo_data",
|
35
|
+
event_metadata: nil
|
37
36
|
}
|
38
37
|
]
|
39
38
|
end
|
@@ -88,22 +87,5 @@ module SandthornDriverSequel
|
|
88
87
|
end
|
89
88
|
end
|
90
89
|
|
91
|
-
describe "#after_snapshot" do
|
92
|
-
it "returns events after the given snapshot" do
|
93
|
-
access.store_events(aggregate, events.first)
|
94
|
-
|
95
|
-
aggregate_struct = Struct::AggregateMock.new aggregate_id, events.first[:aggregate_version]
|
96
|
-
|
97
|
-
snapshot_id = snapshot_access.record_snapshot(aggregate_struct)
|
98
|
-
snapshot = snapshot_access.find(snapshot_id)
|
99
|
-
|
100
|
-
access.store_events(aggregate, events.last)
|
101
|
-
|
102
|
-
events = access.after_snapshot(snapshot)
|
103
|
-
expect(events.count).to eq(1)
|
104
|
-
expect(events.first[:event_args]).to eq("foo_data")
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
90
|
end
|
109
91
|
end
|
data/spec/event_store_spec.rb
CHANGED
@@ -1,76 +1,46 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
module SandthornDriverSequel
|
3
|
-
|
1
|
+
# require 'spec_helper'
|
2
|
+
# module SandthornDriverSequel
|
3
|
+
# describe EventStore do
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
# before(:each) { prepare_for_test context: nil; }
|
6
|
+
# let(:event_store) { SandthornDriverSequel.driver_from_url url: event_store_url }
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
# describe("when getting the same data from find and aggregate_events") do
|
9
|
+
# let(:test_events) do
|
10
|
+
# e = []
|
11
|
+
# e << {aggregate_version: 1, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>aggregate_id}]}, event_meta_data: nil}
|
12
|
+
# e << {aggregate_version: 2, event_name: "foo", event_data: "noop", event_meta_data: nil}
|
13
|
+
# e << {aggregate_version: 3, event_name: "flubber", event_data: "noop", event_meta_data: nil}
|
14
|
+
# end
|
15
|
+
# let(:aggregate_id) {"c0456e26-e29a-4f67-92fa-130b3a31a39b"}
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
48
|
-
let(:aggregate_id_2) {"d0456e26-e29a-4f67-92fa-130b3a31a39b"}
|
49
|
-
|
50
|
-
before do
|
51
|
-
event_store.save_events test_events_2, aggregate_id_2, String
|
52
|
-
end
|
53
|
-
|
54
|
-
let(:all_events) do
|
55
|
-
event_store.all String
|
56
|
-
end
|
57
|
-
|
58
|
-
let(:obsolete_all) do
|
59
|
-
return event_store.get_aggregate_ids(aggregate_type: String).map do |id|
|
60
|
-
event_store.get_aggregate_events_from_snapshot(id)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should get two arrays of events" do
|
65
|
-
expect(all_events.length).to eql 2
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should get same events" do
|
69
|
-
all_events.each_with_index do |events, index|
|
70
|
-
expect(events).to eql obsolete_all[index]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
17
|
+
# before do
|
18
|
+
# event_store.save_events test_events, aggregate_id, String
|
19
|
+
# end
|
20
|
+
|
21
|
+
# context "all" do
|
22
|
+
|
23
|
+
# let(:test_events_2) do
|
24
|
+
# e = []
|
25
|
+
# e << {aggregate_version: 1, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>aggregate_id_2}]}, event_meta_data: nil}
|
26
|
+
# e << {aggregate_version: 2, event_name: "foo", event_data: "noop", event_meta_data: nil}
|
27
|
+
# e << {aggregate_version: 3, event_name: "flubber", event_data: "noop", event_meta_data: nil}
|
28
|
+
# end
|
29
|
+
# let(:aggregate_id_2) {"d0456e26-e29a-4f67-92fa-130b3a31a39b"}
|
30
|
+
|
31
|
+
# before do
|
32
|
+
# event_store.save_events test_events_2, aggregate_id_2, String
|
33
|
+
# end
|
34
|
+
|
35
|
+
# let(:all_events) do
|
36
|
+
# event_store.all String
|
37
|
+
# end
|
38
|
+
|
39
|
+
# it "should get two arrays of events" do
|
40
|
+
# expect(all_events.length).to eql 2
|
41
|
+
# end
|
42
|
+
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
# end
|
46
|
+
# end
|
@@ -8,16 +8,16 @@ module SandthornDriverSequel
|
|
8
8
|
context("when saving in one context and retrieving in another") do
|
9
9
|
let(:test_events) do
|
10
10
|
e = []
|
11
|
-
e << {aggregate_version: 1, event_name: "new",
|
12
|
-
e << {aggregate_version: 2, event_name: "foo",
|
13
|
-
e << {aggregate_version: 3, event_name: "flubber",
|
11
|
+
e << {aggregate_version: 1, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}, event_metadata: nil}
|
12
|
+
e << {aggregate_version: 2, event_name: "foo", event_data: "noop", event_metadata: nil}
|
13
|
+
e << {aggregate_version: 3, event_name: "flubber", event_data: "noop", event_metadata: nil}
|
14
14
|
end
|
15
15
|
let(:aggregate_id) {"c0456e26-e29a-4f67-92fa-130b3a31a39b"}
|
16
16
|
it "should not find them" do
|
17
17
|
event_store_without_context.save_events test_events, aggregate_id, String
|
18
|
-
events = event_store_without_context.
|
18
|
+
events = event_store_without_context.find aggregate_id, String
|
19
19
|
expect(events.length).to eql test_events.length
|
20
|
-
events_2 = event_store_with_context.
|
20
|
+
events_2 = event_store_with_context.find aggregate_id, String
|
21
21
|
expect(events_2.length).to eql 0
|
22
22
|
end
|
23
23
|
end
|
data/spec/get_events_spec.rb
CHANGED
@@ -5,25 +5,25 @@ module SandthornDriverSequel
|
|
5
5
|
before(:each) { prepare_for_test }
|
6
6
|
let(:test_events_a) do
|
7
7
|
e = []
|
8
|
-
e << {aggregate_version: 1, event_name: "new",
|
9
|
-
e << {aggregate_version: 2, event_name: "foo",
|
10
|
-
e << {aggregate_version: 3, event_name: "bard",
|
8
|
+
e << {aggregate_version: 1, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}, event_metadata: {a: 1}}
|
9
|
+
e << {aggregate_version: 2, event_name: "foo", event_data: "A2", event_metadata: {a: 1}}
|
10
|
+
e << {aggregate_version: 3, event_name: "bard", event_data: "A3", event_metadata: {a: 1}}
|
11
11
|
end
|
12
12
|
let(:aggregate_id_a) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
13
13
|
let(:test_events_b) do
|
14
14
|
e = []
|
15
|
-
e << {aggregate_version: 1, event_name: "new",
|
16
|
-
e << {aggregate_version: 2, event_name: "foo",
|
17
|
-
e << {aggregate_version: 3, event_name: "bar",
|
15
|
+
e << {aggregate_version: 1, event_name: "new", event_data: "B1", event_metadata: 1}
|
16
|
+
e << {aggregate_version: 2, event_name: "foo", event_data: "B2", event_metadata: 2}
|
17
|
+
e << {aggregate_version: 3, event_name: "bar", event_data: "B3", event_metadata: 3}
|
18
18
|
end
|
19
19
|
let(:aggregate_id_b) {"c0456e26-1234-4f67-92fa-130b3a31a39a"}
|
20
20
|
let(:test_events_c) do
|
21
21
|
e = []
|
22
|
-
e << {aggregate_version: 1, event_name: "new",
|
22
|
+
e << {aggregate_version: 1, event_name: "new", event_data: "C1", event_metadata: 4}
|
23
23
|
end
|
24
24
|
let(:test_events_c_2) do
|
25
25
|
e = []
|
26
|
-
e << {aggregate_version: 2, event_name: "flubber",
|
26
|
+
e << {aggregate_version: 2, event_name: "flubber", event_data: "C2", event_metadata: 6}
|
27
27
|
end
|
28
28
|
let(:aggregate_id_c) {"c0456e26-2345-4f67-92fa-130b3a31a39a"}
|
29
29
|
before(:each) do
|
@@ -82,47 +82,12 @@ module SandthornDriverSequel
|
|
82
82
|
it "should contain only events for aggregate_id_a" do
|
83
83
|
events.each { |e| expect(e[:aggregate_id]).to eql aggregate_id_a }
|
84
84
|
end
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
context "and getting events for SandthornDriverSequel::EventStore after 0" do
|
89
|
-
let(:events) {event_store.get_new_events_after_event_id_matching_classname 0, SandthornDriverSequel::EventStore}
|
90
|
-
it "should find 3 events" do
|
91
|
-
expect(events.length).to eql 3
|
92
|
-
end
|
93
|
-
it "should be in sequence_number order" do
|
94
|
-
check = 0
|
95
|
-
events.each { |e| expect(e[:sequence_number]).to be > check; check = e[:sequence_number] }
|
96
|
-
end
|
97
|
-
it "should contain only events for aggregate_id_a" do
|
98
|
-
events.each { |e| expect(e[:aggregate_id]).to eql aggregate_id_a }
|
99
|
-
end
|
100
|
-
it "should be able to get events after a sequence number" do
|
101
|
-
new_from = events[1][:sequence_number]
|
102
|
-
ev = event_store.get_new_events_after_event_id_matching_classname new_from, SandthornDriverSequel::EventStore
|
103
|
-
expect(ev.last[:aggregate_version]).to eql 3
|
104
|
-
expect(ev.length).to eql 1
|
105
|
-
end
|
106
|
-
it "should be able to limit the number of results" do
|
107
|
-
ev = event_store.get_new_events_after_event_id_matching_classname 0, SandthornDriverSequel::EventStore, take: 2
|
108
|
-
expect(ev.length).to eql 2
|
109
|
-
expect(ev.last[:aggregate_version]).to eql 2
|
110
|
-
end
|
111
|
-
end
|
112
|
-
context "and getting events for String after 0" do
|
113
|
-
let(:events) {event_store.get_new_events_after_event_id_matching_classname 0, "String"}
|
114
|
-
it "should find 3 events" do
|
115
|
-
expect(events.length).to eql 2
|
116
|
-
end
|
117
|
-
it "should be in sequence_number order" do
|
118
|
-
check = 0
|
119
|
-
events.each { |e| expect(e[:sequence_number]).to be > check; check = e[:sequence_number] }
|
120
|
-
end
|
121
|
-
it "should contain only events for aggregate_id_c" do
|
122
|
-
events.each { |e| expect(e[:aggregate_id]).to eql aggregate_id_c }
|
85
|
+
|
86
|
+
it "shoul have correct event_metadata" do
|
87
|
+
events.each { |e| expect(e[:event_metadata]).to eql ({a: 1}) }
|
123
88
|
end
|
124
89
|
end
|
125
90
|
end
|
126
|
-
|
91
|
+
|
127
92
|
end
|
128
93
|
end
|
@@ -5,29 +5,29 @@ module SandthornDriverSequel
|
|
5
5
|
def check_tables context = nil
|
6
6
|
events = :events
|
7
7
|
aggregates = :aggregates
|
8
|
-
|
8
|
+
|
9
9
|
if context
|
10
10
|
events = "#{context}_#{events}".to_sym
|
11
11
|
aggregates = "#{context}_#{aggregates}".to_sym
|
12
|
-
|
12
|
+
|
13
13
|
end
|
14
14
|
migration.driver.execute do |db|
|
15
15
|
expect(db.table_exists? events).to be_truthy, "expected table :#{events} to exist, but it didn't"
|
16
16
|
expect(db.table_exists? aggregates).to be_truthy, "expected table :#{aggregates} to exist, but it didn't"
|
17
|
-
|
17
|
+
|
18
18
|
end
|
19
19
|
end
|
20
20
|
let(:migration) { Migration.new url: event_store_url, context: context }
|
21
21
|
before(:each) { migration.migrate! }
|
22
22
|
context "when default (nil) eventstore contex" do
|
23
23
|
let(:context) { nil }
|
24
|
-
it "should create the tables events
|
24
|
+
it "should create the tables events and aggregates" do
|
25
25
|
check_tables
|
26
26
|
end
|
27
27
|
end
|
28
28
|
context "when specifying context" do
|
29
29
|
let(:context) { :another_domain }
|
30
|
-
it "should create the tables events
|
30
|
+
it "should create the tables events and aggregates" do
|
31
31
|
check_tables context
|
32
32
|
end
|
33
33
|
end
|
@@ -35,7 +35,7 @@ module SandthornDriverSequel
|
|
35
35
|
context "when migrating a connection" do
|
36
36
|
let(:migration) { Migration.new connection: Sequel.sqlite, context: context }
|
37
37
|
let(:context) { :some_domain }
|
38
|
-
it "should create the tables events
|
38
|
+
it "should create the tables events and aggregates" do
|
39
39
|
check_tables context
|
40
40
|
end
|
41
41
|
end
|
data/spec/saving_events_spec.rb
CHANGED
@@ -6,24 +6,25 @@ module SandthornDriverSequel
|
|
6
6
|
context "when saving a prefectly sane event stream" do
|
7
7
|
let(:test_events) do
|
8
8
|
e = []
|
9
|
-
e << {aggregate_version: 1, event_name: "new",
|
10
|
-
e << {aggregate_version: 2, event_name: "foo",
|
11
|
-
e << {aggregate_version: 3, event_name: "flubber",
|
9
|
+
e << {aggregate_version: 1, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}, event_metadata: [1,2,3]}
|
10
|
+
e << {aggregate_version: 2, event_name: "foo", event_data: "noop", event_metadata: nil}
|
11
|
+
e << {aggregate_version: 3, event_name: "flubber", event_data: "noop", event_metadata: nil}
|
12
12
|
end
|
13
13
|
|
14
14
|
let(:aggregate_id) { "c0456e26-e29a-4f67-92fa-130b3a31a39a" }
|
15
15
|
|
16
16
|
it "should be able to save and retrieve events on the aggregate" do
|
17
17
|
event_store.save_events test_events, aggregate_id, String
|
18
|
-
events = event_store.
|
18
|
+
events = event_store.find aggregate_id, String
|
19
19
|
expect(events.length).to eql test_events.length
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should have correct keys when asking for events" do
|
23
23
|
event_store.save_events test_events, aggregate_id, String
|
24
|
-
events = event_store.
|
24
|
+
events = event_store.find aggregate_id, String
|
25
25
|
event = events.first
|
26
|
-
expect(event[:
|
26
|
+
expect(event[:event_data]).to eql(test_events.first[:event_data])
|
27
|
+
expect(event[:event_metadata]).to eql(test_events.first[:event_metadata])
|
27
28
|
expect(event[:event_name]).to eql("new")
|
28
29
|
expect(event[:aggregate_id]).to eql aggregate_id
|
29
30
|
expect(event[:aggregate_version]).to eql 1
|
@@ -35,13 +36,13 @@ module SandthornDriverSequel
|
|
35
36
|
context "when saving two aggregate types" do
|
36
37
|
let(:test_events_1) do
|
37
38
|
e = []
|
38
|
-
e << {aggregate_version: 1, event_name: "new",
|
39
|
-
e << {aggregate_version: 2, event_name: "foo",
|
40
|
-
e << {aggregate_version: 3, event_name: "flubber",
|
39
|
+
e << {aggregate_version: 1, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}, event_metadata: nil}
|
40
|
+
e << {aggregate_version: 2, event_name: "foo", event_data: "noop", event_metadata: nil}
|
41
|
+
e << {aggregate_version: 3, event_name: "flubber", event_data: "noop", event_metadata: nil}
|
41
42
|
end
|
42
43
|
let(:test_events_2) do
|
43
44
|
e = []
|
44
|
-
e << {aggregate_version: 1, event_name: "new",
|
45
|
+
e << {aggregate_version: 1, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}, event_metadata: nil}
|
45
46
|
end
|
46
47
|
let(:aggregate_id_1) {"c0456e26-e29a-4f67-92fa-130b3a31a39a"}
|
47
48
|
let(:aggregate_id_2) {"c0456e26-e92b-4f67-92fa-130b3a31b93b"}
|
@@ -53,43 +54,36 @@ module SandthornDriverSequel
|
|
53
54
|
event_store.save_events test_events_2, aggregate_id_3, String
|
54
55
|
end
|
55
56
|
|
56
|
-
it "
|
57
|
-
|
58
|
-
expect(
|
59
|
-
expect(
|
60
|
-
expect(
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should list the aggregate ids when asking for get_aggregate_list_by_typename" do
|
64
|
-
ids = event_store.get_aggregate_ids(aggregate_type: String)
|
65
|
-
expect(ids.length).to eql 2
|
66
|
-
expect(ids.any? { |e| e == aggregate_id_1 }).to be_truthy
|
67
|
-
expect(ids.any? { |e| e == aggregate_id_3 }).to be_truthy
|
57
|
+
it "should get the correct aggregate_id in events when asking for all" do
|
58
|
+
aggregate_events = event_store.all(String)
|
59
|
+
expect(aggregate_events.length).to eql 2
|
60
|
+
expect(aggregate_events.first.any? { |e| e[:aggregate_id] == aggregate_id_1 }).to be_truthy
|
61
|
+
expect(aggregate_events.last.any? { |e| e[:aggregate_id] == aggregate_id_3 }).to be_truthy
|
68
62
|
end
|
69
63
|
end
|
70
64
|
|
71
65
|
context "when saving events that have no aggregate_version" do
|
72
66
|
let(:test_events) do
|
73
67
|
e = []
|
74
|
-
e << {aggregate_version: nil, event_name: "new",
|
75
|
-
e << {aggregate_version: nil, event_name: "foo",
|
76
|
-
e << {aggregate_version: nil, event_name: "flubber",
|
68
|
+
e << {aggregate_version: nil, event_name: "new", event_data: {:attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}, event_metadata: nil}
|
69
|
+
e << {aggregate_version: nil, event_name: "foo", event_data: "noop", event_metadata: nil}
|
70
|
+
e << {aggregate_version: nil, event_name: "flubber", event_data: "noop", event_metadata: nil}
|
77
71
|
end
|
78
72
|
|
79
73
|
let(:aggregate_id) { "c0456e26-e29a-4f67-92fa-130b3a31a39a" }
|
80
74
|
|
81
75
|
it "should be able to save and retrieve events on the aggregate" do
|
82
76
|
event_store.save_events test_events, aggregate_id, String
|
83
|
-
events = event_store.
|
77
|
+
events = event_store.find aggregate_id, String
|
84
78
|
expect(events.length).to eql test_events.length
|
85
79
|
end
|
86
80
|
|
87
81
|
it "should have correct keys when asking for events" do
|
88
82
|
event_store.save_events test_events, aggregate_id, String
|
89
|
-
events = event_store.
|
83
|
+
events = event_store.find aggregate_id, String
|
90
84
|
event = events.first
|
91
85
|
|
92
|
-
expect(event[:
|
86
|
+
expect(event[:event_data]).to eql(test_events.first[:event_data])
|
93
87
|
expect(event[:event_name]).to eql("new")
|
94
88
|
expect(event[:aggregate_id]).to eql aggregate_id
|
95
89
|
expect(event[:aggregate_version]).to eql 1
|
data/spec/storage_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sandthorn_driver_sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Krantz
|
@@ -10,22 +10,22 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-05-31 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - "
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - "
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
28
|
+
version: '0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rake
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -167,33 +167,19 @@ dependencies:
|
|
167
167
|
- !ruby/object:Gem::Version
|
168
168
|
version: '0'
|
169
169
|
- !ruby/object:Gem::Dependency
|
170
|
-
name:
|
170
|
+
name: sequel
|
171
171
|
requirement: !ruby/object:Gem::Requirement
|
172
172
|
requirements:
|
173
173
|
- - ">="
|
174
174
|
- !ruby/object:Gem::Version
|
175
175
|
version: '0'
|
176
|
-
type: :
|
176
|
+
type: :runtime
|
177
177
|
prerelease: false
|
178
178
|
version_requirements: !ruby/object:Gem::Requirement
|
179
179
|
requirements:
|
180
180
|
- - ">="
|
181
181
|
- !ruby/object:Gem::Version
|
182
182
|
version: '0'
|
183
|
-
- !ruby/object:Gem::Dependency
|
184
|
-
name: sequel
|
185
|
-
requirement: !ruby/object:Gem::Requirement
|
186
|
-
requirements:
|
187
|
-
- - "~>"
|
188
|
-
- !ruby/object:Gem::Version
|
189
|
-
version: '4.17'
|
190
|
-
type: :runtime
|
191
|
-
prerelease: false
|
192
|
-
version_requirements: !ruby/object:Gem::Requirement
|
193
|
-
requirements:
|
194
|
-
- - "~>"
|
195
|
-
- !ruby/object:Gem::Version
|
196
|
-
version: '4.17'
|
197
183
|
description: Sequel driver for Sandthorn
|
198
184
|
email:
|
199
185
|
- lars.krantz@alaz.se
|
@@ -218,7 +204,6 @@ files:
|
|
218
204
|
- lib/sandthorn_driver_sequel/access.rb
|
219
205
|
- lib/sandthorn_driver_sequel/access/aggregate_access.rb
|
220
206
|
- lib/sandthorn_driver_sequel/access/event_access.rb
|
221
|
-
- lib/sandthorn_driver_sequel/access/snapshot_access.rb
|
222
207
|
- lib/sandthorn_driver_sequel/errors.rb
|
223
208
|
- lib/sandthorn_driver_sequel/event_query.rb
|
224
209
|
- lib/sandthorn_driver_sequel/event_store.rb
|
@@ -231,10 +216,8 @@ files:
|
|
231
216
|
- lib/sandthorn_driver_sequel/version.rb
|
232
217
|
- lib/sandthorn_driver_sequel/wrappers.rb
|
233
218
|
- lib/sandthorn_driver_sequel/wrappers/event_wrapper.rb
|
234
|
-
- lib/sandthorn_driver_sequel/wrappers/snapshot_wrapper.rb
|
235
219
|
- sandthorn_driver_sequel.gemspec
|
236
220
|
- spec/aggregate_access_spec.rb
|
237
|
-
- spec/asking_for_aggregates_to_snapshot_spec.rb
|
238
221
|
- spec/benchmark_spec.rb
|
239
222
|
- spec/configuration_spec.rb
|
240
223
|
- spec/db/.keep
|
@@ -245,8 +228,6 @@ files:
|
|
245
228
|
- spec/get_events_spec.rb
|
246
229
|
- spec/migration_specifying_domain_spec.rb
|
247
230
|
- spec/saving_events_spec.rb
|
248
|
-
- spec/saving_snapshot_spec.rb
|
249
|
-
- spec/snapshot_access_spec.rb
|
250
231
|
- spec/spec_helper.rb
|
251
232
|
- spec/storage_spec.rb
|
252
233
|
homepage: ''
|
@@ -275,7 +256,6 @@ specification_version: 4
|
|
275
256
|
summary: Sequel driver for Sandthorn
|
276
257
|
test_files:
|
277
258
|
- spec/aggregate_access_spec.rb
|
278
|
-
- spec/asking_for_aggregates_to_snapshot_spec.rb
|
279
259
|
- spec/benchmark_spec.rb
|
280
260
|
- spec/configuration_spec.rb
|
281
261
|
- spec/db/.keep
|
@@ -286,8 +266,5 @@ test_files:
|
|
286
266
|
- spec/get_events_spec.rb
|
287
267
|
- spec/migration_specifying_domain_spec.rb
|
288
268
|
- spec/saving_events_spec.rb
|
289
|
-
- spec/saving_snapshot_spec.rb
|
290
|
-
- spec/snapshot_access_spec.rb
|
291
269
|
- spec/spec_helper.rb
|
292
270
|
- spec/storage_spec.rb
|
293
|
-
has_rdoc:
|
@@ -1,105 +0,0 @@
|
|
1
|
-
require "sandthorn_driver_sequel/access"
|
2
|
-
|
3
|
-
module SandthornDriverSequel
|
4
|
-
class SnapshotAccess < Access::Base
|
5
|
-
|
6
|
-
def initialize storage, serializer, deserializer
|
7
|
-
@serializer = serializer
|
8
|
-
@deserializer = deserializer
|
9
|
-
super storage
|
10
|
-
end
|
11
|
-
|
12
|
-
def find_by_aggregate_id(aggregate_id)
|
13
|
-
|
14
|
-
aggregate_from_table = aggregates.find_by_aggregate_id(aggregate_id)
|
15
|
-
return nil if aggregate_from_table.nil?
|
16
|
-
snapshot = storage.snapshots.first(aggregate_table_id: aggregate_from_table.id)
|
17
|
-
if snapshot
|
18
|
-
aggregate = deserialize(snapshot[:snapshot_data])
|
19
|
-
|
20
|
-
snapshot_data = {
|
21
|
-
aggregate: aggregate,
|
22
|
-
snapshot_id: snapshot.id,
|
23
|
-
aggregate_table_id: snapshot[:aggregate_table_id]
|
24
|
-
}
|
25
|
-
return SnapshotWrapper.new(snapshot_data)
|
26
|
-
end
|
27
|
-
|
28
|
-
return nil
|
29
|
-
end
|
30
|
-
|
31
|
-
def find(snapshot_id)
|
32
|
-
|
33
|
-
snapshot = storage.snapshots[snapshot_id]
|
34
|
-
aggregate = deserialize(snapshot[:snapshot_data])
|
35
|
-
|
36
|
-
snapshot_data = {
|
37
|
-
aggregate: aggregate,
|
38
|
-
snapshot_id: snapshot_id,
|
39
|
-
aggregate_table_id: snapshot[:aggregate_table_id]
|
40
|
-
}
|
41
|
-
|
42
|
-
SnapshotWrapper.new(snapshot_data)
|
43
|
-
end
|
44
|
-
|
45
|
-
def record_snapshot(aggregate)
|
46
|
-
aggregate_from_table = aggregates.find_by_aggregate_id!(aggregate.aggregate_id)
|
47
|
-
perform_snapshot(aggregate, aggregate_from_table.id)
|
48
|
-
end
|
49
|
-
|
50
|
-
def obsolete(aggregate_types: [], max_event_distance: 100)
|
51
|
-
aggregate_types.map!(&:to_s)
|
52
|
-
snapshot_version = Sequel.qualify(storage.snapshots_table_name, :aggregate_version)
|
53
|
-
aggregate_version = Sequel.qualify(storage.aggregates_table_name, :aggregate_version)
|
54
|
-
query = storage.aggregates.left_outer_join(storage.snapshots, aggregate_table_id: :id)
|
55
|
-
query = query.select { (aggregate_version - snapshot_version).as(distance) }
|
56
|
-
query = query.select_append(:aggregate_id, :aggregate_type)
|
57
|
-
query = query.where { (aggregate_version - coalesce(snapshot_version, 0)) > max_event_distance }
|
58
|
-
if aggregate_types.any?
|
59
|
-
query = query.where(aggregate_type: aggregate_types)
|
60
|
-
end
|
61
|
-
query.all
|
62
|
-
end
|
63
|
-
|
64
|
-
private
|
65
|
-
|
66
|
-
def aggregates
|
67
|
-
@aggregates ||= AggregateAccess.new(storage)
|
68
|
-
end
|
69
|
-
|
70
|
-
def perform_snapshot(aggregate, aggregate_table_id)
|
71
|
-
current_snapshot = storage.snapshots.first(aggregate_table_id: aggregate_table_id)
|
72
|
-
snapshot = build_snapshot(aggregate)
|
73
|
-
if current_snapshot
|
74
|
-
update_snapshot(snapshot, current_snapshot.id)
|
75
|
-
else
|
76
|
-
insert_snapshot(snapshot, aggregate_table_id)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def build_snapshot(aggregate)
|
81
|
-
{
|
82
|
-
snapshot_data: serialize(aggregate),
|
83
|
-
aggregate_version: aggregate.aggregate_version
|
84
|
-
}
|
85
|
-
end
|
86
|
-
|
87
|
-
def insert_snapshot(snapshot, id)
|
88
|
-
snapshot[:aggregate_table_id] = id
|
89
|
-
storage.snapshots.insert(snapshot)
|
90
|
-
end
|
91
|
-
|
92
|
-
def update_snapshot(snapshot, id)
|
93
|
-
storage.snapshots.where(id: id).update(snapshot)
|
94
|
-
end
|
95
|
-
|
96
|
-
def serialize aggregate
|
97
|
-
@serializer.call(aggregate)
|
98
|
-
end
|
99
|
-
|
100
|
-
def deserialize snapshot_data
|
101
|
-
@deserializer.call(snapshot_data)
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
end
|