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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -4
  3. data/lib/sandthorn_driver_sequel/access/aggregate_access.rb +0 -4
  4. data/lib/sandthorn_driver_sequel/access/event_access.rb +11 -15
  5. data/lib/sandthorn_driver_sequel/errors.rb +0 -14
  6. data/lib/sandthorn_driver_sequel/event_query.rb +3 -2
  7. data/lib/sandthorn_driver_sequel/event_store.rb +10 -98
  8. data/lib/sandthorn_driver_sequel/event_store_context.rb +3 -3
  9. data/lib/sandthorn_driver_sequel/migration.rb +20 -3
  10. data/lib/sandthorn_driver_sequel/storage.rb +0 -9
  11. data/lib/sandthorn_driver_sequel/version.rb +1 -1
  12. data/lib/sandthorn_driver_sequel/wrappers/event_wrapper.rb +1 -1
  13. data/lib/sandthorn_driver_sequel/wrappers.rb +0 -1
  14. data/lib/sandthorn_driver_sequel.rb +0 -26
  15. data/sandthorn_driver_sequel.gemspec +2 -3
  16. data/spec/aggregate_access_spec.rb +0 -10
  17. data/spec/benchmark_spec.rb +6 -35
  18. data/spec/configuration_spec.rb +0 -29
  19. data/spec/driver_interface_spec.rb +0 -7
  20. data/spec/event_access_spec.rb +4 -22
  21. data/spec/event_store_spec.rb +43 -73
  22. data/spec/event_store_with_context_spec.rb +5 -5
  23. data/spec/get_events_spec.rb +12 -47
  24. data/spec/migration_specifying_domain_spec.rb +6 -6
  25. data/spec/saving_events_spec.rb +22 -28
  26. data/spec/storage_spec.rb +1 -0
  27. metadata +8 -31
  28. data/lib/sandthorn_driver_sequel/access/snapshot_access.rb +0 -105
  29. data/lib/sandthorn_driver_sequel/wrappers/snapshot_wrapper.rb +0 -19
  30. data/spec/asking_for_aggregates_to_snapshot_spec.rb +0 -66
  31. data/spec/saving_snapshot_spec.rb +0 -69
  32. data/spec/snapshot_access_spec.rb +0 -110
@@ -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
- event_args: "new_data"
29
+ event_data: "new_data",
30
+ event_metadata: nil
33
31
  },{
34
32
  aggregate_version: 2,
35
33
  event_name: "foo",
36
- event_args: "foo_data"
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
@@ -1,76 +1,46 @@
1
- require 'spec_helper'
2
- module SandthornDriverSequel
3
- describe EventStore do
1
+ # require 'spec_helper'
2
+ # module SandthornDriverSequel
3
+ # describe EventStore do
4
4
 
5
- before(:each) { prepare_for_test context: nil; }
6
- let(:event_store) { SandthornDriverSequel.driver_from_url url: event_store_url }
5
+ # before(:each) { prepare_for_test context: nil; }
6
+ # let(:event_store) { SandthornDriverSequel.driver_from_url url: event_store_url }
7
7
 
8
- describe("when getting the same data from find and get_aggregate_events_from_snapshot") do
9
- let(:test_events) do
10
- e = []
11
- e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>aggregate_id}]}}
12
- e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
13
- e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
14
- end
15
- let(:aggregate_id) {"c0456e26-e29a-4f67-92fa-130b3a31a39b"}
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
- before do
20
- event_store.save_events test_events, aggregate_id, String
21
- end
22
-
23
- context "find" do
24
-
25
- let(:find_events) do
26
- event_store.find aggregate_id
27
- end
28
-
29
- let(:get_aggregate_events_from_snapshot_events) do
30
- event_store.get_aggregate_events_from_snapshot aggregate_id
31
- end
32
-
33
- it "should get same events" do
34
- find_events.each_with_index do |event, index|
35
- expect(find_events[index]).to eql get_aggregate_events_from_snapshot_events[index]
36
- end
37
- end
38
- end
39
-
40
- context "all" do
41
-
42
- let(:test_events_2) do
43
- e = []
44
- e << {aggregate_version: 1, event_name: "new", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>aggregate_id_2}]}}
45
- e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
46
- e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
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", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
12
- e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
13
- e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
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.get_aggregate_events aggregate_id
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.get_aggregate_events aggregate_id
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
@@ -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", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
9
- e << {aggregate_version: 2, event_name: "foo", event_args: "A2"}
10
- e << {aggregate_version: 3, event_name: "bard", event_args: "A3"}
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", event_args: "B1" }
16
- e << {aggregate_version: 2, event_name: "foo", event_args: "B2"}
17
- e << {aggregate_version: 3, event_name: "bar", event_args: "B3"}
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", event_args: "C1" }
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", event_args: "C2" }
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
- end
86
- end
87
- context "when using :get_new_events_after_event_id_matching_classname to get events" do
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
- snapshots = :snapshots
8
+
9
9
  if context
10
10
  events = "#{context}_#{events}".to_sym
11
11
  aggregates = "#{context}_#{aggregates}".to_sym
12
- snapshots = "#{context}_#{snapshots}".to_sym
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
- expect(db.table_exists? snapshots).to be_truthy, "expected table :#{snapshots} to exist, but it didn't"
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, aggregates and snapshots" do
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, aggregates and snapshots" do
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, aggregates and snapshots" do
38
+ it "should create the tables events and aggregates" do
39
39
  check_tables context
40
40
  end
41
41
  end
@@ -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", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
10
- e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
11
- e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
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.get_aggregate_events aggregate_id
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.get_aggregate aggregate_id, String
24
+ events = event_store.find aggregate_id, String
25
25
  event = events.first
26
- expect(event[:event_args]).to eql(test_events.first[:event_args])
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", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
39
- e << {aggregate_version: 2, event_name: "foo", event_args: "noop"}
40
- e << {aggregate_version: 3, event_name: "flubber", event_args: "noop"}
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", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
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 "both types should exist in get_all_typenames in alphabetical order" do
57
- names = event_store.get_all_types
58
- expect(names.length).to eql 2
59
- expect(names.first).to eql "Hash"
60
- expect(names.last).to eql "String"
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", event_args: {:method_name=>"new", :method_args=>[], :attribute_deltas=>[{:attribute_name=>"aggregate_id", :old_value=>nil, :new_value=>"0a74e545-be84-4506-8b0a-73e947856327"}]}}
75
- e << {aggregate_version: nil, event_name: "foo", event_args: "noop"}
76
- e << {aggregate_version: nil, event_name: "flubber", event_args: "noop"}
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.get_aggregate_events aggregate_id
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.get_aggregate aggregate_id, String
83
+ events = event_store.find aggregate_id, String
90
84
  event = events.first
91
85
 
92
- expect(event[:event_args]).to eql(test_events.first[:event_args])
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
@@ -56,6 +56,7 @@ module SandthornDriverSequel
56
56
  aggregate_version: 1,
57
57
  event_name: "foo",
58
58
  event_data: "bar",
59
+ event_metadata: nil,
59
60
  timestamp: Time.now.utc
60
61
  }
61
62
  event_id = storage.events.insert(data)
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: 3.2.1
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: 2016-05-04 00:00:00.000000000 Z
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: '1.3'
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: '1.3'
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: guard-rspec
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: :development
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