nexia_event_store 0.7.4 → 0.7.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/event_store/aggregate.rb +6 -4
- data/lib/event_store/client.rb +2 -2
- data/lib/event_store/event_stream.rb +12 -1
- data/lib/event_store/snapshot.rb +2 -1
- data/lib/event_store/version.rb +1 -1
- data/spec/unit/snapshot_unit_spec.rb +27 -5
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47f3dda99420a603ac4a0289321ac8b7697068c5
|
4
|
+
data.tar.gz: ea93e049eaa9bf2bad597e0ba032bcbd5a51f077
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a453586af4426200b85a14b9b35c9f4d612b99d8db0cecc0203438591e02b9a22824b3b2d812c78b6f5a8c99b6e540e5c40df1a0d9cde357cbb3ee7e8d55511
|
7
|
+
data.tar.gz: f049dd32391ab38e6b45a055298214b60d03b4e197c653b999b7b343867fdf61f82f50e01580ce2403c90fef286932b1866a03f2857a57a122c73317adb6ab70
|
@@ -4,7 +4,7 @@ module EventStore
|
|
4
4
|
class Aggregate
|
5
5
|
extend Forwardable
|
6
6
|
|
7
|
-
attr_reader :id, :type, :event_table, :snapshot, :event_stream
|
7
|
+
attr_reader :id, :type, :event_table, :snapshot, :event_stream, :checkpoint_event
|
8
8
|
|
9
9
|
def_delegators :snapshot,
|
10
10
|
:last_event,
|
@@ -16,6 +16,7 @@ module EventStore
|
|
16
16
|
|
17
17
|
def_delegators :event_stream,
|
18
18
|
:events,
|
19
|
+
:snapshot_events,
|
19
20
|
:events_from,
|
20
21
|
:event_stream_between,
|
21
22
|
:event_table,
|
@@ -34,12 +35,13 @@ module EventStore
|
|
34
35
|
EventStore.db.from( EventStore.fully_qualified_table).distinct(:aggregate_id).select(:aggregate_id).order(:aggregate_id).limit(limit, offset).all.map{|item| item[:aggregate_id]}
|
35
36
|
end
|
36
37
|
|
37
|
-
def initialize(id, type = EventStore.table_name)
|
38
|
+
def initialize(id, type = EventStore.table_name, checkpoint_event = nil)
|
38
39
|
@id = id
|
39
40
|
@type = type
|
40
41
|
|
41
|
-
@
|
42
|
-
@
|
42
|
+
@checkpoint_event = checkpoint_event
|
43
|
+
@snapshot = Snapshot.new(self)
|
44
|
+
@event_stream = EventStream.new(self)
|
43
45
|
end
|
44
46
|
|
45
47
|
def append(events, logger)
|
data/lib/event_store/client.rb
CHANGED
@@ -22,8 +22,8 @@ module EventStore
|
|
22
22
|
Aggregate.ids(offset, limit)
|
23
23
|
end
|
24
24
|
|
25
|
-
def initialize(aggregate_id, aggregate_type = EventStore.table_name)
|
26
|
-
@aggregate = Aggregate.new(aggregate_id, aggregate_type)
|
25
|
+
def initialize(aggregate_id, aggregate_type = EventStore.table_name, checkpoint_event = nil)
|
26
|
+
@aggregate = Aggregate.new(aggregate_id, aggregate_type, checkpoint_event)
|
27
27
|
end
|
28
28
|
|
29
29
|
def exists?
|
@@ -2,11 +2,12 @@ module EventStore
|
|
2
2
|
class EventStream
|
3
3
|
include Enumerable
|
4
4
|
|
5
|
-
attr_reader :event_table
|
5
|
+
attr_reader :event_table, :checkpoint_event
|
6
6
|
|
7
7
|
def initialize aggregate
|
8
8
|
@aggregate = aggregate
|
9
9
|
@id = @aggregate.id
|
10
|
+
@checkpoint_event = aggregate.checkpoint_event
|
10
11
|
@event_table_alias = "events"
|
11
12
|
@event_table = "#{EventStore.schema}__#{EventStore.table_name}".to_sym
|
12
13
|
@aliased_event_table = "#{event_table}___#{@event_table_alias}".to_sym
|
@@ -51,6 +52,16 @@ module EventStore
|
|
51
52
|
.select_all(:events).select_append(:fully_qualified_name)
|
52
53
|
end
|
53
54
|
|
55
|
+
def snapshot_events
|
56
|
+
last_checkpoint = last_event_before(Time.now.utc, [checkpoint_event]).first if checkpoint_event
|
57
|
+
|
58
|
+
if last_checkpoint
|
59
|
+
events.where{ events__id >= last_checkpoint[:id].to_i }
|
60
|
+
else
|
61
|
+
events
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
54
65
|
def events_from(event_id, max = nil)
|
55
66
|
# note: this depends on the events table being aliased to "events" above.
|
56
67
|
events.limit(max).where{events__id >= event_id.to_i }.all.map do |event|
|
data/lib/event_store/snapshot.rb
CHANGED
@@ -58,7 +58,8 @@ module EventStore
|
|
58
58
|
delete_snapshot!
|
59
59
|
logger.debug { "Deleting snapshot took #{Time.now - t} seconds" }
|
60
60
|
t = Time.now
|
61
|
-
all_events = @aggregate.
|
61
|
+
all_events = @aggregate.snapshot_events.all
|
62
|
+
logger.debug { "getting #{all_events.count} events" }
|
62
63
|
logger.debug { "getting all events took #{Time.now - t} seconds" }
|
63
64
|
t = Time.now
|
64
65
|
corrected_events = all_events.map{|e| e[:occurred_at] = TimeHacker.translate_occurred_at_from_local_to_gmt(e[:occurred_at]); e}
|
data/lib/event_store/version.rb
CHANGED
@@ -3,11 +3,20 @@ require "mock_redis"
|
|
3
3
|
|
4
4
|
module EventStore
|
5
5
|
describe Snapshot do
|
6
|
-
let(:redis)
|
7
|
-
let(:aggregate_type)
|
8
|
-
let(:aggregate_id)
|
9
|
-
let(:events)
|
10
|
-
let(:
|
6
|
+
let(:redis) { EventStore.redis }
|
7
|
+
let(:aggregate_type) { "awesome" }
|
8
|
+
let(:aggregate_id) { "superman" }
|
9
|
+
let(:events) { [] }
|
10
|
+
let(:snapshot_events) { events }
|
11
|
+
let(:checkpoint_event) { nil }
|
12
|
+
let(:aggregate) {
|
13
|
+
double("Aggregate",
|
14
|
+
type: aggregate_type,
|
15
|
+
id: aggregate_id,
|
16
|
+
events: double(all: events),
|
17
|
+
checkpoint_event: checkpoint_event,
|
18
|
+
snapshot_events: double(all: snapshot_events))
|
19
|
+
}
|
11
20
|
|
12
21
|
subject(:snapshot) { EventStore::Snapshot.new(aggregate) }
|
13
22
|
|
@@ -72,6 +81,19 @@ module EventStore
|
|
72
81
|
names = snapshot.map(&:fully_qualified_name)
|
73
82
|
expect(names).to eq(events.map { |e| e[:fully_qualified_name] })
|
74
83
|
end
|
84
|
+
|
85
|
+
context "with a checkpoint event" do
|
86
|
+
let(:snapshot_events){ [ last_event ] }
|
87
|
+
let(:checkpoint_event) { "the_big_event" }
|
88
|
+
|
89
|
+
it "stores a a new snapshot from the aggregate's events" do
|
90
|
+
snapshot.rebuild_snapshot!
|
91
|
+
expect(snapshot.count).to eq(1)
|
92
|
+
# TODO: remove #snapshot in favor of Enumerable
|
93
|
+
names = snapshot.map(&:fully_qualified_name)
|
94
|
+
expect(names).to eq(snapshot_events.map { |e| e[:fully_qualified_name] })
|
95
|
+
end
|
96
|
+
end
|
75
97
|
end
|
76
98
|
|
77
99
|
# TODO: remove this in favor of #each and include Enumerable
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexia_event_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Saieg, John Colvin
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-07-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -233,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
233
|
version: '0'
|
234
234
|
requirements: []
|
235
235
|
rubyforge_project:
|
236
|
-
rubygems_version: 2.4.
|
236
|
+
rubygems_version: 2.4.2
|
237
237
|
signing_key:
|
238
238
|
specification_version: 4
|
239
239
|
summary: Ruby implementation of an EventSource (A+ES) for the Nexia Ecosystem
|