mongoid-report 0.1.9 → 0.2.0
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 +8 -8
- data/Gemfile.lock +30 -18
- data/README.md +6 -36
- data/lib/mongoid/report/attach_proxy.rb +26 -5
- data/lib/mongoid/report/batches.rb +41 -0
- data/lib/mongoid/report/collection.rb +4 -3
- data/lib/mongoid/report/collections.rb +16 -0
- data/lib/mongoid/report/input.rb +17 -0
- data/lib/mongoid/report/merger.rb +29 -0
- data/lib/mongoid/report/output.rb +32 -0
- data/lib/mongoid/report/queries_builder.rb +14 -16
- data/lib/mongoid/report/report_proxy.rb +16 -4
- data/lib/mongoid/report/scope.rb +123 -17
- data/lib/mongoid/report/scope_collection.rb +16 -10
- data/lib/mongoid/report/version.rb +1 -1
- data/lib/mongoid/report.rb +180 -61
- data/spec/mongoid/report/aggregation_spec.rb +72 -57
- data/spec/mongoid/report/attach_to_spec.rb +16 -0
- data/spec/mongoid/report/collection_spec.rb +12 -7
- data/spec/mongoid/report/column_spec.rb +1 -1
- data/spec/mongoid/report/dynamic_attach_to_spec.rb +86 -0
- data/spec/mongoid/report/integration_spec.rb +129 -0
- data/spec/mongoid/report/module_configuration_spec.rb +35 -0
- data/spec/mongoid/report/out_spec.rb +122 -0
- data/spec/mongoid/report/queries_builder_spec.rb +54 -16
- data/spec/mongoid/report/set_spec.rb +3 -3
- data/spec/mongoid/report/summary_spec.rb +87 -16
- data/spec/mongoid/report/threads_spec.rb +132 -4
- data/spec/mongoid/report_spec.rb +58 -34
- data/spec/spec_helper.rb +2 -0
- metadata +17 -2
@@ -8,8 +8,9 @@ describe Mongoid::Report do
|
|
8
8
|
|
9
9
|
describe '.aggregate_for' do
|
10
10
|
it 'aggregates fields by app' do
|
11
|
-
|
11
|
+
report_klass = Class.new do
|
12
12
|
include Mongoid::Report
|
13
|
+
def self.name ; 'report-klass' ; end
|
13
14
|
|
14
15
|
attach_to Model do
|
15
16
|
column :field1
|
@@ -20,10 +21,11 @@ describe Mongoid::Report do
|
|
20
21
|
klass.create!(field1: 1)
|
21
22
|
klass.create!(field1: 1)
|
22
23
|
|
23
|
-
example =
|
24
|
-
report = example.aggregate_for(klass)
|
25
|
-
|
26
|
-
|
24
|
+
example = report_klass.new
|
25
|
+
report = example.aggregate_for('report-klass', 'models')
|
26
|
+
scoped = report.all
|
27
|
+
|
28
|
+
rows = scoped.rows
|
27
29
|
|
28
30
|
expect(rows.size).to eq(1)
|
29
31
|
expect(rows[0]['field1']).to eq(3)
|
@@ -34,14 +36,16 @@ describe Mongoid::Report do
|
|
34
36
|
klass.create!(day: today , field1: 1)
|
35
37
|
klass.create!(day: yesterday , field1: 1)
|
36
38
|
|
37
|
-
|
39
|
+
report_klass = Class.new do
|
38
40
|
include Mongoid::Report
|
39
|
-
|
40
|
-
|
41
|
+
def self.name ; 'report-klass' ; end
|
42
|
+
|
43
|
+
group_by :day, collection: Model
|
44
|
+
column :field1, collection: Model
|
41
45
|
end
|
42
|
-
example =
|
46
|
+
example = report_klass.new
|
43
47
|
|
44
|
-
report = example.aggregate_for(klass)
|
48
|
+
report = example.aggregate_for('report-klass', 'models')
|
45
49
|
report = report.all
|
46
50
|
|
47
51
|
rows = report.rows
|
@@ -60,14 +64,16 @@ describe Mongoid::Report do
|
|
60
64
|
klass.create(day: two_days_ago , field1: 1 , field2: 2)
|
61
65
|
klass.create(day: today , field1: 1 , field2: 3)
|
62
66
|
|
63
|
-
|
67
|
+
report_klass = Class.new do
|
64
68
|
include Mongoid::Report
|
65
|
-
|
66
|
-
|
69
|
+
def self.name ; 'report-klass' ; end
|
70
|
+
|
71
|
+
group_by :day, collection: Model
|
72
|
+
column :field1, collection: Model
|
67
73
|
end
|
68
|
-
example =
|
74
|
+
example = report_klass.new
|
69
75
|
|
70
|
-
scope = example.aggregate_for(
|
76
|
+
scope = example.aggregate_for('report-klass', 'models')
|
71
77
|
scope = scope.query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } })
|
72
78
|
scope = scope.query('$match' => { :field2 => 2 })
|
73
79
|
scope = scope.yield
|
@@ -87,14 +93,16 @@ describe Mongoid::Report do
|
|
87
93
|
it 'skips empty match in query' do
|
88
94
|
klass.create(day: today , field1: 1 , field2: 2)
|
89
95
|
|
90
|
-
|
96
|
+
report_klass = Class.new do
|
91
97
|
include Mongoid::Report
|
92
|
-
|
93
|
-
|
98
|
+
def self.name ; 'report-klass' ; end
|
99
|
+
|
100
|
+
group_by :day, collection: Model
|
101
|
+
column :field1, collection: Model
|
94
102
|
end
|
95
|
-
example =
|
103
|
+
example = report_klass.new
|
96
104
|
|
97
|
-
scope = example.aggregate_for(
|
105
|
+
scope = example.aggregate_for('report-klass', 'models')
|
98
106
|
scope = scope.query()
|
99
107
|
scope = scope.query({})
|
100
108
|
|
@@ -115,8 +123,9 @@ describe Mongoid::Report do
|
|
115
123
|
klass.create(day: yesterday , field1: 1 , field2: 2)
|
116
124
|
klass.create(day: two_days_ago , field1: 1 , field2: 2)
|
117
125
|
|
118
|
-
|
126
|
+
report_klass = Class.new do
|
119
127
|
include Mongoid::Report
|
128
|
+
def self.name ; 'report-klass' ; end
|
120
129
|
|
121
130
|
attach_to Model, as: 'example1' do
|
122
131
|
group_by :day
|
@@ -129,7 +138,7 @@ describe Mongoid::Report do
|
|
129
138
|
end
|
130
139
|
end
|
131
140
|
|
132
|
-
example =
|
141
|
+
example = report_klass.new
|
133
142
|
scope = example.aggregate
|
134
143
|
scope
|
135
144
|
.query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } })
|
@@ -137,14 +146,14 @@ describe Mongoid::Report do
|
|
137
146
|
.query('$sort' => { day: -1 })
|
138
147
|
scope = scope.all
|
139
148
|
|
140
|
-
rows = scope['example1'].rows
|
149
|
+
rows = scope['report-klass']['example1'].rows
|
141
150
|
expect(rows.size).to eq(2)
|
142
151
|
expect(rows[0]['field1']).to eq(2)
|
143
152
|
expect(rows[0]['day']).to eq(today)
|
144
153
|
expect(rows[1]['field1']).to eq(1)
|
145
154
|
expect(rows[1]['day']).to eq(yesterday)
|
146
155
|
|
147
|
-
rows = scope['example2'].rows
|
156
|
+
rows = scope['report-klass']['example2'].rows
|
148
157
|
expect(rows.size).to eq(2)
|
149
158
|
expect(rows[0]['field2']).to eq(4)
|
150
159
|
expect(rows[0]['day']).to eq(today)
|
@@ -158,8 +167,9 @@ describe Mongoid::Report do
|
|
158
167
|
klass.create(day: yesterday , field1: 1 , field2: 2)
|
159
168
|
klass.create(day: two_days_ago , field1: 1 , field2: 2)
|
160
169
|
|
161
|
-
|
170
|
+
report_klass = Class.new do
|
162
171
|
include Mongoid::Report
|
172
|
+
def self.name ; 'report-klass' ; end
|
163
173
|
|
164
174
|
report 'example' do
|
165
175
|
attach_to Model, as: 'model1' do
|
@@ -173,7 +183,7 @@ describe Mongoid::Report do
|
|
173
183
|
end
|
174
184
|
end
|
175
185
|
end
|
176
|
-
example =
|
186
|
+
example = report_klass.new
|
177
187
|
|
178
188
|
scope = example.aggregate
|
179
189
|
scope
|
@@ -182,14 +192,14 @@ describe Mongoid::Report do
|
|
182
192
|
.query('$sort' => { day: -1 })
|
183
193
|
scope = scope.all
|
184
194
|
|
185
|
-
rows = scope['example
|
195
|
+
rows = scope['example']['model1'].rows
|
186
196
|
expect(rows.size).to eq(2)
|
187
197
|
expect(rows[0]['field1']).to eq(2)
|
188
198
|
expect(rows[0]['day']).to eq(today)
|
189
199
|
expect(rows[1]['field1']).to eq(1)
|
190
200
|
expect(rows[1]['day']).to eq(yesterday)
|
191
201
|
|
192
|
-
rows = scope['example
|
202
|
+
rows = scope['example']['model2'].rows
|
193
203
|
expect(rows.size).to eq(2)
|
194
204
|
expect(rows[0]['field2']).to eq(4)
|
195
205
|
expect(rows[0]['day']).to eq(today)
|
@@ -203,13 +213,14 @@ describe Mongoid::Report do
|
|
203
213
|
klass.create(day: yesterday , field1: 1 , field2: 2)
|
204
214
|
klass.create(day: two_days_ago , field1: 1 , field2: 2)
|
205
215
|
|
206
|
-
|
216
|
+
report_klass = Class.new do
|
207
217
|
include Mongoid::Report
|
218
|
+
def self.name ; 'report-klass' ; end
|
208
219
|
|
209
220
|
report 'example' do
|
210
221
|
attach_to Model, as: 'model1' do
|
211
222
|
group_by :day
|
212
|
-
column :field1
|
223
|
+
column :field1
|
213
224
|
end
|
214
225
|
|
215
226
|
attach_to Model, as: 'model2' do
|
@@ -218,7 +229,7 @@ describe Mongoid::Report do
|
|
218
229
|
end
|
219
230
|
end
|
220
231
|
end
|
221
|
-
example =
|
232
|
+
example = report_klass.new
|
222
233
|
|
223
234
|
scope = example.aggregate
|
224
235
|
scope
|
@@ -227,14 +238,14 @@ describe Mongoid::Report do
|
|
227
238
|
.query('$sort' => { day: -1 })
|
228
239
|
scope = scope.all
|
229
240
|
|
230
|
-
rows = scope['example
|
241
|
+
rows = scope['example']['model1'].rows
|
231
242
|
expect(rows.size).to eq(2)
|
232
|
-
expect(rows[0]['
|
243
|
+
expect(rows[0]['field1']).to eq(2)
|
233
244
|
expect(rows[0]['day']).to eq(today)
|
234
|
-
expect(rows[1]['
|
245
|
+
expect(rows[1]['field1']).to eq(1)
|
235
246
|
expect(rows[1]['day']).to eq(yesterday)
|
236
247
|
|
237
|
-
rows = scope['example
|
248
|
+
rows = scope['example']['model2'].rows
|
238
249
|
expect(rows.size).to eq(2)
|
239
250
|
expect(rows[0]['field2']).to eq(4)
|
240
251
|
expect(rows[0]['day']).to eq(today)
|
@@ -243,85 +254,89 @@ describe Mongoid::Report do
|
|
243
254
|
end
|
244
255
|
end
|
245
256
|
|
246
|
-
describe '.
|
247
|
-
it 'creates
|
257
|
+
describe '.match' do
|
258
|
+
it 'creates match' do
|
248
259
|
klass.create(field1: 1, field2: 2)
|
249
260
|
klass.create(field1: 3, field2: 4)
|
250
261
|
|
251
|
-
|
262
|
+
report_klass = Class.new do
|
252
263
|
include Mongoid::Report
|
264
|
+
def self.name ; 'report-klass' ; end
|
253
265
|
|
254
|
-
|
255
|
-
column :field1,
|
266
|
+
match field2: 2, collection: Model
|
267
|
+
column :field1, collection: Model
|
256
268
|
end
|
257
|
-
example =
|
269
|
+
example = report_klass.new
|
258
270
|
|
259
271
|
scope = example.aggregate
|
260
272
|
scope = scope.all
|
261
273
|
|
262
|
-
rows = scope[
|
274
|
+
rows = scope['report-klass']['models'].rows
|
263
275
|
expect(rows.size).to eq(1)
|
264
276
|
expect(rows[0]['field1']).to eq(1)
|
265
277
|
end
|
266
278
|
|
267
|
-
it 'creates
|
279
|
+
it 'creates match in report scope' do
|
268
280
|
klass.create(field1: 1, field2: 2)
|
269
281
|
klass.create(field1: 3, field2: 4)
|
270
282
|
|
271
|
-
|
283
|
+
report_klass = Class.new do
|
272
284
|
include Mongoid::Report
|
285
|
+
def self.name ; 'report-klass' ; end
|
273
286
|
|
274
287
|
report 'example' do
|
275
288
|
attach_to Model do
|
276
|
-
|
289
|
+
match field2: 2
|
277
290
|
column :field1
|
278
291
|
end
|
279
292
|
end
|
280
293
|
end
|
281
294
|
|
282
|
-
example =
|
295
|
+
example = report_klass.new
|
283
296
|
scope = example.aggregate
|
284
297
|
scope = scope.all
|
285
298
|
|
286
|
-
rows = scope['example
|
299
|
+
rows = scope['example']['models'].rows
|
287
300
|
expect(rows.size).to eq(1)
|
288
301
|
expect(rows[0]['field1']).to eq(1)
|
289
302
|
end
|
290
303
|
|
291
|
-
it 'creates
|
304
|
+
it 'creates match in report scope' do
|
292
305
|
klass.create(day: today , field1: 1 , field2: 2)
|
293
306
|
klass.create(day: yesterday , field1: 1 , field2: 2)
|
294
307
|
klass.create(day: today , field1: 3 , field2: 4)
|
295
308
|
|
296
|
-
|
309
|
+
report_klass = Class.new do
|
297
310
|
include Mongoid::Report
|
311
|
+
def self.name ; 'report-klass' ; end
|
298
312
|
|
299
313
|
report 'example' do
|
300
314
|
attach_to Model do
|
301
|
-
|
315
|
+
match field2: 2,
|
302
316
|
day: ->(context) { Date.parse("20-12-2004").mongoize }
|
303
317
|
column :field1
|
304
318
|
end
|
305
319
|
end
|
306
320
|
end
|
307
|
-
example =
|
321
|
+
example = report_klass.new
|
308
322
|
|
309
323
|
scope = example.aggregate
|
310
324
|
scope = scope.all
|
311
325
|
|
312
|
-
rows = scope['example
|
326
|
+
rows = scope['example']['models'].rows
|
313
327
|
expect(rows.size).to eq(1)
|
314
328
|
expect(rows[0]['field1']).to eq(1)
|
315
329
|
end
|
316
330
|
|
317
|
-
it 'creates
|
331
|
+
it 'creates match in report scope' do
|
318
332
|
klass.create(day: today , field1: 1 , field2: 2)
|
319
333
|
klass.create(day: today , field1: 1 , field2: 2)
|
320
334
|
klass.create(day: yesterday , field1: 1 , field2: 2)
|
321
335
|
klass.create(day: today , field1: 3 , field2: 4)
|
322
336
|
|
323
|
-
|
337
|
+
report_klass = Class.new do
|
324
338
|
include Mongoid::Report
|
339
|
+
def self.name ; 'report-klass' ; end
|
325
340
|
|
326
341
|
def values
|
327
342
|
[1, 2]
|
@@ -330,17 +345,17 @@ describe Mongoid::Report do
|
|
330
345
|
report 'example' do
|
331
346
|
attach_to Model do
|
332
347
|
group_by :day
|
333
|
-
|
348
|
+
match field2: ->(context) { { '$in' => context.values } }
|
334
349
|
column :field1
|
335
350
|
end
|
336
351
|
end
|
337
352
|
end
|
338
|
-
example =
|
353
|
+
example = report_klass.new
|
339
354
|
|
340
355
|
scope = example.aggregate
|
341
356
|
scope = scope.all
|
342
357
|
|
343
|
-
rows = scope['example
|
358
|
+
rows = scope['example']['models'].rows
|
344
359
|
expect(rows.size).to eq(2)
|
345
360
|
expect(rows[0]['field1']).to eq(1)
|
346
361
|
expect(rows[1]['field1']).to eq(2)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongoid::Report do
|
4
|
+
it 'should creates settings in case of missing block' do
|
5
|
+
report_klass = Class.new do
|
6
|
+
include Mongoid::Report
|
7
|
+
|
8
|
+
report 'example' do
|
9
|
+
attach_to Model do ; end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
expect(report_klass.settings['example']).to be
|
14
|
+
expect(report_klass.settings['example'][:reports]['models']).to be
|
15
|
+
end
|
16
|
+
end
|
@@ -5,9 +5,11 @@ describe Mongoid::Report::Collection do
|
|
5
5
|
|
6
6
|
describe '.rows' do
|
7
7
|
it 'use returns aggregated rows' do
|
8
|
-
|
8
|
+
report_klass = Class.new do
|
9
9
|
include Mongoid::Report
|
10
10
|
|
11
|
+
def self.name ; 'report-klass' ; end
|
12
|
+
|
11
13
|
attach_to Model do
|
12
14
|
column :field1
|
13
15
|
end
|
@@ -15,9 +17,10 @@ describe Mongoid::Report::Collection do
|
|
15
17
|
|
16
18
|
3.times { klass.create!(field1: 1) }
|
17
19
|
|
18
|
-
example =
|
19
|
-
report = example
|
20
|
-
|
20
|
+
example = report_klass.new
|
21
|
+
report = example
|
22
|
+
.aggregate_for('report-klass', 'models')
|
23
|
+
.all
|
21
24
|
|
22
25
|
rows = report.rows
|
23
26
|
expect(rows.size).to eq(1)
|
@@ -27,17 +30,19 @@ describe Mongoid::Report::Collection do
|
|
27
30
|
|
28
31
|
describe '.headers' do
|
29
32
|
it 'returns columns for showing in the reports' do
|
30
|
-
|
33
|
+
report_klass = Class.new do
|
31
34
|
include Mongoid::Report
|
32
35
|
|
36
|
+
def self.name ; 'report-klass' ; end
|
37
|
+
|
33
38
|
attach_to Model do
|
34
39
|
column :field1, :field3, :field2
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
38
|
-
report =
|
43
|
+
report = report_klass.new
|
39
44
|
report = report
|
40
|
-
.aggregate_for(klass)
|
45
|
+
.aggregate_for('report-klass', 'models')
|
41
46
|
.all
|
42
47
|
|
43
48
|
expect(report.headers).to eq(["field1", "field3", "field2"])
|
@@ -28,7 +28,7 @@ describe Mongoid::Report do
|
|
28
28
|
scope = report.aggregate
|
29
29
|
scope = scope.all
|
30
30
|
|
31
|
-
rows = scope['example
|
31
|
+
rows = scope['example']['models'].rows
|
32
32
|
expect(rows.size).to eq(2)
|
33
33
|
expect(rows[0]['field1']).to eq(1)
|
34
34
|
expect(rows[0]['dynamic-field1']).to eq(10)
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongoid::Report do
|
4
|
+
let(:klass) { Model }
|
5
|
+
|
6
|
+
it 'allows to specify dynamic name for attach_to option' do
|
7
|
+
report_klass = Class.new do
|
8
|
+
include Mongoid::Report
|
9
|
+
|
10
|
+
report 'example' do
|
11
|
+
attach_to 'pregenerated' do
|
12
|
+
group_by :field1
|
13
|
+
column :field3
|
14
|
+
end
|
15
|
+
|
16
|
+
attach_to Model do
|
17
|
+
group_by :field1, :field2
|
18
|
+
column :field3
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
klass.create!(field1: 1, field2: 1, field3: 1)
|
24
|
+
klass.create!(field1: 1, field2: 2, field3: 1)
|
25
|
+
|
26
|
+
report = report_klass.new
|
27
|
+
scoped = report.aggregate_for('example', 'models')
|
28
|
+
scoped = scoped
|
29
|
+
.out('new-collection')
|
30
|
+
.all
|
31
|
+
|
32
|
+
expect(scoped.rows.size).to eq(2)
|
33
|
+
expect(scoped.summary['field3']).to eq(2)
|
34
|
+
|
35
|
+
scoped = report.aggregate_for('example', 'pregenerated')
|
36
|
+
scoped = scoped
|
37
|
+
.in('new-collection')
|
38
|
+
.all
|
39
|
+
|
40
|
+
expect(scoped.rows.size).to eq(1)
|
41
|
+
expect(scoped.rows[0]['field3']).to eq(2)
|
42
|
+
expect(scoped.summary['field3']).to eq(2)
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
it 'should be possible to define column and other methods out of the attach_to scope' do
|
47
|
+
report_klass = Class.new do
|
48
|
+
include Mongoid::Report
|
49
|
+
|
50
|
+
report 'example' do
|
51
|
+
columns :field4 => ->(context, row, options) { row['field3'] }
|
52
|
+
|
53
|
+
column :field3, :field4
|
54
|
+
|
55
|
+
attach_to 'pregenerated' do
|
56
|
+
group_by :field1
|
57
|
+
end
|
58
|
+
|
59
|
+
attach_to Model do
|
60
|
+
group_by :field1, :field2
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
klass.create!(field1: 1, field2: 1, field3: 1)
|
66
|
+
klass.create!(field1: 1, field2: 2, field3: 1)
|
67
|
+
|
68
|
+
report = report_klass.new
|
69
|
+
scoped = report.aggregate_for('example', 'models')
|
70
|
+
scoped = scoped
|
71
|
+
.out('new-collection')
|
72
|
+
.all
|
73
|
+
expect(scoped.rows.size).to eq(2)
|
74
|
+
expect(scoped.summary['field3']).to eq(2)
|
75
|
+
|
76
|
+
scoped = report.aggregate_for('example', 'pregenerated')
|
77
|
+
scoped = scoped
|
78
|
+
.in('new-collection')
|
79
|
+
.all
|
80
|
+
|
81
|
+
expect(scoped.rows.size).to eq(1)
|
82
|
+
expect(scoped.rows[0]['field3']).to eq(2)
|
83
|
+
expect(scoped.rows[0]['field4']).to eq(2)
|
84
|
+
expect(scoped.summary['field3']).to eq(2)
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongoid::Report do
|
4
|
+
it 'works fine on multiple requests' do
|
5
|
+
report_klass = Class.new do
|
6
|
+
include Mongoid::Report
|
7
|
+
|
8
|
+
report 'example' do
|
9
|
+
attach_to Model do
|
10
|
+
match field2: 2
|
11
|
+
column :field1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Model.create(field1: 1, field2: 1)
|
17
|
+
Model.create(field1: 1, field2: 2)
|
18
|
+
|
19
|
+
report = report_klass.new
|
20
|
+
scoped = report.aggregate_for('example', 'models').all
|
21
|
+
queries1 = report.report_module_settings['example'][:reports]['models'][:queries].deep_dup
|
22
|
+
|
23
|
+
report = report_klass.new
|
24
|
+
scoped = report.aggregate_for('example', 'models').all
|
25
|
+
queries2 = report.report_module_settings['example'][:reports]['models'][:queries].deep_dup
|
26
|
+
|
27
|
+
expect(queries1).to eq(queries2)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'works find on multiple requests with drops of their stats' do
|
31
|
+
day1 = Date.parse("2014-01-01")
|
32
|
+
1.times { Model.create(day: day1, field1: 1, field2: 1) }
|
33
|
+
|
34
|
+
day2 = Date.parse("2014-01-02")
|
35
|
+
2.times { Model.create(day: day2, field1: 1, field2: 2) }
|
36
|
+
|
37
|
+
day3 = Date.parse("2014-01-03")
|
38
|
+
3.times { Model.create(day: day3, field1: 1, field2: 3) }
|
39
|
+
|
40
|
+
report_klass = Class.new do
|
41
|
+
include Mongoid::Report
|
42
|
+
|
43
|
+
report 'example' do
|
44
|
+
attach_to Model do
|
45
|
+
group_by :day
|
46
|
+
column :field1, :field2
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# pregenerate the data
|
52
|
+
report = report_klass.new
|
53
|
+
scoped = report
|
54
|
+
.aggregate_for('example', 'models')
|
55
|
+
.query(
|
56
|
+
'$match' => {
|
57
|
+
'day' => {
|
58
|
+
'$gte' => day1.mongoize,
|
59
|
+
'$lte' => day3.mongoize,
|
60
|
+
},
|
61
|
+
})
|
62
|
+
.yield
|
63
|
+
.out('new-models', drop: {
|
64
|
+
'day' => {
|
65
|
+
'$gte' => day1.mongoize,
|
66
|
+
'$lte' => day3.mongoize,
|
67
|
+
},
|
68
|
+
})
|
69
|
+
.all
|
70
|
+
report = report_klass.new
|
71
|
+
# read the data from output collection
|
72
|
+
scoped = report
|
73
|
+
.aggregate_for('example', 'models')
|
74
|
+
.in('new-models')
|
75
|
+
.all
|
76
|
+
|
77
|
+
expect(scoped.rows.size).to eq(3)
|
78
|
+
row = scoped.rows.find { |row| row['day'] == day1 }
|
79
|
+
expect(row['field1']).to eq(1)
|
80
|
+
expect(row['field2']).to eq(1)
|
81
|
+
row = scoped.rows.find { |row| row['day'] == day2 }
|
82
|
+
expect(row['field1']).to eq(2)
|
83
|
+
expect(row['field2']).to eq(4)
|
84
|
+
row = scoped.rows.find { |row| row['day'] == day3 }
|
85
|
+
expect(row['field1']).to eq(3)
|
86
|
+
expect(row['field2']).to eq(9)
|
87
|
+
|
88
|
+
Model.where(day: day1).set(field1: 1, field2: 2)
|
89
|
+
Model.where(day: day2).set(field1: 2, field2: 3)
|
90
|
+
Model.where(day: day3).set(field1: 1, field2: 2)
|
91
|
+
|
92
|
+
# pregenerate the data
|
93
|
+
report = report_klass.new
|
94
|
+
scoped = report
|
95
|
+
.aggregate_for('example', 'models')
|
96
|
+
.query(
|
97
|
+
'$match' => {
|
98
|
+
'day' => {
|
99
|
+
'$gte' => day1.mongoize,
|
100
|
+
'$lte' => day3.mongoize,
|
101
|
+
},
|
102
|
+
})
|
103
|
+
.yield
|
104
|
+
.out('new-models', drop: {
|
105
|
+
'day' => {
|
106
|
+
'$gte' => day1.mongoize,
|
107
|
+
'$lte' => day3.mongoize,
|
108
|
+
},
|
109
|
+
})
|
110
|
+
.all
|
111
|
+
# read the data from output collection
|
112
|
+
report = report_klass.new
|
113
|
+
scoped = report
|
114
|
+
.aggregate_for('example', 'models')
|
115
|
+
.in('new-models')
|
116
|
+
.all
|
117
|
+
|
118
|
+
expect(scoped.rows.size).to eq(3)
|
119
|
+
row = scoped.rows.find { |row| row['day'] == day1 }
|
120
|
+
expect(row['field1']).to eq(1)
|
121
|
+
expect(row['field2']).to eq(2)
|
122
|
+
row = scoped.rows.find { |row| row['day'] == day2 }
|
123
|
+
expect(row['field1']).to eq(4)
|
124
|
+
expect(row['field2']).to eq(6)
|
125
|
+
row = scoped.rows.find { |row| row['day'] == day3 }
|
126
|
+
expect(row['field1']).to eq(3)
|
127
|
+
expect(row['field2']).to eq(6)
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongoid::Report do
|
4
|
+
it 'should stores global queries for each defined attach_to blocks' do
|
5
|
+
report_klass = Class.new do
|
6
|
+
include Mongoid::Report
|
7
|
+
|
8
|
+
report 'example' do
|
9
|
+
match field1: 1
|
10
|
+
|
11
|
+
attach_to Model, as: 'models1' do ; end
|
12
|
+
attach_to Model, as: 'models2' do
|
13
|
+
column :field2
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
report = report_klass.new
|
19
|
+
queries1 = report.report_module_settings['example'][:reports]['models1'][:queries]
|
20
|
+
queries2 = report.report_module_settings['example'][:reports]['models2'][:queries]
|
21
|
+
|
22
|
+
expect(queries1).to eq([
|
23
|
+
{ '$match' => { :field1 => 1 }},
|
24
|
+
{ '$project' => { :_id => 1 }},
|
25
|
+
{ '$group' => { :_id => {} } },
|
26
|
+
{ '$project' => { :_id => 0 } },
|
27
|
+
])
|
28
|
+
expect(queries2).to eq([
|
29
|
+
{ '$match' => { :field1 => 1 }},
|
30
|
+
{ '$project' => { :_id => 1, 'field2' => 1 }},
|
31
|
+
{ '$group' => { :_id => {}, 'field2'=>{'$sum'=>'$field2'} } },
|
32
|
+
{ '$project' => { :_id => 0, 'field2' => '$field2' } },
|
33
|
+
])
|
34
|
+
end
|
35
|
+
end
|