synapse-mongo 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -58,6 +58,6 @@ module Synapse
58
58
  end
59
59
  end
60
60
  end # CursorDomainEventStream
61
- end
62
- end
61
+ end # Mongo
62
+ end # EventStore
63
63
  end
@@ -85,4 +85,4 @@ module Synapse
85
85
  end # MongoEventStore
86
86
  end # Mongo
87
87
  end # EventStore
88
- end # Synapse
88
+ end
@@ -250,4 +250,4 @@ module Synapse
250
250
  end # DocumentPerCommitStrategy
251
251
  end # Mongo
252
252
  end # EventStore
253
- end # Synapse
253
+ end
@@ -140,4 +140,4 @@ module Synapse
140
140
  end # DocumentPerEventStrategy
141
141
  end # Mongo
142
142
  end # EventStore
143
- end # Synapse
143
+ end
@@ -110,4 +110,4 @@ module Synapse
110
110
  end # StorageStrategy
111
111
  end # Mongo
112
112
  end # EventStore
113
- end # Synapse
113
+ end
@@ -27,7 +27,7 @@ module Synapse
27
27
  def snapshot_collection
28
28
  database.collection @snapshot_collection_name
29
29
  end
30
- end # MongoTemplate
30
+ end # Template
31
31
  end # Mongo
32
32
  end # EventStore
33
- end # Synapse
33
+ end
@@ -1,5 +1,5 @@
1
1
  module Synapse
2
2
  module Mongo
3
- VERSION = '0.1.1'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -0,0 +1,61 @@
1
+ module Synapse
2
+ module ProcessManager
3
+ module Mongo
4
+ # Mongo document that represents a process instance
5
+ class ProcessDocument
6
+ # @param [Process] process
7
+ # @param [Serializer] serializer
8
+ # @return [ProcessDocument]
9
+ def from_process(process, serializer)
10
+ serialized_process = serializer.serialize process, String
11
+
12
+ @id = process.id
13
+ @serialized = serialized_process.content
14
+ @type = serialized_process.type.name
15
+ @correlations = Array.new
16
+
17
+ process.correlations.each do |correlation|
18
+ correlation_hash = {
19
+ key: correlation.key,
20
+ value: correlation.value
21
+ }
22
+
23
+ @correlations.push correlation_hash
24
+ end
25
+
26
+ self
27
+ end
28
+
29
+ # @param [Hash] hash
30
+ # @return [ProcessDocument]
31
+ def from_hash(hash)
32
+ hash.symbolize_keys!
33
+
34
+ @id = hash.fetch :_id
35
+ @serialized = hash.fetch :serialized
36
+ @type = hash.fetch :type
37
+ @correlations = hash.fetch :correlations
38
+
39
+ self
40
+ end
41
+
42
+ # @return [Hash]
43
+ def to_hash
44
+ { _id: @id,
45
+ serialized: @serialized,
46
+ type: @type,
47
+ correlations: @correlations }
48
+ end
49
+
50
+ # @param [Serializer] serializer
51
+ # @return [Process]
52
+ def to_process(serializer)
53
+ serialized_type = Serialization::SerializedType.new @type, nil
54
+ serialized_object = Serialization::SerializedObject.new @serialized, String, serialized_type
55
+
56
+ serializer.deserialize serialized_object
57
+ end
58
+ end # ProcessDocument
59
+ end # Mongo
60
+ end # ProcessManager
61
+ end
@@ -0,0 +1,90 @@
1
+ module Synapse
2
+ module ProcessManager
3
+ module Mongo
4
+ # Implementation of a process repository that serializes process instances to an
5
+ # underlying MongoDB collection
6
+ class MongoProcessRepository < ProcessRepository
7
+ # @return [ResourceInjector]
8
+ attr_accessor :resource_injector
9
+
10
+ # @param [Serializer] serializer
11
+ # @param [Template] template
12
+ # @return [undefined]
13
+ def initialize(serializer, template)
14
+ @resource_injector = ResourceInjector.new
15
+ @serializer = serializer
16
+ @template = template
17
+ end
18
+
19
+ # @param [Class] type
20
+ # @param [Correlation] correlation
21
+ # @return [Set]
22
+ def find(type, correlation)
23
+ process_type = @serializer.type_for(type).name
24
+
25
+ query = {
26
+ type: process_type,
27
+ correlations: {
28
+ key: correlation.key,
29
+ value: correlation.value
30
+ }
31
+ }
32
+
33
+ identifiers = Set.new
34
+ identifiers.tap do
35
+ cursor = @template.process_collection.find query
36
+ cursor.each do |process|
37
+ identifiers.add process.fetch '_id'
38
+ end
39
+ end
40
+ end
41
+
42
+ # @param [String] id
43
+ # @return [Process] Returns nil if process could not be found
44
+ def load(id)
45
+ hash = @template.process_collection.find_one _id: id
46
+
47
+ if hash
48
+ document = ProcessDocument.new
49
+ document.from_hash(hash).to_process(@serializer).tap do |loaded_process|
50
+ @resource_injector.inject_resources(loaded_process)
51
+ end
52
+ end
53
+ end
54
+
55
+ # @param [Process] process
56
+ # @return [undefined]
57
+ def commit(process)
58
+ if process.active?
59
+ @template.process_collection.save to_hash process
60
+ else
61
+ @template.process_collection.remove _id: process.id
62
+ end
63
+ end
64
+
65
+ # @param [Process] process
66
+ # @return [undefined]
67
+ def add(process)
68
+ if process.active?
69
+ @template.process_collection.insert to_hash process
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ # Marks a process's correlations as committed and converts it to a hash suitable for
76
+ # insertion or update in a Mongo collection
77
+ #
78
+ # @param [Process] process
79
+ # @return [Hash]
80
+ def to_hash(process)
81
+ process.correlations.commit
82
+
83
+ document = ProcessDocument.new
84
+ document.from_process process, @serializer
85
+ document.to_hash
86
+ end
87
+ end # MongoProcessRepository
88
+ end # Mongo
89
+ end # ProcessManager
90
+ end
@@ -0,0 +1,23 @@
1
+ module Synapse
2
+ module ProcessManager
3
+ module Mongo
4
+ # Template for accessing collections needed by the process repository
5
+ class Template < Common::Mongo::BaseTemplate
6
+ # @return [String] Name of the collection containing processes
7
+ attr_accessor :process_repository_name
8
+
9
+ # @param [Mongo::MongoClient] client
10
+ # @return [undefined]
11
+ def initialize(client)
12
+ super
13
+ @process_repository_name = 'processes'
14
+ end
15
+
16
+ # @return [Mongo::Collection]
17
+ def process_collection
18
+ database.collection @process_repository_name
19
+ end
20
+ end # Template
21
+ end # Mongo
22
+ end # ProcessManager
23
+ end
@@ -0,0 +1,3 @@
1
+ require 'synapse/process_manager/mongo/process_document'
2
+ require 'synapse/process_manager/mongo/process_repository'
3
+ require 'synapse/process_manager/mongo/template'
data/lib/synapse-mongo.rb CHANGED
@@ -9,12 +9,17 @@ module Synapse
9
9
  # Utility classes used by Mongo components
10
10
  module Mongo
11
11
  extend ActiveSupport::Autoload
12
-
13
12
  autoload :BaseTemplate
14
13
  end
15
14
  end
16
15
 
17
16
  module EventStore
17
+ extend ActiveSupport::Autoload
18
+ autoload :Mongo
19
+ end
20
+
21
+ module ProcessManager
22
+ extend ActiveSupport::Autoload
18
23
  autoload :Mongo
19
24
  end
20
25
 
@@ -8,9 +8,12 @@ module Synapse
8
8
  def test_integration
9
9
  client = ::Mongo::MongoClient.new
10
10
  template = Template.new client
11
+ template.event_collection.drop
12
+ template.snapshot_collection.drop
11
13
 
12
- serializer = Serialization::MarshalSerializer.new
13
- upcaster_chain = Upcasting::UpcasterChain.new serializer.converter_factory
14
+ converter_factory = Serialization::ConverterFactory.new
15
+ serializer = Serialization::MarshalSerializer.new converter_factory
16
+ upcaster_chain = Upcasting::UpcasterChain.new converter_factory
14
17
 
15
18
  [DocumentPerCommitStrategy, DocumentPerEventStrategy].each do |type|
16
19
  strategy = type.new template, serializer, upcaster_chain
@@ -0,0 +1,71 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module ProcessManager
5
+ module Mongo
6
+ class MongoProcessRepositoryTest < Test::Unit::TestCase
7
+
8
+ def setup
9
+ client = ::Mongo::MongoClient.new
10
+ template = Template.new client
11
+ template.process_collection.drop
12
+
13
+ converter_factory = Serialization::ConverterFactory.new
14
+ serializer = Serialization::MarshalSerializer.new converter_factory
15
+
16
+ @repository = MongoProcessRepository.new serializer, template
17
+ end
18
+
19
+ def test_add
20
+ process = Process.new
21
+
22
+ @repository.add process
23
+ loaded = @repository.load process.id
24
+
25
+ assert_equal process.id, loaded.id
26
+ assert_equal 0, process.correlations.additions.count
27
+ end
28
+
29
+ def test_commit
30
+ correlation = Correlation.new :order_id, '123'
31
+
32
+ process = Process.new
33
+ @repository.add process
34
+
35
+ process.correlations.add correlation
36
+ @repository.commit process
37
+
38
+ loaded = @repository.load process.id
39
+
40
+ assert loaded.correlations.include? correlation
41
+
42
+ loaded.send :finish
43
+ @repository.commit loaded
44
+
45
+ assert_nil @repository.load process.id
46
+ end
47
+
48
+ def test_find
49
+ correlation_a = Correlation.new :order_id, '123'
50
+ correlation_b = Correlation.new :order_id, '456'
51
+
52
+ process_a = Process.new
53
+ process_a.correlations.add correlation_a
54
+ @repository.add process_a
55
+ process_b = Process.new
56
+ process_b.correlations.add correlation_a
57
+ @repository.add process_b
58
+ process_c = Process.new
59
+ process_c.correlations.add correlation_b
60
+ @repository.add process_c
61
+
62
+ identifiers = @repository.find Process, correlation_a
63
+ assert_equal Set[process_a.id, process_b.id], identifiers
64
+ identifiers = @repository.find Process, correlation_b
65
+ assert_equal Set[process_c.id], identifiers
66
+ end
67
+
68
+ end
69
+ end
70
+ end
71
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synapse-mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-12 00:00:00.000000000 Z
12
+ date: 2013-05-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: synapse-core
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.2.0
21
+ version: 0.4.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.2.0
29
+ version: 0.4.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: mongo
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -51,6 +51,10 @@ extra_rdoc_files: []
51
51
  files:
52
52
  - lib/synapse-mongo.rb
53
53
  - lib/synapse/mongo/version.rb
54
+ - lib/synapse/process_manager/mongo/process_repository.rb
55
+ - lib/synapse/process_manager/mongo/process_document.rb
56
+ - lib/synapse/process_manager/mongo/template.rb
57
+ - lib/synapse/process_manager/mongo.rb
54
58
  - lib/synapse/event_store/mongo/cursor_event_stream.rb
55
59
  - lib/synapse/event_store/mongo/event_store.rb
56
60
  - lib/synapse/event_store/mongo/storage_strategy.rb
@@ -61,6 +65,7 @@ files:
61
65
  - lib/synapse/common/mongo/base_template.rb
62
66
  - lib/synapse/serialization/converter/bson.rb
63
67
  - test/test_helper.rb
68
+ - test/process_manager/mongo/repository_test.rb
64
69
  - test/event_store/mongo/event_store_test.rb
65
70
  - test/common/mongo/base_template_test.rb
66
71
  - test/serialization/converter/bson_test.rb