mongoid-report 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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