rails_event_store_active_record 1.3.1 → 2.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.
- checksums.yaml +4 -4
- data/.mutant.yml +1 -0
- data/Gemfile +5 -10
- data/Gemfile.lock +245 -0
- data/Gemfile.rails_5_0 +13 -0
- data/Gemfile.rails_5_0.lock +217 -0
- data/Gemfile.rails_5_1 +13 -0
- data/Gemfile.rails_5_1.lock +217 -0
- data/Gemfile.rails_5_2 +13 -0
- data/Gemfile.rails_5_2.lock +225 -0
- data/Gemfile.rails_6_0 +13 -0
- data/Gemfile.rails_6_0.lock +241 -0
- data/Makefile +8 -15
- data/lib/rails_event_store_active_record/event.rb +1 -1
- data/lib/rails_event_store_active_record/event_repository.rb +45 -43
- data/lib/rails_event_store_active_record/event_repository_reader.rb +101 -37
- data/lib/rails_event_store_active_record/generators/{limit_for_event_id_generator.rb → add_valid_at_generator.rb} +2 -2
- data/lib/rails_event_store_active_record/generators/{index_by_event_type_generator.rb → created_at_precision_generator.rb} +2 -2
- data/lib/rails_event_store_active_record/generators/{binary_data_and_metadata_generator.rb → no_global_stream_entries_generator.rb} +2 -4
- data/lib/rails_event_store_active_record/generators/templates/add_valid_at_template.rb +14 -0
- data/lib/rails_event_store_active_record/generators/templates/create_event_store_events_template.rb +15 -9
- data/lib/rails_event_store_active_record/generators/templates/created_at_precision_template.rb +45 -0
- data/lib/rails_event_store_active_record/generators/templates/no_global_stream_entries_template.rb +59 -0
- data/lib/rails_event_store_active_record/index_violation_detector.rb +33 -18
- data/lib/rails_event_store_active_record/version.rb +1 -1
- data/lib/rails_event_store_active_record/with_abstract_base_class.rb +39 -0
- data/lib/rails_event_store_active_record/with_default_models.rb +9 -0
- data/lib/rails_event_store_active_record.rb +5 -3
- data/rails_event_store_active_record.gemspec +1 -3
- metadata +23 -13
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/lib/rails_event_store_active_record/generators/templates/binary_data_and_metadata_template.rb +0 -35
- data/lib/rails_event_store_active_record/generators/templates/index_by_event_type_template.rb +0 -7
- data/lib/rails_event_store_active_record/generators/templates/limit_for_event_id_template.rb +0 -8
data/Makefile
CHANGED
@@ -1,9 +1,15 @@
|
|
1
1
|
GEM_VERSION = $(shell cat ../RES_VERSION)
|
2
2
|
GEM_NAME = rails_event_store_active_record
|
3
3
|
REQUIRE = $(GEM_NAME)
|
4
|
-
IGNORE = RailsEventStoreActiveRecord::IndexViolationDetector\#
|
4
|
+
IGNORE = RailsEventStoreActiveRecord::IndexViolationDetector\#initialize \
|
5
|
+
RailsEventStoreActiveRecord::IndexViolationDetector\#detect \
|
6
|
+
RailsEventStoreActiveRecord::IndexViolationDetector\#detect_mysql \
|
7
|
+
RailsEventStoreActiveRecord::IndexViolationDetector\#detect_postgres \
|
5
8
|
RailsEventStoreActiveRecord::PgLinearizedEventRepository* \
|
6
|
-
RailsEventStoreActiveRecord::EventRepository\#update_messages
|
9
|
+
RailsEventStoreActiveRecord::EventRepository\#update_messages \
|
10
|
+
RailsEventStoreActiveRecord::WithAbstractBaseClass\#build_event_klass \
|
11
|
+
RailsEventStoreActiveRecord::WithAbstractBaseClass\#build_stream_klass
|
12
|
+
|
7
13
|
SUBJECT ?= RailsEventStoreActiveRecord*
|
8
14
|
DATABASE_URL ?= sqlite3::memory:
|
9
15
|
|
@@ -13,16 +19,3 @@ include ../support/make/mutant.mk
|
|
13
19
|
include ../support/make/gem.mk
|
14
20
|
include ../support/make/help.mk
|
15
21
|
|
16
|
-
install: install-gemfiles
|
17
|
-
|
18
|
-
remove-lock: remove-lockfiles
|
19
|
-
|
20
|
-
install-gemfiles:
|
21
|
-
@BUNDLE_GEMFILE=../support/bundler/Gemfile.0_33_0 bundle check || BUNDLE_GEMFILE=../support/bundler/Gemfile.0_33_0 bundle install
|
22
|
-
@BUNDLE_GEMFILE=../support/bundler/Gemfile.0_34_0 bundle check || BUNDLE_GEMFILE=../support/bundler/Gemfile.0_34_0 bundle install
|
23
|
-
@BUNDLE_GEMFILE=../support/bundler/Gemfile.0_35_0 bundle check || BUNDLE_GEMFILE=../support/bundler/Gemfile.0_35_0 bundle install
|
24
|
-
|
25
|
-
remove-lockfiles:
|
26
|
-
-rm ../support/bundler/Gemfile.0_33_0.lock
|
27
|
-
-rm ../support/bundler/Gemfile.0_34_0.lock
|
28
|
-
-rm ../support/bundler/Gemfile.0_35_0.lock
|
@@ -6,33 +6,37 @@ require 'activerecord-import'
|
|
6
6
|
module RailsEventStoreActiveRecord
|
7
7
|
class EventRepository
|
8
8
|
POSITION_SHIFT = 1
|
9
|
-
SERIALIZED_GLOBAL_STREAM_NAME = "all".freeze
|
10
9
|
|
11
|
-
def initialize
|
12
|
-
@
|
10
|
+
def initialize(model_factory: WithDefaultModels.new, serializer:)
|
11
|
+
@serializer = serializer
|
12
|
+
|
13
|
+
@event_klass, @stream_klass = model_factory.call
|
14
|
+
@repo_reader = EventRepositoryReader.new(@event_klass, @stream_klass, serializer)
|
15
|
+
@index_violation_detector = IndexViolationDetector.new(@event_klass.table_name, @stream_klass.table_name)
|
13
16
|
end
|
14
17
|
|
15
|
-
def append_to_stream(
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
def append_to_stream(records, stream, expected_version)
|
19
|
+
hashes = []
|
20
|
+
event_ids = []
|
21
|
+
Array(records).each do |record|
|
22
|
+
hashes << import_hash(record, record.serialize(serializer))
|
23
|
+
event_ids << record.event_id
|
20
24
|
end
|
21
|
-
add_to_stream(event_ids, stream, expected_version
|
22
|
-
|
25
|
+
add_to_stream(event_ids, stream, expected_version) do
|
26
|
+
@event_klass.import(hashes)
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
26
30
|
def link_to_stream(event_ids, stream, expected_version)
|
27
31
|
event_ids = Array(event_ids)
|
28
|
-
(event_ids -
|
32
|
+
(event_ids - @event_klass.where(event_id: event_ids).pluck(:event_id)).each do |id|
|
29
33
|
raise RubyEventStore::EventNotFound.new(id)
|
30
34
|
end
|
31
|
-
add_to_stream(event_ids, stream, expected_version
|
35
|
+
add_to_stream(event_ids, stream, expected_version)
|
32
36
|
end
|
33
37
|
|
34
38
|
def delete_stream(stream)
|
35
|
-
|
39
|
+
@stream_klass.where(stream: stream.name).delete_all
|
36
40
|
end
|
37
41
|
|
38
42
|
def has_event?(event_id)
|
@@ -51,49 +55,41 @@ module RailsEventStoreActiveRecord
|
|
51
55
|
@repo_reader.count(specification)
|
52
56
|
end
|
53
57
|
|
54
|
-
def update_messages(
|
55
|
-
hashes
|
56
|
-
|
57
|
-
for_update = messages.map(&:event_id)
|
58
|
+
def update_messages(records)
|
59
|
+
hashes = Array(records).map{|record| import_hash(record, record.serialize(serializer)) }
|
60
|
+
for_update = records.map(&:event_id)
|
58
61
|
start_transaction do
|
59
|
-
existing =
|
60
|
-
(for_update - existing).each{|id| raise RubyEventStore::EventNotFound.new(id) }
|
61
|
-
|
62
|
+
existing = @event_klass.where(event_id: for_update).pluck(:event_id, :id).to_h
|
63
|
+
(for_update - existing.keys).each{|id| raise RubyEventStore::EventNotFound.new(id) }
|
64
|
+
hashes.each { |h| h[:id] = existing.fetch(h.fetch(:event_id)) }
|
65
|
+
@event_klass.import(hashes, on_duplicate_key_update: [:data, :metadata, :event_type, :valid_at])
|
62
66
|
end
|
63
67
|
end
|
64
68
|
|
65
69
|
def streams_of(event_id)
|
66
|
-
|
67
|
-
.where.not(stream: SERIALIZED_GLOBAL_STREAM_NAME)
|
70
|
+
@stream_klass.where(event_id: event_id)
|
68
71
|
.pluck(:stream)
|
69
72
|
.map{|name| RubyEventStore::Stream.new(name)}
|
70
73
|
end
|
71
74
|
|
72
75
|
private
|
76
|
+
attr_reader :serializer
|
73
77
|
|
74
|
-
def add_to_stream(event_ids, stream, expected_version
|
75
|
-
last_stream_version = ->(stream_) {
|
78
|
+
def add_to_stream(event_ids, stream, expected_version)
|
79
|
+
last_stream_version = ->(stream_) { @stream_klass.where(stream: stream_.name).order("position DESC").first.try(:position) }
|
76
80
|
resolved_version = expected_version.resolve_for(stream, last_stream_version)
|
77
81
|
|
78
82
|
start_transaction do
|
79
83
|
yield if block_given?
|
80
|
-
in_stream = event_ids.
|
81
|
-
|
82
|
-
collection = []
|
83
|
-
collection.unshift({
|
84
|
-
stream: SERIALIZED_GLOBAL_STREAM_NAME,
|
85
|
-
position: nil,
|
86
|
-
event_id: event_id,
|
87
|
-
}) if include_global
|
88
|
-
collection.unshift({
|
84
|
+
in_stream = event_ids.map.with_index do |event_id, index|
|
85
|
+
{
|
89
86
|
stream: stream.name,
|
90
|
-
position:
|
91
|
-
event_id: event_id
|
92
|
-
}
|
93
|
-
collection
|
87
|
+
position: compute_position(resolved_version, index),
|
88
|
+
event_id: event_id,
|
89
|
+
}
|
94
90
|
end
|
95
91
|
fill_ids(in_stream)
|
96
|
-
|
92
|
+
@stream_klass.import(in_stream) unless stream.global?
|
97
93
|
end
|
98
94
|
self
|
99
95
|
rescue ActiveRecord::RecordNotUnique => e
|
@@ -114,24 +110,30 @@ module RailsEventStoreActiveRecord
|
|
114
110
|
end
|
115
111
|
|
116
112
|
def detect_index_violated(message)
|
117
|
-
|
113
|
+
@index_violation_detector.detect(message)
|
118
114
|
end
|
119
115
|
|
120
|
-
def
|
116
|
+
def import_hash(record, serialized_record)
|
121
117
|
{
|
122
|
-
|
118
|
+
event_id: serialized_record.event_id,
|
123
119
|
data: serialized_record.data,
|
124
120
|
metadata: serialized_record.metadata,
|
125
|
-
event_type: serialized_record.event_type
|
121
|
+
event_type: serialized_record.event_type,
|
122
|
+
created_at: record.timestamp,
|
123
|
+
valid_at: optimize_timestamp(record.valid_at, record.timestamp),
|
126
124
|
}
|
127
125
|
end
|
128
126
|
|
127
|
+
def optimize_timestamp(valid_at, created_at)
|
128
|
+
valid_at unless valid_at.eql?(created_at)
|
129
|
+
end
|
130
|
+
|
129
131
|
# Overwritten in a sub-class
|
130
132
|
def fill_ids(_in_stream)
|
131
133
|
end
|
132
134
|
|
133
135
|
def start_transaction(&block)
|
134
|
-
|
136
|
+
@event_klass.transaction(requires_new: true, &block)
|
135
137
|
end
|
136
138
|
end
|
137
139
|
|
@@ -3,92 +3,156 @@
|
|
3
3
|
module RailsEventStoreActiveRecord
|
4
4
|
class EventRepositoryReader
|
5
5
|
|
6
|
+
def initialize(event_klass, stream_klass, serializer)
|
7
|
+
@event_klass = event_klass
|
8
|
+
@stream_klass = stream_klass
|
9
|
+
@serializer = serializer
|
10
|
+
end
|
11
|
+
|
6
12
|
def has_event?(event_id)
|
7
|
-
|
13
|
+
@event_klass.exists?(event_id: event_id)
|
8
14
|
end
|
9
15
|
|
10
16
|
def last_stream_event(stream)
|
11
|
-
|
12
|
-
record
|
17
|
+
record_ = @stream_klass.where(stream: stream.name).order('position DESC, id DESC').first
|
18
|
+
record(record_) if record_
|
13
19
|
end
|
14
20
|
|
15
21
|
def read(spec)
|
16
|
-
raise RubyEventStore::ReservedInternalName if spec.stream.name.eql?(EventRepository::SERIALIZED_GLOBAL_STREAM_NAME)
|
17
|
-
|
18
22
|
stream = read_scope(spec)
|
19
23
|
|
20
24
|
if spec.batched?
|
21
25
|
batch_reader = ->(offset_id, limit) do
|
22
|
-
|
23
|
-
|
26
|
+
search_in = spec.stream.global? ? @event_klass.table_name : @stream_klass.table_name
|
27
|
+
records = offset_id.nil? ? stream.limit(limit) : stream.where(start_offset_condition(spec, offset_id, search_in)).limit(limit)
|
28
|
+
[records.map(&method(:record)), records.last]
|
24
29
|
end
|
25
30
|
BatchEnumerator.new(spec.batch_size, spec.limit, batch_reader).each
|
26
31
|
elsif spec.first?
|
27
|
-
|
28
|
-
|
32
|
+
record_ = stream.first
|
33
|
+
record(record_) if record_
|
29
34
|
elsif spec.last?
|
30
|
-
|
31
|
-
|
35
|
+
record_ = stream.last
|
36
|
+
record(record_) if record_
|
32
37
|
else
|
33
|
-
stream.map(&method(:
|
38
|
+
stream.map(&method(:record)).each
|
34
39
|
end
|
35
40
|
end
|
36
41
|
|
37
42
|
def count(spec)
|
38
|
-
raise RubyEventStore::ReservedInternalName if spec.stream.name.eql?(EventRepository::SERIALIZED_GLOBAL_STREAM_NAME)
|
39
|
-
|
40
43
|
read_scope(spec).count
|
41
44
|
end
|
42
45
|
|
43
46
|
private
|
47
|
+
attr_reader :serializer
|
44
48
|
|
45
49
|
def read_scope(spec)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
if spec.stream.global?
|
51
|
+
stream = @event_klass
|
52
|
+
stream = stream.where(event_id: spec.with_ids) if spec.with_ids?
|
53
|
+
stream = stream.where(event_type: spec.with_types) if spec.with_types?
|
54
|
+
stream = ordered(stream, spec)
|
55
|
+
stream = stream.limit(spec.limit) if spec.limit?
|
56
|
+
stream = stream.where(start_condition_in_global_stream(spec)) if spec.start
|
57
|
+
stream = stream.where(stop_condition_in_global_stream(spec)) if spec.stop
|
58
|
+
stream = stream.where(older_than_condition(spec)) if spec.older_than
|
59
|
+
stream = stream.where(older_than_or_equal_condition(spec)) if spec.older_than_or_equal
|
60
|
+
stream = stream.where(newer_than_condition(spec)) if spec.newer_than
|
61
|
+
stream = stream.where(newer_than_or_equal_condition(spec)) if spec.newer_than_or_equal
|
62
|
+
stream.order(id: order(spec))
|
63
|
+
else
|
64
|
+
stream = @stream_klass.preload(:event).where(stream: spec.stream.name)
|
65
|
+
stream = stream.where(event_id: spec.with_ids) if spec.with_ids?
|
66
|
+
stream = stream.where(@event_klass.table_name => {event_type: spec.with_types}) if spec.with_types?
|
67
|
+
stream = ordered(stream.joins(:event), spec)
|
68
|
+
stream = stream.order(position: order(spec), id: order(spec))
|
69
|
+
stream = stream.limit(spec.limit) if spec.limit?
|
70
|
+
stream = stream.where(start_condition(spec)) if spec.start
|
71
|
+
stream = stream.where(stop_condition(spec)) if spec.stop
|
72
|
+
stream = stream.where(older_than_condition(spec)) if spec.older_than
|
73
|
+
stream = stream.where(older_than_or_equal_condition(spec)) if spec.older_than_or_equal
|
74
|
+
stream = stream.where(newer_than_condition(spec)) if spec.newer_than
|
75
|
+
stream = stream.where(newer_than_or_equal_condition(spec)) if spec.newer_than_or_equal
|
76
|
+
stream
|
77
|
+
end
|
55
78
|
end
|
56
79
|
|
57
|
-
def
|
58
|
-
|
80
|
+
def ordered(stream, spec)
|
81
|
+
case spec.time_sort_by
|
82
|
+
when :as_at
|
83
|
+
stream.order("#{@event_klass.table_name}.created_at #{order(spec)}")
|
84
|
+
when :as_of
|
85
|
+
stream.order("#{@event_klass.table_name}.valid_at #{order(spec)}")
|
86
|
+
else
|
87
|
+
stream
|
88
|
+
end
|
59
89
|
end
|
60
90
|
|
61
|
-
def start_offset_condition(specification, record_id)
|
62
|
-
condition = specification.forward? ? '
|
91
|
+
def start_offset_condition(specification, record_id, search_in)
|
92
|
+
condition = "#{search_in}.id #{specification.forward? ? '>' : '<'} ?"
|
63
93
|
[condition, record_id]
|
64
94
|
end
|
65
95
|
|
66
|
-
def stop_offset_condition(specification, record_id)
|
67
|
-
condition = specification.forward? ? '
|
96
|
+
def stop_offset_condition(specification, record_id, search_in)
|
97
|
+
condition = "#{search_in}.id #{specification.forward? ? '<' : '>'} ?"
|
68
98
|
[condition, record_id]
|
69
99
|
end
|
70
100
|
|
71
101
|
def start_condition(specification)
|
72
102
|
start_offset_condition(specification,
|
73
|
-
|
103
|
+
@stream_klass.find_by!(event_id: specification.start, stream: specification.stream.name),
|
104
|
+
@stream_klass.table_name)
|
74
105
|
end
|
75
106
|
|
76
107
|
def stop_condition(specification)
|
77
108
|
stop_offset_condition(specification,
|
78
|
-
|
109
|
+
@stream_klass.find_by!(event_id: specification.stop, stream: specification.stream.name),
|
110
|
+
@stream_klass.table_name)
|
111
|
+
end
|
112
|
+
|
113
|
+
def start_condition_in_global_stream(specification)
|
114
|
+
start_offset_condition(specification,
|
115
|
+
@event_klass.find_by!(event_id: specification.start),
|
116
|
+
@event_klass.table_name)
|
117
|
+
end
|
118
|
+
|
119
|
+
def stop_condition_in_global_stream(specification)
|
120
|
+
stop_offset_condition(specification,
|
121
|
+
@event_klass.find_by!(event_id: specification.stop),
|
122
|
+
@event_klass.table_name)
|
123
|
+
end
|
124
|
+
|
125
|
+
def older_than_condition(specification)
|
126
|
+
["#{@event_klass.table_name}.created_at < ?", specification.older_than]
|
127
|
+
end
|
128
|
+
|
129
|
+
def older_than_or_equal_condition(specification)
|
130
|
+
["#{@event_klass.table_name}.created_at <= ?", specification.older_than_or_equal]
|
131
|
+
end
|
132
|
+
|
133
|
+
def newer_than_condition(specification)
|
134
|
+
["#{@event_klass.table_name}.created_at > ?", specification.newer_than]
|
135
|
+
end
|
136
|
+
|
137
|
+
def newer_than_or_equal_condition(specification)
|
138
|
+
["#{@event_klass.table_name}.created_at >= ?", specification.newer_than_or_equal]
|
79
139
|
end
|
80
140
|
|
81
141
|
def order(spec)
|
82
142
|
spec.forward? ? 'ASC' : 'DESC'
|
83
143
|
end
|
84
144
|
|
85
|
-
def
|
145
|
+
def record(record)
|
146
|
+
record = record.event if @stream_klass === record
|
147
|
+
|
86
148
|
RubyEventStore::SerializedRecord.new(
|
87
|
-
event_id: record.
|
88
|
-
metadata: record.
|
89
|
-
data: record.
|
90
|
-
event_type: record.
|
91
|
-
|
149
|
+
event_id: record.event_id,
|
150
|
+
metadata: record.metadata,
|
151
|
+
data: record.data,
|
152
|
+
event_type: record.event_type,
|
153
|
+
timestamp: record.created_at.iso8601(RubyEventStore::TIMESTAMP_PRECISION),
|
154
|
+
valid_at: (record.valid_at || record.created_at).iso8601(RubyEventStore::TIMESTAMP_PRECISION),
|
155
|
+
).deserialize(serializer)
|
92
156
|
end
|
93
157
|
end
|
94
158
|
|
@@ -6,11 +6,11 @@ rescue LoadError
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module RailsEventStoreActiveRecord
|
9
|
-
class
|
9
|
+
class AddValidAtGenerator < Rails::Generators::Base
|
10
10
|
source_root File.expand_path(File.join(File.dirname(__FILE__), '../generators/templates'))
|
11
11
|
|
12
12
|
def create_migration
|
13
|
-
template "
|
13
|
+
template "add_valid_at_template.rb", "db/migrate/#{timestamp}_add_valid_at.rb"
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
@@ -6,11 +6,11 @@ rescue LoadError
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module RailsEventStoreActiveRecord
|
9
|
-
class
|
9
|
+
class CreatedAtPrecisionGenerator < Rails::Generators::Base
|
10
10
|
source_root File.expand_path(File.join(File.dirname(__FILE__), '../generators/templates'))
|
11
11
|
|
12
12
|
def create_migration
|
13
|
-
template "
|
13
|
+
template "created_at_precision_template.rb", "db/migrate/#{timestamp}_created_at_precision.rb"
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
@@ -1,16 +1,14 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
begin
|
4
2
|
require 'rails/generators'
|
5
3
|
rescue LoadError
|
6
4
|
end
|
7
5
|
|
8
6
|
module RailsEventStoreActiveRecord
|
9
|
-
class
|
7
|
+
class NoGlobalStreamEntriesGenerator < Rails::Generators::Base
|
10
8
|
source_root File.expand_path(File.join(File.dirname(__FILE__), '../generators/templates'))
|
11
9
|
|
12
10
|
def create_migration
|
13
|
-
template "
|
11
|
+
template "no_global_stream_entries_template.rb", "db/migrate/#{timestamp}_no_global_stream_entries.rb"
|
14
12
|
end
|
15
13
|
|
16
14
|
private
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class AddValidAt < ActiveRecord::Migration<%= migration_version %>
|
4
|
+
def change
|
5
|
+
case ActiveRecord::Base.connection.adapter_name
|
6
|
+
when "PostgreSQL"
|
7
|
+
add_column :event_store_events, :valid_at, :datetime, null: true
|
8
|
+
else
|
9
|
+
add_column :event_store_events, :valid_at, :datetime, precision: 6, null: true
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index :event_store_events, :valid_at
|
13
|
+
end
|
14
|
+
end
|
data/lib/rails_event_store_active_record/generators/templates/create_event_store_events_template.rb
CHANGED
@@ -4,7 +4,7 @@ class CreateEventStoreEvents < ActiveRecord::Migration<%= migration_version %>
|
|
4
4
|
def change
|
5
5
|
postgres = ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
|
6
6
|
sqlite = ActiveRecord::Base.connection.adapter_name == "SQLite"
|
7
|
-
|
7
|
+
|
8
8
|
enable_extension "pgcrypto" if postgres
|
9
9
|
create_table(:event_store_events_in_streams, force: false) do |t|
|
10
10
|
t.string :stream, null: false
|
@@ -14,32 +14,38 @@ class CreateEventStoreEvents < ActiveRecord::Migration<%= migration_version %>
|
|
14
14
|
else
|
15
15
|
t.references :event, null: false, type: :string, limit: 36
|
16
16
|
end
|
17
|
-
|
17
|
+
if postgres
|
18
|
+
t.datetime :created_at, null: false
|
19
|
+
else
|
20
|
+
t.datetime :created_at, null: false, precision: 6
|
21
|
+
end
|
18
22
|
end
|
19
23
|
add_index :event_store_events_in_streams, [:stream, :position], unique: true
|
20
24
|
add_index :event_store_events_in_streams, [:created_at]
|
21
25
|
add_index :event_store_events_in_streams, [:stream, :event_id], unique: true
|
22
26
|
|
23
27
|
if postgres
|
24
|
-
create_table(:event_store_events,
|
28
|
+
create_table(:event_store_events, force: false) do |t|
|
29
|
+
t.references :event, null: false, type: :uuid
|
25
30
|
t.string :event_type, null: false
|
26
31
|
t.<%= data_type %> :metadata
|
27
32
|
t.<%= data_type %> :data, null: false
|
28
33
|
t.datetime :created_at, null: false
|
34
|
+
t.datetime :valid_at, null: true
|
29
35
|
end
|
30
36
|
else
|
31
|
-
create_table(:event_store_events,
|
32
|
-
t.
|
37
|
+
create_table(:event_store_events, force: false) do |t|
|
38
|
+
t.references :event, null: false, type: :string, limit: 36
|
33
39
|
t.string :event_type, null: false
|
34
40
|
t.binary :metadata
|
35
41
|
t.binary :data, null: false
|
36
|
-
t.datetime :created_at, null: false
|
37
|
-
|
38
|
-
if sqlite && rails_42
|
39
|
-
add_index :event_store_events, :id, unique: true
|
42
|
+
t.datetime :created_at, null: false, precision: 6
|
43
|
+
t.datetime :valid_at, null: true, precision: 6
|
40
44
|
end
|
41
45
|
end
|
46
|
+
add_index :event_store_events, :event_id, unique: true
|
42
47
|
add_index :event_store_events, :created_at
|
48
|
+
add_index :event_store_events, :valid_at
|
43
49
|
add_index :event_store_events, :event_type
|
44
50
|
end
|
45
51
|
end
|
data/lib/rails_event_store_active_record/generators/templates/created_at_precision_template.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class CreatedAtPrecision < ActiveRecord::Migration<%= migration_version %>
|
4
|
+
def change
|
5
|
+
case ActiveRecord::Base.connection.adapter_name
|
6
|
+
when "SQLite"
|
7
|
+
rename_table :event_store_events, :old_event_store_events
|
8
|
+
create_table(:event_store_events, id: false, force: false) do |t|
|
9
|
+
t.string :id, limit: 36, primary_key: true, null: false
|
10
|
+
t.string :event_type, null: false
|
11
|
+
t.binary :metadata
|
12
|
+
t.binary :data, null: false
|
13
|
+
t.datetime :created_at, null: false, precision: 6
|
14
|
+
end
|
15
|
+
add_index :event_store_events, :created_at
|
16
|
+
add_index :event_store_events, :event_type
|
17
|
+
execute <<-SQL
|
18
|
+
INSERT INTO event_store_events(id, event_type, metadata, data, created_at)
|
19
|
+
SELECT id, event_type, metadata, data, created_at FROM old_event_store_events;
|
20
|
+
SQL
|
21
|
+
drop_table :old_event_store_events
|
22
|
+
|
23
|
+
rename_table :event_store_events_in_streams, :old_event_store_events_in_streams
|
24
|
+
create_table(:event_store_events_in_streams, force: false) do |t|
|
25
|
+
t.string :stream, null: false
|
26
|
+
t.integer :position, null: true
|
27
|
+
t.references :event, null: false, type: :string, limit: 36
|
28
|
+
t.datetime :created_at, null: false, precision: 6
|
29
|
+
end
|
30
|
+
add_index :event_store_events_in_streams, [:stream, :position], unique: true
|
31
|
+
add_index :event_store_events_in_streams, [:created_at]
|
32
|
+
add_index :event_store_events_in_streams, [:stream, :event_id], unique: true
|
33
|
+
|
34
|
+
execute <<-SQL
|
35
|
+
INSERT INTO event_store_events_in_streams(id, stream, position, event_id, created_at)
|
36
|
+
SELECT id, stream, position, event_id, created_at FROM old_event_store_events_in_streams;
|
37
|
+
SQL
|
38
|
+
drop_table :old_event_store_events_in_streams
|
39
|
+
when "PostgreSQL"
|
40
|
+
else
|
41
|
+
change_column :event_store_events, :created_at, :datetime, precision: 6
|
42
|
+
change_column :event_store_events_in_streams, :created_at, :datetime, precision: 6
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/rails_event_store_active_record/generators/templates/no_global_stream_entries_template.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
class NoGlobalStreamEntries < ActiveRecord::Migration<%= migration_version %>
|
2
|
+
def change
|
3
|
+
case ActiveRecord::Base.connection.adapter_name
|
4
|
+
when "SQLite"
|
5
|
+
rename_table :event_store_events, :old_event_store_events
|
6
|
+
create_table(:event_store_events, force: false) do |t|
|
7
|
+
t.references :event, null: false, type: :string, limit: 36
|
8
|
+
t.string :event_type, null: false
|
9
|
+
t.binary :metadata
|
10
|
+
t.binary :data, null: false
|
11
|
+
t.datetime :created_at, precision: 6, null: false
|
12
|
+
t.datetime :valid_at, precision: 6, null: true
|
13
|
+
end
|
14
|
+
add_index :event_store_events, :event_id, unique: true
|
15
|
+
add_index :event_store_events, :created_at
|
16
|
+
add_index :event_store_events, :valid_at
|
17
|
+
add_index :event_store_events, :event_type
|
18
|
+
|
19
|
+
execute <<-SQL
|
20
|
+
INSERT INTO event_store_events(event_id, event_type, metadata, data, created_at)
|
21
|
+
SELECT id, event_type, metadata, data, created_at FROM old_event_store_events;
|
22
|
+
SQL
|
23
|
+
drop_table :old_event_store_events
|
24
|
+
when "PostgreSQL"
|
25
|
+
rename_column :event_store_events, :id, :event_id
|
26
|
+
change_column_default :event_store_events, :event_id, nil
|
27
|
+
add_column :event_store_events, :id, :serial
|
28
|
+
|
29
|
+
execute <<~SQL
|
30
|
+
UPDATE event_store_events
|
31
|
+
SET id = event_store_events_in_streams.id
|
32
|
+
FROM event_store_events_in_streams
|
33
|
+
WHERE event_store_events.event_id = event_store_events_in_streams.event_id AND event_store_events_in_streams.stream = 'all';
|
34
|
+
UPDATE event_store_events
|
35
|
+
SET id = ese.new_id
|
36
|
+
FROM (SELECT id, row_number() OVER (ORDER BY id) AS new_id FROM event_store_events) ese
|
37
|
+
WHERE event_store_events.id = ese.id;
|
38
|
+
SELECT setval(pg_get_serial_sequence('event_store_events', 'id'), max(id)) FROM event_store_events;
|
39
|
+
ALTER TABLE event_store_events DROP CONSTRAINT event_store_events_pkey;
|
40
|
+
ALTER TABLE event_store_events ADD PRIMARY KEY (id);
|
41
|
+
SQL
|
42
|
+
add_index :event_store_events, :event_id, unique: true
|
43
|
+
else
|
44
|
+
rename_column :event_store_events, :id, :event_id
|
45
|
+
add_column :event_store_events, :id, :integer
|
46
|
+
|
47
|
+
execute <<-SQL
|
48
|
+
UPDATE event_store_events
|
49
|
+
INNER JOIN event_store_events_in_streams ON (event_store_events.event_id = event_store_events_in_streams.event_id)
|
50
|
+
SET event_store_events.id = event_store_events_in_streams.id
|
51
|
+
WHERE event_store_events_in_streams.stream = 'all';
|
52
|
+
SQL
|
53
|
+
execute "SET @row_number = 0"
|
54
|
+
execute "UPDATE event_store_events SET event_store_events.id = (@row_number:=@row_number + 1) ORDER BY id"
|
55
|
+
execute "ALTER TABLE event_store_events DROP PRIMARY KEY, ADD PRIMARY KEY (id), MODIFY id INT AUTO_INCREMENT"
|
56
|
+
add_index :event_store_events, :event_id, unique: true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|