entity_store_sequel 0.2.2 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c42131de7211c31322b1b2756dffc2d4618bc4f7acdedea190613e6838b42eef
4
- data.tar.gz: 389dcf4874fb1469e58533dbbee84839b628c91409611342e17f93177305ed96
3
+ metadata.gz: 1fbaafda3599b05b00d50669608de59f140546e61066def1dbb355d2eea59ccf
4
+ data.tar.gz: 565ac6d7d44085cb366f2250147c20c63f4a1b05143cb8f30286f485172c184b
5
5
  SHA512:
6
- metadata.gz: c3a3b060c3098f60d88991fb7282506a1aa54a82e3ddb967388bfcbcd0530f5c10305d2c13cc72848fc7553f8c91fc671a818db771c8512a75dbfbb5cec6e56b
7
- data.tar.gz: 9eb6147831a2e4ff174d6b0b30ab52d5231e9642b7bb4f900cc3f0964134598bdaa2727ad446a3c46892f45fe31ab23bf8dfe237a6535188b0fc233c97b1e116
6
+ metadata.gz: a5ab29eb7d354b40cd35411226e8e96d65ca7df0fda329378a849033fc96a13864558eae931966756fef5ae18733806075dcd69cf723c1f28bcebcca2c606c10
7
+ data.tar.gz: c8ffb267c8103f4bf4cd03e56099f55e3d6ecec1b93357176de0e1a24018d1c8191763b7ac5578944eeefd9795fce6dfaa024c88c881a6ebbef5f38449dcec04
@@ -70,10 +70,13 @@ module EntityStoreSequel
70
70
  end
71
71
 
72
72
  def clear_entity_events(id, excluded_types)
73
- events.where(_entity_id: id).each do |event|
74
- next if excluded_types.include?(event[:_type])
75
-
76
- events.where(id: event[:id]).delete
73
+ if excluded_types.empty?
74
+ events.where(_entity_id: id).delete
75
+ else
76
+ events.where(_entity_id: id).select(:id, :_type).each do |event|
77
+ next if excluded_types.include?(event[:_type])
78
+ events.where(id: event[:id]).delete
79
+ end
77
80
  end
78
81
  end
79
82
 
@@ -129,20 +132,42 @@ module EntityStoreSequel
129
132
  add_events_with_ids(events_with_id)
130
133
  end
131
134
 
135
+ def upsert_events(items)
136
+ events_with_id = items.map do |e|
137
+ [ e._id, e ]
138
+ end
139
+
140
+ filtered_events = []
141
+ events_with_id.each do |id, event|
142
+ next if events.where(id: id.to_s).count > 0
143
+
144
+ filtered_events << event
145
+
146
+ doc = event_doc(id, event)
147
+ events.insert(doc)
148
+ end
149
+
150
+ filtered_events
151
+ end
152
+
132
153
  def add_events_with_ids(event_id_map)
133
154
  event_id_map.each do |id, event|
134
- doc = {
135
- :id => id.to_s,
136
- :_type => event.class.name,
137
- :_entity_id => event.entity_id.to_s,
138
- :entity_version => event.entity_version,
139
- :at => event.attributes[:at],
140
- :data => PigeonHole.generate(hash_without_keys(event.attributes, :entity_id, :at, :entity_version)),
141
- }
155
+ doc = event_doc(id, event)
142
156
  events.insert(doc)
143
157
  end
144
158
  end
145
159
 
160
+ def event_doc(id, event)
161
+ {
162
+ :id => id.to_s,
163
+ :_type => event.class.name,
164
+ :_entity_id => event.entity_id.to_s,
165
+ :entity_version => event.entity_version,
166
+ :at => event.attributes[:at],
167
+ :data => PigeonHole.generate(hash_without_keys(event.attributes, :entity_id, :at, :entity_version, :_id)),
168
+ }
169
+ end
170
+
146
171
  # Public: loads the entity from the store, including any available snapshots
147
172
  # then loads the events to complete the state
148
173
  #
@@ -259,6 +284,25 @@ module EntityStoreSequel
259
284
 
260
285
  private
261
286
 
287
+ def get_raw_events(entity_id)
288
+ rows = events.where(:_entity_id => entity_id).order_by(:entity_version, :id)
289
+ rows.map do |attrs|
290
+ if self.class.native_json_hash
291
+ hash = attrs[:data].to_h
292
+ else
293
+ hash = PigeonHole.parse(attrs[:data])
294
+ end
295
+
296
+ hash[:_id] = attrs[:id]
297
+ hash[:_type] = attrs[:_type]
298
+ hash[:entity_version] = attrs[:entity_version]
299
+ hash[:entity_id] = attrs[:_entity_id]
300
+ hash[:at] = attrs[:at]
301
+
302
+ hash
303
+ end
304
+ end
305
+
262
306
  def filter_method_name(index)
263
307
  index == 0 ? :where : :or
264
308
  end
@@ -1,3 +1,3 @@
1
1
  module EntityStoreSequel
2
- VERSION = "0.2.2".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
@@ -47,6 +47,21 @@ describe PostgresEntityStore do
47
47
  end
48
48
  end
49
49
 
50
+ class DummyEntityExcludedEvent
51
+ include EntityStore::Event
52
+
53
+ attr_accessor :marker
54
+
55
+ def apply(entity)
56
+ # No-op
57
+ end
58
+
59
+ def ==(other)
60
+ # Crude check relying on inspect, ok for tests
61
+ self.inspect == other.inspect
62
+ end
63
+ end
64
+
50
65
  let(:store) do
51
66
  described_class.connection_string = ENV['SQL_CONNECTION'] || 'postgres://localhost/cronofy_test'
52
67
  described_class.init
@@ -123,23 +138,42 @@ describe PostgresEntityStore do
123
138
  let(:third_event) { DummyEntityNameSet.new(:entity_id => entity_id, :entity_version => 2, :name => random_string) }
124
139
  let(:unrelated_event) { DummyEntityNameSet.new(:entity_id => second_entity_id, :entity_version => 4, :name => random_string) }
125
140
  let(:fourth_event) { DummyEntityNameSet.new(:entity_id => entity_id, :entity_version => 3, :name => random_string) }
141
+ let(:excluded_event) { DummyEntityExcludedEvent.new(:entity_id => entity_id, :entity_version => 5, :marker => random_string) }
126
142
 
127
143
  before do
128
- store.add_events([ second_event, unrelated_event, first_event, third_event, fourth_event ])
144
+ store.add_events([ second_event, unrelated_event, first_event, third_event, fourth_event, excluded_event ])
129
145
  end
130
146
 
131
- subject { store.clear_entity_events(entity_id, []) }
147
+ context "clearing everything" do
148
+ subject { store.clear_entity_events(entity_id, []) }
132
149
 
133
- it "clears the events from the entity" do
134
- subject
135
- events = store.get_events( [ id: entity_id ])[entity_id]
136
- expect(events).to be_empty
150
+ it "clears the events from the entity" do
151
+ subject
152
+ events = store.get_events( [ id: entity_id ])[entity_id]
153
+ expect(events).to be_empty
154
+ end
155
+
156
+ it "does not delete unrelated the events" do
157
+ subject
158
+ events = store.get_events( [ id: second_entity_id ])[second_entity_id]
159
+ expect(events).to eq [unrelated_event]
160
+ end
137
161
  end
138
162
 
139
- it "does not delete unrelated the events" do
140
- subject
141
- events = store.get_events( [ id: second_entity_id ])[second_entity_id]
142
- expect(events.count).to eq(1)
163
+ context "excluding an event type from deletion" do
164
+ subject { store.clear_entity_events(entity_id, [DummyEntityExcludedEvent.to_s]) }
165
+
166
+ it "clears all other events from the entity" do
167
+ subject
168
+ events = store.get_events( [ id: entity_id ])[entity_id]
169
+ expect(events).to eq [excluded_event]
170
+ end
171
+
172
+ it "does not delete unrelated the events" do
173
+ subject
174
+ events = store.get_events( [ id: second_entity_id ])[second_entity_id]
175
+ expect(events).to eq [unrelated_event]
176
+ end
143
177
  end
144
178
  end
145
179
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: entity_store_sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Binns
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-24 00:00:00.000000000 Z
11
+ date: 2024-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -101,7 +101,7 @@ homepage: http://github.com/cronofy/entity_store_sequel
101
101
  licenses:
102
102
  - MIT
103
103
  metadata: {}
104
- post_install_message:
104
+ post_install_message:
105
105
  rdoc_options: []
106
106
  require_paths:
107
107
  - lib
@@ -116,12 +116,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 2.7.4
121
- signing_key:
119
+ rubygems_version: 3.4.21
120
+ signing_key:
122
121
  specification_version: 4
123
122
  summary: Sequel body for Entity Store
124
123
  test_files:
125
- - spec/spec_helper.rb
126
- - spec/entity_store_spec.rb
127
124
  - spec/entity_store_sequel/postgres_entity_store_spec.rb
125
+ - spec/entity_store_spec.rb
126
+ - spec/spec_helper.rb