sandthorn_driver_sequel 3.2.1 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|