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.
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