mongoid-report 0.1.6 → 0.1.7

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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Nzk0NTgwOTk3NDY5NjYzNzQ4YjM5NmQ1NjVlNTI2ZGI1YTA0NDcwMg==
4
+ ZDE4ZGZlZmJmOWFmMDJkNjY5Yjk3YTRmY2FlMjMwZGVlOTQzNzY4Nw==
5
5
  data.tar.gz: !binary |-
6
- YjNjYmU3MjIxNzQxOGFlM2JlYzBjZjQ1OWNhYTM0MWNkMDc5ZjQyYw==
6
+ MTZkNzhlMTkzNTQxZWY0ZmNlMzc4YmQzM2IxMmIyZjJlOWE1ZGEwNA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MGE2NTQ1M2EyYWQzYjcxMDZiNzFiNTM2YjJkYTAyMWI3NjJjMmZiYWVlYTdk
10
- NDAxZjI0YWY3NWVmMzY2Zjc2N2ZiZDcyYmI5NzQ0NWQ0YjMwOTYyMzM2NWZm
11
- NDc2Mzg5MTJlNGE4MjYyNWRmYTA4ZmMxMDE0OTRiMGI1NTNlOTY=
9
+ MDU4NDgwNDc2ZmM2MjRiMmFmYzkxZmM2ODBkNWRjNzY2NDIxOTE3YjQzNjBh
10
+ YmJkNDMxYjgyZWQ5NTRkNzJlNGUwZDdmYjU3MjQzZTc2ZjkzMTMwMTAyZDQw
11
+ OTYwZmJiYzc3Y2FjYjAzZGNhZDNkODA0M2U0NjNhYTY4NmU4NmM=
12
12
  data.tar.gz: !binary |-
13
- ODZhMDdjOTk2YWRkOGQyM2FkZTlhZTdiMzBiYzM5NmFjN2MzM2ZkNWI3NzJh
14
- M2VlZmFkNjUzNmZlMGM5YzZiM2Q1YTkzOGZjYzNhZGNjN2MwMGIyNGEyZWVj
15
- MzVmMDVlMTE1MWY0Njk1ZWVjNDg5ZGNmNTBmOTNiODcyYTgwNjA=
13
+ MTNiMjcyZGZmMzZkNTIzZTI4MGVjZGQ2OTY4ZDBjMTY1ODAwOWVlNDI3MjM4
14
+ ODVmMmQwNTUxMDNhOWY0M2NjOWNlOWY0MTBlYTVjNTkyNWQ3YTc1NTFkOTU5
15
+ NWE3OTBmNGU3MTNjOWJjYzUxYjVkNjU2OGI5ZmE4NjNiYTA0MjY=
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongoid-report (0.1.6)
4
+ mongoid-report (0.1.7)
5
5
  mongoid (> 3.0.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -21,14 +21,14 @@ framework.
21
21
  class Report1
22
22
  include Mongoid::Report
23
23
 
24
- aggregation_field :field1, for: Model
24
+ column :field1, for: Model
25
25
  end
26
26
 
27
27
  class Report2
28
28
  include Mongoid::Report
29
29
 
30
30
  attach_to Model do
31
- aggregation_field :field1
31
+ column :field1
32
32
  end
33
33
  end
34
34
 
@@ -37,7 +37,7 @@ framework.
37
37
 
38
38
  group_by :day, for: Model
39
39
 
40
- aggregation_field :field1, for: Model
40
+ column :field1, for: Model
41
41
  end
42
42
 
43
43
  class Report4
@@ -46,7 +46,7 @@ framework.
46
46
  attach_to Model do
47
47
  group_by :day
48
48
 
49
- aggregation_field :field1
49
+ column :field1
50
50
  end
51
51
  end
52
52
 
@@ -56,7 +56,7 @@ framework.
56
56
  attach_to Model, as: 'summary-report' do
57
57
  group_by :day
58
58
 
59
- aggregation_field :field1
59
+ column :field1
60
60
  end
61
61
  end
62
62
  ```
@@ -51,6 +51,10 @@ module Mongoid
51
51
  report_module_settings[klass][:queries]
52
52
  end
53
53
 
54
+ def mapping(klass)
55
+ report_module_settings[klass][:mapping]
56
+ end
57
+
54
58
  # We should pass here mongoid document
55
59
  def aggregate_for(report_name)
56
60
  Scope.new(self, report_name)
@@ -87,11 +91,11 @@ module Mongoid
87
91
 
88
92
  def group_by(*fields)
89
93
  define_report_method(*fields) do |groups, report_name, _|
90
- settings[report_name][:group_by] = groups
94
+ settings[report_name][:group_by] = groups.map(&:to_s)
91
95
  end
92
96
  end
93
97
 
94
- def aggregation_field(*fields)
98
+ def column(*fields)
95
99
  define_report_method(*fields) do |columns, report_name, options|
96
100
  columns.each do |column|
97
101
  name = options.fetch(:as) { column }
@@ -100,13 +104,21 @@ module Mongoid
100
104
  end
101
105
  end
102
106
 
103
- def column(*fields)
104
- # Because of representing fields as hash instead of columns we should
105
- # have the last variable as columns.
107
+ def columns(*fields)
106
108
  define_report_method(*fields) do |_, report_name, columns|
107
- columns.each do |name, function|
108
- add_column(report_name, name, function)
109
+ self.settings[report_name][:columns] = columns.stringify_keys!
110
+ end
111
+ end
112
+
113
+ def mapping(*fields)
114
+ define_report_method(*fields) do |_, report_name, mapping|
115
+ mapping.stringify_keys!
116
+
117
+ mapping.each do |key, value|
118
+ mapping[key] = value.to_s
109
119
  end
120
+
121
+ self.settings[report_name][:mapping] = mapping
110
122
  end
111
123
  end
112
124
 
@@ -153,20 +165,16 @@ module Mongoid
153
165
  fields: ActiveSupport::OrderedHash.new,
154
166
  group_by: [],
155
167
  queries: [],
168
+ columns: {},
169
+ mapping: {},
156
170
  compiled: false,
157
- columns: ActiveSupport::OrderedHash.new,
158
171
  }
159
172
  end
160
173
  end
161
174
 
162
175
  def add_field(attach_name, field, name)
163
- settings[attach_name][:fields][field] = name
176
+ settings[attach_name][:fields][field.to_s] = name.to_s
164
177
  end
165
-
166
- def add_column(attach_name, name, function)
167
- settings[attach_name][:columns][name] = function
168
- end
169
-
170
178
  end
171
179
 
172
180
  end
@@ -11,28 +11,34 @@ module Mongoid
11
11
  super(context, collection, options)
12
12
  end
13
13
 
14
- def aggregation_field(*fields)
14
+ def columns(*fields)
15
15
  proxy_options = fields.extract_options!
16
16
  proxy_options.merge!(options)
17
- context.aggregation_field(*fields, proxy_options)
17
+ context.columns(*fields, proxy_options)
18
18
  end
19
19
 
20
- def group_by(*fields)
20
+ def column(*fields)
21
21
  proxy_options = fields.extract_options!
22
22
  proxy_options.merge!(options)
23
- context.group_by(*fields, proxy_options)
23
+ context.column(*fields, proxy_options)
24
24
  end
25
25
 
26
- def filter(*fields)
26
+ def mapping(*fields)
27
27
  proxy_options = fields.extract_options!
28
28
  proxy_options.merge!(options)
29
- context.filter(*fields, proxy_options)
29
+ context.mapping(*fields, proxy_options)
30
30
  end
31
31
 
32
- def column(*fields)
32
+ def group_by(*fields)
33
33
  proxy_options = fields.extract_options!
34
34
  proxy_options.merge!(options)
35
- context.column(*fields, proxy_options)
35
+ context.group_by(*fields, proxy_options)
36
+ end
37
+
38
+ def filter(*fields)
39
+ proxy_options = fields.extract_options!
40
+ proxy_options.merge!(options)
41
+ context.filter(*fields, proxy_options)
36
42
  end
37
43
  end
38
44
 
@@ -9,41 +9,44 @@ module Mongoid
9
9
  @rows = rows
10
10
  @fields = fields
11
11
  @columns = columns
12
-
13
- # Apply dyncamic columns in context of row and apply indifferent access
14
- # for the rows.
15
- rows = compile_dynamic_fields(rows, columns)
12
+ @rows = compile_rows
16
13
 
17
14
  # Collection should behave like Array using delegator method.
18
- super(rows)
15
+ super(@rows)
19
16
  end
20
17
 
21
- def summary
22
- @summary ||= reduce(Hash.new{|h, k| h[k] = 0}) do |summary, row|
23
- @fields.each do |field|
24
- next if @columns.has_key?(field.to_s)
25
- summary[field] += row[field.to_s]
26
- end
27
-
18
+ def compile_rows
19
+ @rows.map do |row|
28
20
  @columns.each do |name, function|
29
- summary[name] = function.call(@context, row)
21
+ next unless @fields.include?(name)
22
+ row[name] = function.call(@context, row, { summary: false })
30
23
  end
31
24
 
32
- summary
33
- end.with_indifferent_access
25
+ row
26
+ end
34
27
  end
35
28
 
36
- private
29
+ def summary
30
+ @summary ||= reduce(Hash.new{|h, k| h[k] = 0}) do |summary, row|
31
+ # Find summary for aggregated rows
32
+ @fields.each do |field|
33
+ # Don't apply for dynamic calculated columns lets wait until we get
34
+ # all summaried mongo columns and then apply dynamic columns
35
+ # calculations.
36
+ next if @columns.has_key?(field)
37
+ summary[field] += row[field]
38
+ end
37
39
 
38
- def compile_dynamic_fields(rows, columns)
39
- rows.map do |row|
40
+ # Apply dynamic columns for summarized row
40
41
  @columns.each do |name, function|
41
- row[name] = function.call(@context, row)
42
+ next unless @fields.include?(name)
43
+ summary[name] = function.call(@context, row, { summary: true })
42
44
  end
43
45
 
44
- row.with_indifferent_access
46
+ summary
45
47
  end
46
48
  end
49
+
47
50
  end
48
51
 
49
52
  end
@@ -17,7 +17,9 @@ module Mongoid
17
17
  end
18
18
 
19
19
  def fields
20
- @fields ||= settings[:fields]
20
+ @fields ||= settings[:fields].select do |field, _|
21
+ !settings[:columns].include?(field.to_sym)
22
+ end
21
23
  end
22
24
 
23
25
  def in_fields
@@ -38,6 +38,7 @@ module Mongoid
38
38
  if value.respond_to?(:call)
39
39
  value = value.call(context)
40
40
  end
41
+
41
42
  new_query[function_name][name] = value
42
43
  end
43
44
  end
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Report
3
- VERSION = "0.1.6"
3
+ VERSION = "0.1.7"
4
4
  end
5
5
  end
@@ -12,7 +12,7 @@ describe Mongoid::Report do
12
12
  include Mongoid::Report
13
13
 
14
14
  attach_to Model do
15
- aggregation_field :field1
15
+ column :field1
16
16
  end
17
17
  end
18
18
 
@@ -33,7 +33,12 @@ describe Mongoid::Report do
33
33
  klass.create!(day: today , field1: 1)
34
34
  klass.create!(day: yesterday , field1: 1)
35
35
 
36
- example = Report3.new
36
+ Report = Class.new do
37
+ include Mongoid::Report
38
+ group_by :day, for: Model
39
+ column :field1, for: Model
40
+ end
41
+ example = Report.new
37
42
 
38
43
  rows = example.aggregate_for(klass)
39
44
  rows = rows.all
@@ -52,7 +57,13 @@ describe Mongoid::Report do
52
57
  klass.create(day: two_days_ago , field1: 1 , field2: 2)
53
58
  klass.create(day: today , field1: 1 , field2: 3)
54
59
 
55
- example = Report3.new
60
+ Report = Class.new do
61
+ include Mongoid::Report
62
+ group_by :day, for: Model
63
+ column :field1, for: Model
64
+ end
65
+ example = Report.new
66
+
56
67
  scope = example.aggregate_for(Model)
57
68
  scope = scope.query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } })
58
69
  scope = scope.query('$match' => { :field2 => 2 })
@@ -71,7 +82,13 @@ describe Mongoid::Report do
71
82
  it 'skips empty match in query' do
72
83
  klass.create(day: today , field1: 1 , field2: 2)
73
84
 
74
- example = Report3.new
85
+ Report = Class.new do
86
+ include Mongoid::Report
87
+ group_by :day, for: Model
88
+ column :field1, for: Model
89
+ end
90
+ example = Report.new
91
+
75
92
  scope = example.aggregate_for(Model)
76
93
  scope = scope.query()
77
94
  scope = scope.query({})
@@ -84,20 +101,6 @@ describe Mongoid::Report do
84
101
  end
85
102
  end
86
103
 
87
- class Report7
88
- include Mongoid::Report
89
-
90
- attach_to Model, as: 'example1' do
91
- group_by :day
92
- aggregation_field :field1
93
- end
94
-
95
- attach_to Model, as: 'example2' do
96
- group_by :day
97
- aggregation_field :field2
98
- end
99
- end
100
-
101
104
  describe '.aggregate' do
102
105
  it 'aggregates all defined groups in the report class' do
103
106
  klass.create(day: today , field1: 1 , field2: 2)
@@ -105,7 +108,21 @@ describe Mongoid::Report do
105
108
  klass.create(day: yesterday , field1: 1 , field2: 2)
106
109
  klass.create(day: two_days_ago , field1: 1 , field2: 2)
107
110
 
108
- example = Report7.new
111
+ Report = Class.new do
112
+ include Mongoid::Report
113
+
114
+ attach_to Model, as: 'example1' do
115
+ group_by :day
116
+ column :field1
117
+ end
118
+
119
+ attach_to Model, as: 'example2' do
120
+ group_by :day
121
+ column :field2
122
+ end
123
+ end
124
+
125
+ example = Report.new
109
126
  scope = example.aggregate
110
127
  scope
111
128
  .query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } })
@@ -128,29 +145,29 @@ describe Mongoid::Report do
128
145
  expect(rows[1]['day']).to eq(yesterday)
129
146
  end
130
147
 
131
- class Report8
132
- include Mongoid::Report
133
-
134
- report 'example' do
135
- attach_to Model, as: 'model1' do
136
- group_by :day
137
- aggregation_field :field1
138
- end
139
-
140
- attach_to Model, as: 'model2' do
141
- group_by :day
142
- aggregation_field :field2
143
- end
144
- end
145
- end
146
-
147
148
  it 'should still aggregate with combined report' do
148
149
  klass.create(day: today , field1: 1 , field2: 2)
149
150
  klass.create(day: today , field1: 1 , field2: 2)
150
151
  klass.create(day: yesterday , field1: 1 , field2: 2)
151
152
  klass.create(day: two_days_ago , field1: 1 , field2: 2)
152
153
 
153
- example = Report8.new
154
+ Report = Class.new do
155
+ include Mongoid::Report
156
+
157
+ report 'example' do
158
+ attach_to Model, as: 'model1' do
159
+ group_by :day
160
+ column :field1
161
+ end
162
+
163
+ attach_to Model, as: 'model2' do
164
+ group_by :day
165
+ column :field2
166
+ end
167
+ end
168
+ end
169
+ example = Report.new
170
+
154
171
  scope = example.aggregate
155
172
  scope
156
173
  .query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } })
@@ -173,29 +190,29 @@ describe Mongoid::Report do
173
190
  expect(rows[1]['day']).to eq(yesterday)
174
191
  end
175
192
 
176
- class Report11
177
- include Mongoid::Report
178
-
179
- report 'example' do
180
- attach_to Model, as: 'model1' do
181
- group_by :day
182
- aggregation_field :field1, as: 'new-field1'
183
- end
184
-
185
- attach_to Model, as: 'model2' do
186
- group_by :day
187
- aggregation_field :field2
188
- end
189
- end
190
- end
191
-
192
193
  it 'should still aggregate with combined report and project using the new names' do
193
194
  klass.create(day: today , field1: 1 , field2: 2)
194
195
  klass.create(day: today , field1: 1 , field2: 2)
195
196
  klass.create(day: yesterday , field1: 1 , field2: 2)
196
197
  klass.create(day: two_days_ago , field1: 1 , field2: 2)
197
198
 
198
- example = Report11.new
199
+ Report = Class.new do
200
+ include Mongoid::Report
201
+
202
+ report 'example' do
203
+ attach_to Model, as: 'model1' do
204
+ group_by :day
205
+ column :field1, as: 'new-field1'
206
+ end
207
+
208
+ attach_to Model, as: 'model2' do
209
+ group_by :day
210
+ column :field2
211
+ end
212
+ end
213
+ end
214
+ example = Report.new
215
+
199
216
  scope = example.aggregate
200
217
  scope
201
218
  .query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } })
@@ -219,19 +236,19 @@ describe Mongoid::Report do
219
236
  end
220
237
  end
221
238
 
222
- class Report15
223
- include Mongoid::Report
224
-
225
- filter field2: 2, for: Model
226
- aggregation_field :field1, for: Model
227
- end
228
-
229
239
  describe '.filter' do
230
240
  it 'creates filter' do
231
241
  klass.create(field1: 1, field2: 2)
232
242
  klass.create(field1: 3, field2: 4)
233
243
 
234
- example = Report15.new
244
+ Report = Class.new do
245
+ include Mongoid::Report
246
+
247
+ filter field2: 2, for: Model
248
+ column :field1, for: Model
249
+ end
250
+ example = Report.new
251
+
235
252
  scope = example.aggregate
236
253
  scope = scope.all
237
254
 
@@ -240,22 +257,22 @@ describe Mongoid::Report do
240
257
  expect(rows[0]['field1']).to eq(1)
241
258
  end
242
259
 
243
- class Report16
244
- include Mongoid::Report
245
-
246
- report 'example' do
247
- attach_to Model do
248
- filter field2: 2
249
- aggregation_field :field1
250
- end
251
- end
252
- end
253
-
254
260
  it 'creates filter in report scope' do
255
261
  klass.create(field1: 1, field2: 2)
256
262
  klass.create(field1: 3, field2: 4)
257
263
 
258
- example = Report16.new
264
+ Report = Class.new do
265
+ include Mongoid::Report
266
+
267
+ report 'example' do
268
+ attach_to Model do
269
+ filter field2: 2
270
+ column :field1
271
+ end
272
+ end
273
+ end
274
+
275
+ example = Report.new
259
276
  scope = example.aggregate
260
277
  scope = scope.all
261
278
 
@@ -264,24 +281,24 @@ describe Mongoid::Report do
264
281
  expect(rows[0]['field1']).to eq(1)
265
282
  end
266
283
 
267
- class Report17
268
- include Mongoid::Report
269
-
270
- report 'example' do
271
- attach_to Model do
272
- filter field2: 2,
273
- day: ->(context) { Date.parse("20-12-2004").mongoize }
274
- aggregation_field :field1
275
- end
276
- end
277
- end
278
-
279
284
  it 'creates filter in report scope' do
280
285
  klass.create(day: today , field1: 1 , field2: 2)
281
286
  klass.create(day: yesterday , field1: 1 , field2: 2)
282
287
  klass.create(day: today , field1: 3 , field2: 4)
283
288
 
284
- example = Report17.new
289
+ Report = Class.new do
290
+ include Mongoid::Report
291
+
292
+ report 'example' do
293
+ attach_to Model do
294
+ filter field2: 2,
295
+ day: ->(context) { Date.parse("20-12-2004").mongoize }
296
+ column :field1
297
+ end
298
+ end
299
+ end
300
+ example = Report.new
301
+
285
302
  scope = example.aggregate
286
303
  scope = scope.all
287
304
 
@@ -290,29 +307,29 @@ describe Mongoid::Report do
290
307
  expect(rows[0]['field1']).to eq(1)
291
308
  end
292
309
 
293
- class Report18
294
- include Mongoid::Report
295
-
296
- def values
297
- [1, 2]
298
- end
299
-
300
- report 'example' do
301
- attach_to Model do
302
- group_by :day
303
- filter field2: ->(context) { { '$in' => context.values } }
304
- aggregation_field :field1
305
- end
306
- end
307
- end
308
-
309
310
  it 'creates filter in report scope' do
310
311
  klass.create(day: today , field1: 1 , field2: 2)
311
312
  klass.create(day: today , field1: 1 , field2: 2)
312
313
  klass.create(day: yesterday , field1: 1 , field2: 2)
313
314
  klass.create(day: today , field1: 3 , field2: 4)
314
315
 
315
- example = Report18.new
316
+ Report = Class.new do
317
+ include Mongoid::Report
318
+
319
+ def values
320
+ [1, 2]
321
+ end
322
+
323
+ report 'example' do
324
+ attach_to Model do
325
+ group_by :day
326
+ filter field2: ->(context) { { '$in' => context.values } }
327
+ column :field1
328
+ end
329
+ end
330
+ end
331
+ example = Report.new
332
+
316
333
  scope = example.aggregate
317
334
  scope = scope.all
318
335
 
@@ -12,8 +12,8 @@ describe Mongoid::Report do
12
12
  report 'example' do
13
13
  attach_to Model do
14
14
  group_by :day
15
- aggregation_field :field1
16
- column 'dynamic-field1' => ->(context, row) { row['field1'] * 10 }
15
+ columns :'dynamic-field1' => ->(context, row, options) { row['field1'] * 10 }
16
+ column :field1, :'dynamic-field1'
17
17
  end
18
18
  end
19
19
  end
@@ -4,44 +4,60 @@ describe Mongoid::Report::QueriesBuilder do
4
4
 
5
5
  describe '.queries' do
6
6
  it 'builds queries for aggregation' do
7
- queries = Report1.new.queries(Model)
7
+ Report = Class.new do
8
+ include Mongoid::Report
9
+ column :field1, for: Model
10
+ end
11
+ report = Report.new
12
+
13
+ queries = report.queries(Model)
8
14
  expect(queries.size).to eq(3)
9
15
  expect(queries[0]).to eq(
10
16
  '$project' => {
11
17
  :_id => 1,
12
- :field1 => 1,
18
+ 'field1' => 1,
13
19
  })
14
20
  expect(queries[1]).to eq(
15
21
  '$group' => {
16
22
  :_id => { },
17
- :field1 => { '$sum' => '$field1' },
23
+ 'field1' => { '$sum' => '$field1' },
18
24
  })
19
25
  expect(queries[2]).to eq(
20
26
  '$project' => {
21
27
  :_id => 0,
22
- :field1 => '$field1',
28
+ 'field1' => '$field1',
23
29
  })
24
30
  end
25
31
 
26
32
  it 'builds queries using custom one group' do
27
- queries = Report4.new.queries(Model)
33
+ Report = Class.new do
34
+ include Mongoid::Report
35
+
36
+ attach_to Model do
37
+ group_by :day
38
+ column :field1
39
+ end
40
+ end
41
+ report = Report.new
42
+
43
+ queries = report.queries(Model)
28
44
  expect(queries.size).to eq(3)
29
45
  expect(queries[0]).to eq(
30
46
  '$project' => {
31
- :_id => 1,
32
- :field1 => 1,
33
- :day => 1,
47
+ :_id => 1,
48
+ 'field1' => 1,
49
+ 'day' => 1,
34
50
  })
35
51
  expect(queries[1]).to eq(
36
52
  '$group' => {
37
- :_id => { :day => '$day' },
38
- :field1 => { '$sum' => '$field1' },
53
+ :_id => { 'day' => '$day' },
54
+ 'field1' => { '$sum' => '$field1' },
39
55
  })
40
56
  expect(queries[2]).to eq(
41
57
  '$project' => {
42
- :_id => 0,
43
- :day => '$_id.day',
44
- :field1 => '$field1',
58
+ :_id => 0,
59
+ 'day' => '$_id.day',
60
+ 'field1' => '$field1',
45
61
  })
46
62
  end
47
63
 
@@ -51,7 +67,7 @@ describe Mongoid::Report::QueriesBuilder do
51
67
  attach_to Model do
52
68
  group_by :day, :field2
53
69
 
54
- aggregation_field :field1, :field3
70
+ column :field1, :field3
55
71
  end
56
72
  end
57
73
 
@@ -60,25 +76,25 @@ describe Mongoid::Report::QueriesBuilder do
60
76
  expect(queries.size).to eq(3)
61
77
  expect(queries[0]).to eq(
62
78
  '$project' => {
63
- :_id => 1,
64
- :field1 => 1,
65
- :field3 => 1,
66
- :day => 1,
67
- :field2 => 1,
79
+ :_id => 1,
80
+ 'field1' => 1,
81
+ 'field3' => 1,
82
+ 'day' => 1,
83
+ 'field2' => 1,
68
84
  })
69
85
  expect(queries[1]).to eq(
70
86
  '$group' => {
71
- :_id => { :day => '$day', :field2 => '$field2' },
72
- :field1 => { '$sum' => '$field1' },
73
- :field3 => { '$sum' => '$field3' },
87
+ :_id => { 'day' => '$day', 'field2' => '$field2' },
88
+ 'field1' => { '$sum' => '$field1' },
89
+ 'field3' => { '$sum' => '$field3' },
74
90
  })
75
91
  expect(queries[2]).to eq(
76
92
  '$project' => {
77
- :_id => 0,
78
- :day => '$_id.day',
79
- :field2 => '$_id.field2',
80
- :field1 => '$field1',
81
- :field3 => '$field3',
93
+ :_id => 0,
94
+ 'day' => '$_id.day',
95
+ 'field2' => '$_id.field2',
96
+ 'field1' => '$field1',
97
+ 'field3' => '$field3',
82
98
  })
83
99
  end
84
100
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongoid::Report do
4
+ let(:klass) { Model }
5
+
6
+ it 'allows to save options per report and attached model' do
7
+ 2.times { klass.create!(field1: 1) }
8
+
9
+ Report = Class.new do
10
+ include Mongoid::Report
11
+
12
+ report 'example' do
13
+ attach_to Model do
14
+ columns :'new-field' => ->(context, row, options) { row[context.mapping('example-models')['field3'].to_s] }
15
+ mapping :'field3' => :field1
16
+
17
+ column :field1, :'new-field'
18
+ end
19
+ end
20
+ end
21
+ example = Report.new
22
+
23
+ rows = example.aggregate_for('example-models')
24
+ rows = rows.all
25
+
26
+ expect(rows.size).to eq(1)
27
+ expect(rows[0]['field1']).to eq(2)
28
+ expect(rows[0]['new-field']).to eq(2)
29
+ end
30
+ end
@@ -12,12 +12,17 @@ describe Mongoid::Report do
12
12
  klass.create!(day: today , field1: 1)
13
13
  klass.create!(day: yesterday , field1: 1)
14
14
 
15
- example = Report3.new
15
+ Report = Class.new do
16
+ include Mongoid::Report
17
+ group_by :day, for: Model
18
+ column :field1, for: Model
19
+ end
20
+ example = Report.new
21
+
16
22
  rows = example.aggregate_for(klass)
17
23
  rows = rows.all
18
24
 
19
25
  expect(rows.count).to eq(2)
20
- expect(rows.summary[:field1]).to eq(3)
21
26
  expect(rows.summary['field1']).to eq(3)
22
27
  end
23
28
 
@@ -25,10 +30,15 @@ describe Mongoid::Report do
25
30
  Report = Class.new do
26
31
  include Mongoid::Report
27
32
 
33
+ COLUMNS = {
34
+ :'new-field1' => ->(context, row, options) { row['field1'] * 10 },
35
+ :'new-field2' => ->(context, row, options) { row['field1'] * 20 },
36
+ }
37
+
28
38
  report 'example' do
29
39
  attach_to Model do
30
- aggregation_field :field1
31
- column 'new-field1' => ->(context, row) { row['field1'] * 10 }
40
+ columns COLUMNS
41
+ column :field1, 'new-field1'
32
42
  end
33
43
  end
34
44
  end
@@ -41,8 +51,13 @@ describe Mongoid::Report do
41
51
  rows = example.aggregate_for('example-models')
42
52
  rows = rows.all
43
53
 
54
+ expect(rows[0].keys.size).to eq(2)
44
55
  expect(rows[0]['field1']).to eq(3)
45
56
  expect(rows[0]['new-field1']).to eq(30)
57
+
58
+ expect(rows.summary.keys.size).to eq(2)
59
+ expect(rows.summary['field1']).to eq(3)
60
+ expect(rows.summary['new-field1']).to eq(30)
46
61
  end
47
62
  end
48
63
 
@@ -9,11 +9,11 @@ describe Mongoid::Report do
9
9
  include Mongoid::Report
10
10
 
11
11
  attach_to Model, as: 'field1-aggregation' do
12
- aggregation_field :field1
12
+ column :field1
13
13
  end
14
14
 
15
15
  attach_to Model, as: 'field2-aggregation' do
16
- aggregation_field :field2
16
+ column :field2
17
17
  end
18
18
  end
19
19
 
@@ -2,89 +2,126 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongoid::Report do
4
4
 
5
- describe '.aggregation_field' do
5
+ describe '.column' do
6
+ let(:report_klass) do
7
+ Class.new do
8
+ include Mongoid::Report
9
+ column :field1, for: Model
10
+ end
11
+ end
12
+
6
13
  it 'defines aggegration settings' do
7
- expect(Report1).to be_respond_to(:settings)
14
+ expect(report_klass).to be_respond_to(:settings)
8
15
  end
9
16
 
10
17
  it 'defines aggregation field for specific model to make queries' do
11
- fields = Report1.fields(Model)
12
- expect(fields).to eq({ field1: :field1 })
18
+ fields = report_klass.fields(Model)
19
+ expect(fields).to eq({ 'field1' => 'field1' })
13
20
  end
14
21
  end
15
22
 
16
- describe '.attach_to' do
23
+ describe '.attach_to' do
24
+ let(:report_klass) do
25
+ Class.new do
26
+ include Mongoid::Report
27
+ attach_to Model do
28
+ column :field1
29
+ end
30
+ end
31
+ end
32
+
17
33
  it 'defines method in report class to attach report to the model' do
18
- expect(Report2).to be_respond_to(:attach_to)
34
+ expect(report_klass).to be_respond_to(:attach_to)
19
35
  end
20
36
 
21
37
  it 'defines field in terms of attached model' do
22
- fields = Report2.fields(Model)
23
- expect(fields).to eq({ field1: :field1 })
38
+ fields = report_klass.fields(Model)
39
+ expect(fields).to eq({ 'field1' => 'field1' })
24
40
  end
25
41
  end
26
42
 
27
43
  describe '.group_by' do
44
+ let(:report_klass1) do
45
+ Class.new do
46
+ include Mongoid::Report
47
+ group_by :day, for: Model
48
+ column :field1, for: Model
49
+ end
50
+ end
51
+
28
52
  it 'defines group by method as class method' do
29
- expect(Report3).to be_respond_to(:group_by)
53
+ expect(report_klass1).to be_respond_to(:group_by)
30
54
  end
31
55
 
32
56
  it 'stores group by settings under report class' do
33
- group_by_settings = Report3.settings[Model][:group_by]
34
- expect(group_by_settings).to eq([:day])
57
+ group_by_settings = report_klass1.settings[Model][:group_by]
58
+ expect(group_by_settings).to eq(['day'])
35
59
  end
36
60
 
37
- it 'defines groups in terms of attached model' do
38
- groups = Report4.groups(Model)
39
- expect(groups).to eq([:day])
61
+ let(:report_klass2) do
62
+ Class.new do
63
+ include Mongoid::Report
64
+ attach_to Model do
65
+ group_by :day
66
+ column :field1
67
+ end
68
+ end
40
69
  end
41
- end
42
-
43
- class Report6
44
- include Mongoid::Report
45
70
 
46
- attach_to Model, as: 'example1' do
47
- aggregation_field :field1
71
+ it 'defines groups in terms of attached model' do
72
+ groups = report_klass2.groups(Model)
73
+ expect(groups).to eq(['day'])
48
74
  end
49
75
  end
50
76
 
51
77
  describe '.as' do
78
+ let(:report_klass) do
79
+ Class.new do
80
+ include Mongoid::Report
81
+ attach_to Model, as: 'example1' do
82
+ column :field1
83
+ end
84
+ end
85
+ end
86
+
52
87
  it 'creates settings with "as" name' do
53
- expect(Report6.settings).to have_key('example1')
88
+ expect(report_klass.settings).to have_key('example1')
54
89
  end
55
90
  end
56
91
 
57
- class Report7
58
- include Mongoid::Report
59
-
60
- report 'example' do
61
- attach_to Model, as: 'model1' do
62
- aggregation_field :field1
63
- end
64
-
65
- attach_to Model do
66
- aggregation_field :field1
92
+ describe '.report' do
93
+ let(:report_klass) do
94
+ Class.new do
95
+ include Mongoid::Report
96
+ report 'example' do
97
+ attach_to Model, as: 'model1' do
98
+ column :field1
99
+ end
100
+
101
+ attach_to Model do
102
+ column :field1
103
+ end
104
+ end
67
105
  end
68
106
  end
69
- end
70
107
 
71
- describe '.report' do
72
108
  it 'creates settings with report-<attached-model-name' do
73
- expect(Report7.settings).to have_key('example-model1')
74
- expect(Report7.settings).to have_key("example-#{Model.collection.name}")
109
+ expect(report_klass.settings).to have_key('example-model1')
110
+ expect(report_klass.settings).to have_key("example-#{Model.collection.name}")
75
111
  end
76
112
  end
77
113
 
78
- class Report10
79
- include Mongoid::Report
80
-
81
- aggregation_field :field1, for: Model, as: 'field-name'
82
- end
114
+ describe '.column `as` option' do
115
+ let(:report_klass) do
116
+ Class.new do
117
+ include Mongoid::Report
118
+ column :field1, for: Model, as: 'field-name'
119
+ end
120
+ end
83
121
 
84
- describe '.aggregation_field `as` option' do
85
122
  it 'creates settings with report-<attached-model-name' do
86
- expect(Report10.fields(Model).keys).to eq([:field1])
87
- expect(Report10.fields(Model).values).to eq(['field-name'])
123
+ expect(report_klass.fields(Model).keys).to eq(['field1'])
124
+ expect(report_klass.fields(Model).values).to eq(['field-name'])
88
125
  end
89
126
  end
90
127
 
@@ -95,7 +132,7 @@ describe Mongoid::Report do
95
132
  include Mongoid::Report
96
133
 
97
134
  attach_to Model do
98
- aggregation_field :field1
135
+ column :field1
99
136
  end
100
137
  end
101
138
 
@@ -103,7 +140,7 @@ describe Mongoid::Report do
103
140
  include Mongoid::Report
104
141
 
105
142
  attach_to Model do
106
- aggregation_field :field2
143
+ column :field2
107
144
  end
108
145
  end
109
146
 
@@ -116,13 +153,13 @@ describe Mongoid::Report do
116
153
 
117
154
  class ReportKlass1 < ReportKlass
118
155
  attach_to Model do
119
- aggregation_field :field1
156
+ column :field1
120
157
  end
121
158
  end
122
159
 
123
160
  class ReportKlass2 < ReportKlass
124
161
  attach_to Model do
125
- aggregation_field :field2
162
+ column :field2
126
163
  end
127
164
  end
128
165
 
@@ -7,35 +7,3 @@ class Model
7
7
 
8
8
  field :day, type: Date
9
9
  end
10
-
11
- class Report1
12
- include Mongoid::Report
13
-
14
- aggregation_field :field1, for: Model
15
- end
16
-
17
- class Report2
18
- include Mongoid::Report
19
-
20
- attach_to Model do
21
- aggregation_field :field1
22
- end
23
- end
24
-
25
- class Report3
26
- include Mongoid::Report
27
-
28
- group_by :day, for: Model
29
-
30
- aggregation_field :field1, for: Model
31
- end
32
-
33
- class Report4
34
- include Mongoid::Report
35
-
36
- attach_to Model do
37
- group_by :day
38
-
39
- aggregation_field :field1
40
- end
41
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-report
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Korsak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-30 00:00:00.000000000 Z
11
+ date: 2014-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -85,6 +85,7 @@ files:
85
85
  - spec/mongoid/report/column_spec.rb
86
86
  - spec/mongoid/report/config_spec.rb
87
87
  - spec/mongoid/report/queries_builder_spec.rb
88
+ - spec/mongoid/report/set_spec.rb
88
89
  - spec/mongoid/report/summary_spec.rb
89
90
  - spec/mongoid/report/threads_spec.rb
90
91
  - spec/mongoid/report_spec.rb
@@ -119,6 +120,7 @@ test_files:
119
120
  - spec/mongoid/report/column_spec.rb
120
121
  - spec/mongoid/report/config_spec.rb
121
122
  - spec/mongoid/report/queries_builder_spec.rb
123
+ - spec/mongoid/report/set_spec.rb
122
124
  - spec/mongoid/report/summary_spec.rb
123
125
  - spec/mongoid/report/threads_spec.rb
124
126
  - spec/mongoid/report_spec.rb