match_reduce 1.0.0.pre.alpha

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.
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ require 'spec_helper'
11
+
12
+ describe MatchReduce::Processor do
13
+ def make_sum_reducer(key)
14
+ return nil if key.to_s.empty?
15
+
16
+ ->(memo, record, resolver) { memo.to_i + resolver.get(record, key).to_i }
17
+ end
18
+
19
+ def snapshot(snapshot)
20
+ records = snapshot.fetch('records', [])
21
+ aggregates = snapshot.fetch('aggregates', []).map do |a|
22
+ {
23
+ name: a['name'],
24
+ patterns: a['patterns'],
25
+ reducer: make_sum_reducer(a['sum_reducer_key']),
26
+ group_keys: a['group_keys']
27
+ }
28
+ end
29
+
30
+ results = snapshot.fetch('results', []).map do |r|
31
+ MatchReduce::Processor::Result.new(r['name'], r['records'], r['value'])
32
+ end
33
+
34
+ OpenStruct.new(
35
+ records: records,
36
+ aggregates: aggregates,
37
+ results: results
38
+ )
39
+ end
40
+
41
+ let(:resolver) { Objectable.resolver }
42
+
43
+ describe 'snapshots' do
44
+ yaml_fixture_files('snapshots', 'processor').each_pair do |filename, snapshot_config|
45
+ specify File.basename(filename) do
46
+ example = snapshot(snapshot_config)
47
+
48
+ subject = described_class.new(example.aggregates, resolver)
49
+
50
+ results = subject.add_each(example.records).results
51
+
52
+ err_msg = "invalid: #{example.results.length} results != #{example.aggregates.length} aggs"
53
+
54
+ expect(example.results.length).to eq(example.aggregates.length), err_msg
55
+
56
+ results.each_with_index do |result, i|
57
+ expect(result).to eq(example.results[i])
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2019-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ require 'spec_helper'
11
+
12
+ class ProcessorMock
13
+ def initialize(_aggregates, _resolver); end
14
+
15
+ def add_each(_records)
16
+ self
17
+ end
18
+
19
+ def results
20
+ []
21
+ end
22
+ end
23
+
24
+ describe MatchReduce do
25
+ specify '#process should create new Processor, call add_each, then call results' do
26
+ resolver = nil
27
+ aggregates = []
28
+ records = []
29
+ results = []
30
+
31
+ processor = ProcessorMock.new(aggregates, resolver)
32
+
33
+ expect(MatchReduce::Processor).to receive(:new).with(aggregates, resolver).and_return(processor)
34
+ expect(processor).to receive(:add_each).with(records).and_return(processor)
35
+ expect(processor).to receive(:results).and_return(results)
36
+
37
+ described_class.process(aggregates, records, resolver)
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (c) 2018-present, Blue Marble Payroll, LLC
5
+ #
6
+ # This source code is licensed under the MIT license found in the
7
+ # LICENSE file in the root directory of this source tree.
8
+ #
9
+
10
+ require 'pry'
11
+ require 'yaml'
12
+
13
+ unless ENV['DISABLE_SIMPLECOV'] == 'true'
14
+ require 'simplecov'
15
+ require 'simplecov-console'
16
+
17
+ SimpleCov.formatter = SimpleCov::Formatter::Console
18
+ SimpleCov.start do
19
+ add_filter %r{\A/spec/}
20
+ end
21
+ end
22
+
23
+ require './lib/match_reduce'
24
+
25
+ def fixture_path(*filename)
26
+ File.join('spec', 'fixtures', filename)
27
+ end
28
+
29
+ def yaml_fixture(*filename)
30
+ YAML.safe_load(fixture(*filename))
31
+ end
32
+
33
+ def fixture(*filename)
34
+ File.open(fixture_path(*filename), 'r:bom|utf-8').read
35
+ end
36
+
37
+ def yaml_read(filename)
38
+ YAML.safe_load(read(filename))
39
+ end
40
+
41
+ def read(filename)
42
+ File.open(filename, 'r:bom|utf-8').read
43
+ end
44
+
45
+ def yaml_fixture_files(*directory)
46
+ Dir[fixture_path(*directory, '*.yaml')].map do |filename|
47
+ [
48
+ filename,
49
+ yaml_read(filename)
50
+ ]
51
+ end.to_h
52
+ end
metadata ADDED
@@ -0,0 +1,232 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: match_reduce
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre.alpha
5
+ platform: ruby
6
+ authors:
7
+ - Matthew Ruggio
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-09-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: acts_as_hashable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.1.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: hash_math
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.0.0.pre.alpha
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.0.pre.alpha
47
+ - !ruby/object:Gem::Dependency
48
+ name: objectable
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: guard-rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.7'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '4.7'
75
+ - !ruby/object:Gem::Dependency
76
+ name: pry
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rake
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '12'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '12'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 0.74.0
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: 0.74.0
131
+ - !ruby/object:Gem::Dependency
132
+ name: simplecov
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 0.17.0
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 0.17.0
145
+ - !ruby/object:Gem::Dependency
146
+ name: simplecov-console
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: 0.5.0
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 0.5.0
159
+ description: " High speed data aggregator and reducer algorithm based on key-value
160
+ exact matching and grouping.\n"
161
+ email:
162
+ - mruggio@bluemarblepayroll.com
163
+ executables:
164
+ - console
165
+ extensions: []
166
+ extra_rdoc_files: []
167
+ files:
168
+ - ".editorconfig"
169
+ - ".gitignore"
170
+ - ".rubocop.yml"
171
+ - ".ruby-version"
172
+ - ".travis.yml"
173
+ - CHANGELOG.md
174
+ - CODE_OF_CONDUCT.md
175
+ - Gemfile
176
+ - Guardfile
177
+ - LICENSE
178
+ - README.md
179
+ - Rakefile
180
+ - bin/console
181
+ - lib/match_reduce.rb
182
+ - lib/match_reduce/aggregate.rb
183
+ - lib/match_reduce/any.rb
184
+ - lib/match_reduce/index.rb
185
+ - lib/match_reduce/processor.rb
186
+ - lib/match_reduce/processor/result.rb
187
+ - lib/match_reduce/processor/result_builder.rb
188
+ - lib/match_reduce/processor/results_builder.rb
189
+ - lib/match_reduce/version.rb
190
+ - match_reduce.gemspec
191
+ - spec/fixtures/snapshots/processor/abstract.yaml
192
+ - spec/fixtures/snapshots/processor/teams_and_players.yaml
193
+ - spec/match_reduce/aggregate_spec.rb
194
+ - spec/match_reduce/any_spec.rb
195
+ - spec/match_reduce/index_spec.rb
196
+ - spec/match_reduce/processor/result_spec.rb
197
+ - spec/match_reduce/processor_spec.rb
198
+ - spec/match_reduce_spec.rb
199
+ - spec/spec_helper.rb
200
+ homepage: https://github.com/bluemarblepayroll/match_reduce
201
+ licenses:
202
+ - MIT
203
+ metadata: {}
204
+ post_install_message:
205
+ rdoc_options: []
206
+ require_paths:
207
+ - lib
208
+ required_ruby_version: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: 2.3.8
213
+ required_rubygems_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">"
216
+ - !ruby/object:Gem::Version
217
+ version: 1.3.1
218
+ requirements: []
219
+ rubygems_version: 3.0.3
220
+ signing_key:
221
+ specification_version: 4
222
+ summary: Dataset aggregation and reducer algorithm
223
+ test_files:
224
+ - spec/fixtures/snapshots/processor/abstract.yaml
225
+ - spec/fixtures/snapshots/processor/teams_and_players.yaml
226
+ - spec/match_reduce/aggregate_spec.rb
227
+ - spec/match_reduce/any_spec.rb
228
+ - spec/match_reduce/index_spec.rb
229
+ - spec/match_reduce/processor/result_spec.rb
230
+ - spec/match_reduce/processor_spec.rb
231
+ - spec/match_reduce_spec.rb
232
+ - spec/spec_helper.rb