aquasync_deltas_aggregator 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f34d448bd0a4b0bc443b50e52f5ed4a7e22b7ab1
|
4
|
+
data.tar.gz: 681f923df0c5d4f25174f8b5623b45c255c5637a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb225e95dc1c9082d43418adcaed4fe93610ccc08c99c7847e631d3b2458aaa0521bf8cfa5311d48677187c9c4cfac2d9d75abb105790af3122ad194820238d0
|
7
|
+
data.tar.gz: 1aa12134a5bbe5fa15095e685c87555c5dba66297e702ffee0d0be2018f074aef270b74540f3627334c5f8013a739343578bff9ba1e7112ee1ca4dd1f5d5c1fa
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative '../delta_pack/delta_pack_builder'
|
2
|
+
|
3
|
+
# Has responsibility to
|
4
|
+
# 1. Commit a DeltaPack to registered models.
|
5
|
+
# 2. Pack a DeltaPack from registered models.
|
6
|
+
# @author kaiinui
|
7
|
+
# @example Initialization
|
8
|
+
# aggregator = DeltasAggregator.new
|
9
|
+
# aggregator.regist_model_manager(Book, Author)
|
10
|
+
# @example Obtain a DeltaPack from registered models.
|
11
|
+
# aggregator.pack_deltas
|
12
|
+
# @example Commit a DeltaPack to registered models.
|
13
|
+
# aggregator.unpack_and_commit_delta_pack(delta_pack)
|
14
|
+
# @note Please implement #aq_deltas and #aq_commit_deltas to models. (DeltasAggregator requirement.)
|
15
|
+
class DeltasAggregator
|
16
|
+
attr_accessor :model_managers
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
self.model_managers = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adds target models to aggregate.
|
23
|
+
# @param klass [Aquasync::Base]
|
24
|
+
# @return [NilClass]
|
25
|
+
def regist_model_manager(*klasses)
|
26
|
+
klasses.each do |klass|
|
27
|
+
name = klass.name
|
28
|
+
model_managers[name] = klass
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns registered model manager from name.
|
33
|
+
# @param [String] name
|
34
|
+
# @return [Aquasync::Base]
|
35
|
+
def model_manager_class(name)
|
36
|
+
model_managers[name]
|
37
|
+
end
|
38
|
+
|
39
|
+
# Unpacks a DeltaPack and delegates #aq_commit_deltas to registered model managers.
|
40
|
+
# @param [Hash] A DeltaPack (https://github.com/AQAquamarine/aquasync-protocol/blob/master/deltapack.md)
|
41
|
+
# @return [NilClass]
|
42
|
+
def commit_delta_pack(delta_pack)
|
43
|
+
unpacked_deltas = DeltaPackUnpacker.new.unpack(delta_pack).deltas
|
44
|
+
unpacked_deltas.each do |model_name, deltas|
|
45
|
+
manager = model_manager_class(model_name)
|
46
|
+
manager.aq_commit_deltas deltas
|
47
|
+
end # [TODO] raise error if any commit failed.
|
48
|
+
end
|
49
|
+
|
50
|
+
# Packs deltas collected from registered model managers via #aq_deltas to DeltaPack.
|
51
|
+
# @param [Integer] from_ust latestUST
|
52
|
+
# @return [Hash] A DeltaPack (https://github.com/AQAquamarine/aquasync-protocol/blob/master/deltapack.md)
|
53
|
+
def pack_deltas(from_ust)
|
54
|
+
builder = DeltaPackBuilder.new
|
55
|
+
model_managers.each do |model_name, model_manager|
|
56
|
+
builder.push_documents model_manager.aq_deltas(from_ust)
|
57
|
+
end
|
58
|
+
builder.delta_pack
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'simple_uuid'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
# Has a responsibility to build a DeltaPack hash.
|
5
|
+
# @author kaiinui
|
6
|
+
# @example
|
7
|
+
# builder = DeltaPackBuilder.new
|
8
|
+
# builder.push_documents(Book.all)
|
9
|
+
# builder.push_documents(Author.all)
|
10
|
+
# builder.delta_pack
|
11
|
+
# @note Please implement #_name and #to_h to Models. (DeltaPackBuilder requirements.)
|
12
|
+
class DeltaPackBuilder
|
13
|
+
# delta_pack [Hash]
|
14
|
+
attr_accessor :delta_pack
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
self.delta_pack = {}
|
18
|
+
self.delta_pack["_id"] = uuid
|
19
|
+
self.delta_pack["latestUST"] = 0
|
20
|
+
end
|
21
|
+
|
22
|
+
# pushes a document into a DeltaPack.
|
23
|
+
# @param document [Aquasync::Base] a resource which inherits Aquasync::Base
|
24
|
+
def push(document)
|
25
|
+
name = document._name
|
26
|
+
initialize_array(name)
|
27
|
+
self.delta_pack[name].push document.to_h
|
28
|
+
update_ust(document)
|
29
|
+
end
|
30
|
+
|
31
|
+
# pushes documents into a DeltaPack.
|
32
|
+
# @param documents [Array] resources which inherits Aquasync::Base
|
33
|
+
def push_documents(documents)
|
34
|
+
documents.each {|d| push(d)}
|
35
|
+
end
|
36
|
+
|
37
|
+
# updates latestUST
|
38
|
+
# @param document [Aquasync::Base]
|
39
|
+
def update_ust(document)
|
40
|
+
if document.ust > latest_ust
|
41
|
+
self.delta_pack["latestUST"] = document.ust
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# returns latestUST of current DeltaPack
|
46
|
+
# @return [Integer]
|
47
|
+
def latest_ust
|
48
|
+
self.delta_pack["latestUST"]
|
49
|
+
end
|
50
|
+
|
51
|
+
# returns built DeltaPack represented in JSON
|
52
|
+
# @return [String] JSON string
|
53
|
+
def json
|
54
|
+
delta_pack.to_json
|
55
|
+
end
|
56
|
+
|
57
|
+
# returns built DeltaPack represented in pretty printed JSON
|
58
|
+
# @return [String] pretty printed JSON
|
59
|
+
def pretty_json
|
60
|
+
JSON.pretty_generate(delta_pack)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# @param [String] name model name
|
66
|
+
def initialize_array(name)
|
67
|
+
self.delta_pack[name] = [] unless self.delta_pack[name]
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [String] UUIDv1
|
71
|
+
def uuid
|
72
|
+
SimpleUUID::UUID.new.to_guid
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Has a responsibility to unpack a DeltaPack hash.
|
2
|
+
# @author kaiinui
|
3
|
+
class DeltaPackUnpacker
|
4
|
+
# id [String] UUID
|
5
|
+
attr_accessor :id
|
6
|
+
# deltas [Array] An array of deltas.
|
7
|
+
attr_accessor :deltas
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.deltas = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
# unpacks a DeltaPack. You can extract data from #id, #deltas
|
14
|
+
# @param delta_pack [Hash] A DeltaPack
|
15
|
+
# @return [DeltaPackUnpacker]
|
16
|
+
def unpack(delta_pack)
|
17
|
+
self.id = delta_pack["_id"].downcase
|
18
|
+
delta_pack.each do |key, value|
|
19
|
+
next if key == "_id"
|
20
|
+
deltas[key] = value
|
21
|
+
end
|
22
|
+
self
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aquasync_deltas_aggregator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kaiinui
|
@@ -99,7 +99,11 @@ email: me@kaiinui.com
|
|
99
99
|
executables: []
|
100
100
|
extensions: []
|
101
101
|
extra_rdoc_files: []
|
102
|
-
files:
|
102
|
+
files:
|
103
|
+
- lib/aggregators/deltas_aggregator.rb
|
104
|
+
- lib/aquasync_deltas_aggregator.rb
|
105
|
+
- lib/delta_pack/delta_pack_builder.rb
|
106
|
+
- lib/delta_pack/delta_pack_unpacker.rb
|
103
107
|
homepage: https://github.com/AQAquamarine/aquasync_deltas_aggregator
|
104
108
|
licenses:
|
105
109
|
- MIT
|