sandthorn_driver_sequel 1.0.4 → 1.0.5
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/Rakefile +1 -1
- data/lib/sandthorn_driver_sequel/event_store.rb +20 -5
- data/lib/sandthorn_driver_sequel/migration.rb +2 -2
- data/lib/sandthorn_driver_sequel/sequel_driver.rb +21 -1
- data/lib/sandthorn_driver_sequel/version.rb +1 -1
- data/sandthorn_driver_sequel.gemspec +1 -0
- data/spec/benchmark_spec.rb +125 -0
- data/spec/saving_snapshot_spec.rb +2 -1
- data/spec/spec_helper.rb +1 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32fcaa013235d94d983f889c5f3ccc7784bc8e13
|
4
|
+
data.tar.gz: aaf942165819a2b0d5257f3e2aa4288064e5fa6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2348c4fc6cd403f535c13b22b158431d39c8f297a2f9c32108188941de496fd250b8983b11c6e8519499c48e6630ebe68929d27895e4b09a56c2d487b0f41158
|
7
|
+
data.tar.gz: 8d83bbc8aef2d009ecbfc8e49d8da795f969d131cb2778318b96fb629c53d1d197a95bdc3522015316942b015d2e0f98f474843cd8d8f51a6c68153f052d1c46
|
data/Rakefile
CHANGED
@@ -32,8 +32,7 @@ module SandthornDriverSequel
|
|
32
32
|
error_message = "#{aggregate_type} with id #{aggregate_id}: expected event with version #{current_aggregate_version}, but got #{event[:aggregate_version]}"
|
33
33
|
raise SandthornDriverSequel::Errors::ConcurrencyError.new(error_message)
|
34
34
|
end
|
35
|
-
|
36
|
-
to_insert = {aggregate_table_id: pk_id, aggregate_version: event[:aggregate_version], event_name: event[:event_name], event_data: blob, timestamp: timestamp}
|
35
|
+
to_insert = ({aggregate_table_id: pk_id, aggregate_version: event[:aggregate_version], event_name: event[:event_name], event_data: event[:event_data], timestamp: timestamp})
|
37
36
|
db[events_table_name].insert(to_insert)
|
38
37
|
end
|
39
38
|
db[aggregates_table_name].where(id: pk_id).update(aggregate_version: current_aggregate_version)
|
@@ -56,8 +55,7 @@ module SandthornDriverSequel
|
|
56
55
|
raise SandthornDriverSequel::Errors::WrongAggregateVersionError.new error_message
|
57
56
|
end
|
58
57
|
if current_snapshot.nil?
|
59
|
-
|
60
|
-
to_insert = {aggregate_version: aggregate_version, snapshot_data: blob, aggregate_table_id: pk_id}
|
58
|
+
to_insert = {aggregate_version: aggregate_version, snapshot_data: aggregate_snapshot[:event_data], aggregate_table_id: pk_id }
|
61
59
|
db[snapshots_table_name].insert(to_insert)
|
62
60
|
else
|
63
61
|
to_update = {aggregate_version: aggregate_version, snapshot_data: aggregate_snapshot[:event_data] }
|
@@ -162,14 +160,31 @@ module SandthornDriverSequel
|
|
162
160
|
end
|
163
161
|
end
|
164
162
|
private
|
163
|
+
|
165
164
|
def aggregate_events after_aggregate_version: 0, aggregate_id: nil
|
165
|
+
|
166
166
|
rel = "#{events_table_name}__aggregate_version".to_sym
|
167
167
|
where_proc = eval("lambda{ #{rel} > after_aggregate_version }")
|
168
168
|
driver.execute do |db|
|
169
169
|
query = db[events_table_name].join(aggregates_table_name, id: :aggregate_table_id, aggregate_id: aggregate_id)
|
170
170
|
query = query.where &where_proc
|
171
|
-
|
171
|
+
result = query.select(rel, :aggregate_id, :sequence_number, :event_name, :event_data, :timestamp).order(:sequence_number).all
|
172
172
|
end
|
173
|
+
|
174
|
+
# result = nil
|
175
|
+
# Benchmark.bm do |x|
|
176
|
+
# x.report("find") {
|
177
|
+
# rel = "#{events_table_name}__aggregate_version".to_sym
|
178
|
+
# where_proc = eval("lambda{ #{rel} > after_aggregate_version }")
|
179
|
+
# driver.execute do |db|
|
180
|
+
# query = db[events_table_name].join(aggregates_table_name, id: :aggregate_table_id, aggregate_id: aggregate_id)
|
181
|
+
# query = query.where &where_proc
|
182
|
+
# result = query.select(rel, :aggregate_id, :sequence_number, :event_name, :event_data, :timestamp).order(:sequence_number).all
|
183
|
+
# end
|
184
|
+
# }
|
185
|
+
|
186
|
+
# end
|
187
|
+
# result
|
173
188
|
end
|
174
189
|
def get_current_aggregate_from_aggregates_table aggregate_id, aggregate_type, db
|
175
190
|
aggregate_type = aggregate_type.to_s
|
@@ -48,7 +48,7 @@ module SandthornDriverSequel
|
|
48
48
|
foreign_key :aggregate_table_id, aggr_table, on_update: :cascade
|
49
49
|
Integer :aggregate_version, null: false
|
50
50
|
String :event_name, size: 255, null: false
|
51
|
-
|
51
|
+
String :event_data, text: true, null: true
|
52
52
|
DateTime :timestamp, null: false
|
53
53
|
|
54
54
|
index [:event_name]
|
@@ -76,7 +76,7 @@ module SandthornDriverSequel
|
|
76
76
|
db.create_table(snapshots_table_name) do
|
77
77
|
primary_key :id
|
78
78
|
Integer :aggregate_version, null: false
|
79
|
-
|
79
|
+
String :snapshot_data, text: true, null: false
|
80
80
|
foreign_key :aggregate_table_id, aggr_table, on_delete: :cascade, on_update: :cascade
|
81
81
|
index [:aggregate_table_id], unique: true
|
82
82
|
end
|
@@ -5,7 +5,7 @@ module SandthornDriverSequel
|
|
5
5
|
def initialize args = {}
|
6
6
|
@url = args.fetch(:url)
|
7
7
|
Sequel.default_timezone = :utc
|
8
|
-
@db = Sequel.connect(@url
|
8
|
+
@db = Sequel.connect(@url)
|
9
9
|
end
|
10
10
|
def execute &block
|
11
11
|
return block.call @db
|
@@ -18,3 +18,23 @@ module SandthornDriverSequel
|
|
18
18
|
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
|
23
|
+
# module SandthornDriverSequel
|
24
|
+
# class SequelDriver
|
25
|
+
# def initialize args = {}
|
26
|
+
# @url = args.fetch(:url)
|
27
|
+
# Sequel.default_timezone = :utc
|
28
|
+
# end
|
29
|
+
# def execute &block
|
30
|
+
# Sequel.connect(@url) { |db| return block.call db}
|
31
|
+
# end
|
32
|
+
# def execute_in_transaction &block
|
33
|
+
# Sequel.connect(@url) do |db|
|
34
|
+
# db.transaction do
|
35
|
+
# return block.call db
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
# end
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "uuidtools"
|
32
32
|
spec.add_development_dependency "ruby-beautify"
|
33
33
|
spec.add_development_dependency "msgpack"
|
34
|
+
spec.add_development_dependency "snappy"
|
34
35
|
|
35
36
|
spec.add_runtime_dependency "sequel"
|
36
37
|
spec.add_runtime_dependency "pg"
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'benchmark'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Sandthorn
|
6
|
+
module AggregateRoot
|
7
|
+
|
8
|
+
describe "benchmark" do
|
9
|
+
|
10
|
+
before(:each) { prepare_for_test }
|
11
|
+
let(:test_events_20_events) do
|
12
|
+
e = []
|
13
|
+
e << {aggregate_version: 1, event_name: "new", event_data: "---\n:method_name: new\n:method_args: []\n:attribute_deltas:\n- :attribute_name: :@aggregate_id\n :old_value: \n :new_value: 0a74e545-be84-4506-8b0a-73e947856327\n"}
|
14
|
+
19.times do |i|
|
15
|
+
e << {aggregate_version: i+2, event_name: "foo", event_data: "A2"}
|
16
|
+
end
|
17
|
+
e
|
18
|
+
end
|
19
|
+
let(:test_events_one_event) do
|
20
|
+
e = []
|
21
|
+
e << {aggregate_version: 1, event_name: "new", event_data: "B1" }
|
22
|
+
end
|
23
|
+
let(:test_events_two_events) do
|
24
|
+
e = []
|
25
|
+
e << {aggregate_version: 1, event_name: "new", event_data: "---\n:method_name: new\n:method_args: []\n:attribute_deltas:\n- :attribute_name: :@aggregate_id\n :old_value: \n :new_value: 0a74e545-be84-4506-8b0a-73e947856327\n"}
|
26
|
+
e << {aggregate_version: 2, event_name: "foo", event_data: "A2"}
|
27
|
+
end
|
28
|
+
let(:aggregate_id) {"c0456e26-2345-4f67-92fa-130b3a31a39a"}
|
29
|
+
let(:es) { event_store }
|
30
|
+
|
31
|
+
|
32
|
+
n = 500
|
33
|
+
describe "save" do
|
34
|
+
it "one event save 500 times" do
|
35
|
+
Benchmark.bm do |x|
|
36
|
+
x.report("new change save find") { for i in 1..n; es.save_events(test_events_one_event, 0, i.to_s, SandthornDriverSequel::EventStore); end }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
it "two events save 500 times" do
|
40
|
+
Benchmark.bm do |x|
|
41
|
+
x.report("new change save find") { for i in 1..n; es.save_events(test_events_two_events, 0, i.to_s, SandthornDriverSequel::EventStore); end }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
it "twenty events save 500 times" do
|
45
|
+
Benchmark.bm do |x|
|
46
|
+
x.report("new change save find") { for i in 1..n; es.save_events(test_events_20_events, 0, i.to_s, SandthornDriverSequel::EventStore); end }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "find" do
|
52
|
+
it "should find one event 500 times" do
|
53
|
+
es.save_events(test_events_one_event, 0, aggregate_id, SandthornDriverSequel::EventStore)
|
54
|
+
|
55
|
+
Benchmark.bm do |x|
|
56
|
+
x.report("find") { for i in 1..n; es.get_aggregate(aggregate_id, SandthornDriverSequel::EventStore); end }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
it "should find two events 500 times" do
|
60
|
+
es.save_events(test_events_two_events, 0, aggregate_id, SandthornDriverSequel::EventStore)
|
61
|
+
|
62
|
+
Benchmark.bm do |x|
|
63
|
+
x.report("find") { for i in 1..n; es.get_aggregate(aggregate_id, SandthornDriverSequel::EventStore); end }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
it "should find twenty events 500 times" do
|
67
|
+
es.save_events(test_events_20_events, 0, aggregate_id, SandthornDriverSequel::EventStore)
|
68
|
+
|
69
|
+
Benchmark.bm do |x|
|
70
|
+
x.report("find") { for i in 1..n; es.get_aggregate(aggregate_id, SandthornDriverSequel::EventStore); end }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
describe "find with snapshot" do
|
76
|
+
|
77
|
+
it "should find one event that is snapshoted 500 times" do
|
78
|
+
snapshot_data = { event_data: YAML.dump(Object.new), aggregate_version: 1 }
|
79
|
+
es.save_events(test_events_one_event, 0, aggregate_id, SandthornDriverSequel::EventStore)
|
80
|
+
es.save_snapshot(snapshot_data, aggregate_id, SandthornDriverSequel::EventStore)
|
81
|
+
|
82
|
+
Benchmark.bm do |x|
|
83
|
+
x.report("find") { for i in 1..n; es.get_aggregate(aggregate_id, SandthornDriverSequel::EventStore); end }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
it "should find two events that is snapshoted 500 times" do
|
87
|
+
snapshot_data = { event_data: YAML.dump(Object.new), aggregate_version: 2 }
|
88
|
+
es.save_events(test_events_two_events, 0, aggregate_id, SandthornDriverSequel::EventStore)
|
89
|
+
es.save_snapshot(snapshot_data, aggregate_id, SandthornDriverSequel::EventStore)
|
90
|
+
Benchmark.bm do |x|
|
91
|
+
x.report("find") { for i in 1..n; es.get_aggregate(aggregate_id, SandthornDriverSequel::EventStore); end }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
it "should find twenty events that is snapshoted 500 times" do
|
95
|
+
snapshot_data = { event_data: YAML.dump(Object.new), aggregate_version: 19 }
|
96
|
+
es.save_events(test_events_20_events, 0, aggregate_id, SandthornDriverSequel::EventStore)
|
97
|
+
es.save_snapshot(snapshot_data, aggregate_id, SandthornDriverSequel::EventStore)
|
98
|
+
|
99
|
+
Benchmark.bm do |x|
|
100
|
+
x.report("find") { for i in 1..n; es.get_aggregate(aggregate_id, SandthornDriverSequel::EventStore); end }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
# it "new save and find 500 aggregates" do
|
106
|
+
|
107
|
+
# Benchmark.bm do |x|
|
108
|
+
# x.report("new change save find") { for i in 1..n; es.save_events(test_events_a, 0, i.to_s, SandthornDriverSequel::EventStore); es.get_aggregate(i.to_s, SandthornDriverSequel::EventStore); end }
|
109
|
+
# end
|
110
|
+
|
111
|
+
# end
|
112
|
+
|
113
|
+
# it "should commit 500 actions" do
|
114
|
+
# Benchmark.bm do |x|
|
115
|
+
# x.report("commit") { for i in 1..n; test_object.change_name "#{i}"; end }
|
116
|
+
# end
|
117
|
+
# end
|
118
|
+
# it "should commit and save 500 actions" do
|
119
|
+
# Benchmark.bm do |x|
|
120
|
+
# x.report("commit save") { for i in 1..n; test_object.change_name("#{i}").save; end }
|
121
|
+
# end
|
122
|
+
# end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'yaml'
|
2
3
|
|
3
4
|
module SandthornDriverSequel
|
4
5
|
describe EventStore do
|
@@ -6,7 +7,7 @@ module SandthornDriverSequel
|
|
6
7
|
let(:aggregate_id) { @id ||= UUIDTools::UUID.random_create.to_s }
|
7
8
|
let(:test_events) { [{aggregate_version: 1, event_data: nil, event_name: "new"},{aggregate_version: 2, event_data: nil, event_name: "foo"}] }
|
8
9
|
let(:additional_events) { [{aggregate_version: 3, event_data: nil, event_name: "klopp"},{aggregate_version: 4, event_data: nil, event_name: "flipp"}] }
|
9
|
-
let(:snapshot_data) { { event_data:
|
10
|
+
let(:snapshot_data) { { event_data: YAML.dump(Object.new), aggregate_version: 2 } }
|
10
11
|
let(:save_snapshot) {event_store.save_snapshot snapshot_data, aggregate_id, SandthornDriverSequel::EventStore}
|
11
12
|
let(:save_events) {event_store.save_events test_events, 0, aggregate_id, SandthornDriverSequel::EventStore}
|
12
13
|
let(:save_additional_events) {event_store.save_events additional_events, 2, aggregate_id, SandthornDriverSequel::EventStore}
|
data/spec/spec_helper.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: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Krantz
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-03-
|
12
|
+
date: 2014-03-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -179,6 +179,20 @@ dependencies:
|
|
179
179
|
- - ">="
|
180
180
|
- !ruby/object:Gem::Version
|
181
181
|
version: '0'
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
name: snappy
|
184
|
+
requirement: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
|
+
type: :development
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - ">="
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '0'
|
182
196
|
- !ruby/object:Gem::Dependency
|
183
197
|
name: sequel
|
184
198
|
requirement: !ruby/object:Gem::Requirement
|
@@ -232,6 +246,7 @@ files:
|
|
232
246
|
- lib/sandthorn_driver_sequel/version.rb
|
233
247
|
- sandthorn_driver_sequel.gemspec
|
234
248
|
- spec/asking_for_aggregates_to_snapshot_spec.rb
|
249
|
+
- spec/benchmark_spec.rb
|
235
250
|
- spec/driver_interface_spec.rb
|
236
251
|
- spec/event_store_with_context_spec.rb
|
237
252
|
- spec/get_events_spec.rb
|
@@ -265,6 +280,7 @@ specification_version: 4
|
|
265
280
|
summary: sequel driver for sandthorn
|
266
281
|
test_files:
|
267
282
|
- spec/asking_for_aggregates_to_snapshot_spec.rb
|
283
|
+
- spec/benchmark_spec.rb
|
268
284
|
- spec/driver_interface_spec.rb
|
269
285
|
- spec/event_store_with_context_spec.rb
|
270
286
|
- spec/get_events_spec.rb
|