mongoid-report 0.0.10 → 0.0.11

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
- MGI5NjU2YTI3ZTI0MmIxYzA0ZTRiYTQ4ZDhiZGNmY2FiZDRhMmViMg==
4
+ MjViNTY5ZjMxOWYzYWU5ZmY3NGNlMGJkZTVkMjFkZmY5ZGUxMTEyZA==
5
5
  data.tar.gz: !binary |-
6
- MDY0ODA4ZGM4MWI0NzViOTljMTQ2ZTYwNjNjYWU3NTlkY2Q3MDMxMg==
6
+ YjhiZDUzNWIwNGYxYWI3OGQ4MjJhMDRkYWFmNjVkMmZhNjBlZmY4Zg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZmI4YWEzNzIwMDM0MTdjODBmZDFlNjAyYTliMTliZmVmYTA1NDcwMWJhY2Jj
10
- N2IzYzY4M2UzYzNkNWQ2OTYwY2FlYWE2NGY4ZTQ3YmU0NjQyMGY0Njc4NTdk
11
- ZTJkZjQ5MTQ4YTc3NTViMzVhMTQ4MjU4NGRmYTY3Y2U4ZjgyMWQ=
9
+ MjFhMWU4YWI4YzExYzUyYmI3ZWM4Yzk5OGE3NGJlOWE0OTcyNjY4NmMwODRj
10
+ ZDQ0NWViMDk4MTk3MWZmODBkZmYwZGQzMjgzNjU4M2VjN2M5ZmQ1MWEwYTZl
11
+ MTBmMjhjMDIxYzJiNTJkMTAxNzVmYjM1MjUzOTBlMWE3YWU4OTA=
12
12
  data.tar.gz: !binary |-
13
- NzUxMGQzNzNjZjU5Yzk0ZWViNWFlNWU0MTI2YWUwOGE3MDk5YzM4ZjZjZjEw
14
- YjU2ODU0ZTRlN2MzNWY3MTYzNDE4YTg1ZjdjZjM2ZGQ3MGE3NDQ2NzY4ZWZh
15
- YTRmNTExYmMwNTk2ZjhmMjFkNGFkMmQwZDBjOTI4Mzk0NGQ2NGQ=
13
+ Y2E4NzQzMDJkZGIyOTBmZDJkY2IyNWM3NmUyZGQ0Y2U5YWRiMDM4MGMzOTli
14
+ Mzg5MDRhZjUwNWVmZTZmMTNlZGY0MTM0N2Y2ZDM4MDI0ZjQ1MjE2ZWYzMjg3
15
+ ODdjMTA4NDBiMmM2MjhkMzhjZjI2MGM0ZWI0ZWViYjcwYTIyOGU=
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongoid-report (0.0.10)
4
+ mongoid-report (0.0.11)
5
5
  mongoid (> 3.0.1)
6
6
 
7
7
  GEM
@@ -2,12 +2,27 @@ module Mongoid
2
2
  module Report
3
3
 
4
4
  AttachProxy = Struct.new(:context, :collection, :options) do
5
+ attr_reader :attach_name
6
+
7
+ def initialize(context, collection, options)
8
+ # Lets remove as option because of passing to the next blocks options
9
+ @attach_name = options.delete(:as) || collection
10
+ options = options.merge(attach_name: attach_name, for: collection)
11
+ super(context, collection, options)
12
+ end
13
+
5
14
  def aggregation_field(*fields)
6
- context.aggregation_field(*fields, options.merge(for: collection))
15
+ field_options = fields.extract_options!
16
+ field_options.merge!(options)
17
+
18
+ context.aggregation_field(*fields, field_options)
7
19
  end
8
20
 
9
21
  def group_by(*fields)
10
- context.group_by(*fields, options.merge(for: collection))
22
+ group_options = fields.extract_options!
23
+ group_options.merge!(options)
24
+
25
+ context.group_by(*fields, group_options)
11
26
  end
12
27
  end
13
28
 
@@ -26,9 +26,17 @@ module Mongoid
26
26
  @fields ||= settings[:fields]
27
27
  end
28
28
 
29
+ def in_fields
30
+ @in_fields ||= fields.keys
31
+ end
32
+
33
+ def output_fields
34
+ @output_fields ||= fields.values
35
+ end
36
+
29
37
  def all_fields
30
38
  [:_id]
31
- .concat(fields)
39
+ .concat(in_fields)
32
40
  .concat(groups)
33
41
  end
34
42
 
@@ -48,7 +56,7 @@ module Mongoid
48
56
  hash.merge!(group => GROUP_TEMPLATE % group)
49
57
  end
50
58
 
51
- fields.inject(query) do |hash, field|
59
+ in_fields.inject(query) do |hash, field|
52
60
  hash.merge!(field => { '$sum' => GROUP_TEMPLATE % field })
53
61
  end
54
62
  end
@@ -67,8 +75,8 @@ module Mongoid
67
75
  end
68
76
  end
69
77
 
70
- fields.inject(query) do |hash, field|
71
- hash.merge!(field => 1)
78
+ fields.inject(query) do |hash, (field, name)|
79
+ hash.merge!(name => "$#{field}")
72
80
  end
73
81
  end
74
82
  end
@@ -37,7 +37,9 @@ module Mongoid
37
37
  end
38
38
 
39
39
  def fields
40
- context.class.settings_property(report_name, :fields)
40
+ # We need to use here only output field names it could be different
41
+ # than defined colunms, Example: field1: 'report-field-name'
42
+ context.class.settings_property(report_name, :fields).values
41
43
  end
42
44
  end
43
45
 
@@ -1,5 +1,5 @@
1
1
  module Mongoid
2
2
  module Report
3
- VERSION = "0.0.10"
3
+ VERSION = "0.0.11"
4
4
  end
5
5
  end
@@ -49,40 +49,43 @@ module Mongoid
49
49
  end
50
50
 
51
51
  module ClassMethods
52
+ def report(name, &block)
53
+ proxy = ReportProxy.new(self, name)
54
+ proxy.instance_eval(&block)
55
+ end
56
+
52
57
  def attach_to(collection, options = {}, &block)
53
58
  proxy = AttachProxy.new(self, collection, options)
54
59
  proxy.instance_eval(&block)
55
60
  end
56
61
 
57
62
  def group_by(*fields)
58
- define_report_method(*fields) do |groups, report_name|
63
+ define_report_method(*fields) do |groups, report_name, _|
59
64
  settings[report_name][:group_by] = groups
60
65
  end
61
66
  end
62
67
 
63
68
  def aggregation_field(*fields)
64
- define_report_method(*fields) do |columns, report_name|
69
+ define_report_method(*fields) do |columns, report_name, options|
65
70
  columns.each do |column|
66
- add_field(report_name, column)
71
+ name = options.fetch(:as) { column }
72
+ add_field(report_name, column, name)
67
73
  end
68
74
  end
69
75
  end
70
76
 
71
- def report(name, &block)
72
- proxy = ReportProxy.new(self, name)
73
- proxy.instance_eval(&block)
74
- end
75
-
76
77
  def fields(collection)
77
- settings_property(collection, :fields)
78
+ settings_property(collection, :fields, {})
78
79
  end
79
80
 
80
81
  def groups(collection)
81
- settings_property(collection, :group_by)
82
+ settings_property(collection, :group_by, [])
82
83
  end
83
84
 
84
- def settings_property(collection, key)
85
- settings.fetch(collection, {}).fetch(key, [])
85
+ def settings_property(collection, key, default = [])
86
+ settings
87
+ .fetch(collection) { {} }
88
+ .fetch(key) { default }
86
89
  end
87
90
 
88
91
  private
@@ -90,41 +93,33 @@ module Mongoid
90
93
  def define_report_method(*fields)
91
94
  options = fields.extract_options!
92
95
 
93
- # We should always have for option
94
- report_name = initialize_settings_by(options)
95
-
96
- # Because of modifying fields(usign exract options method of
97
- # ActiveSupport) lets pass fields to the next block with collection.
98
- yield fields, report_name
99
- end
100
-
101
- def initialize_settings_by(options)
102
96
  # We should always specify model to attach fields, groups
103
97
  collection = options.fetch(:for)
104
98
 
105
99
  # If user didn't pass as option to name the report we are using
106
100
  # collection class as key for settings.
107
- report_name = options.fetch(:as) { collection }
101
+ attach_name = options.fetch(:attach_name) { collection }
102
+
103
+ # We should always have for option
104
+ initialize_settings_by(attach_name, collection)
105
+
106
+ # Because of modifying fields(usign exract options method of
107
+ # ActiveSupport) lets pass fields to the next block with collection.
108
+ yield fields, attach_name, options || {}
109
+ end
108
110
 
109
- settings[report_name] ||= settings.fetch(report_name) do
111
+ def initialize_settings_by(attach_name, collection)
112
+ settings[attach_name] ||= settings.fetch(attach_name) do
110
113
  {
111
114
  for: collection,
112
- fields: [],
115
+ fields: {},
113
116
  group_by: [],
114
117
  }
115
118
  end
116
-
117
- report_name
118
119
  end
119
120
 
120
- def add_field(report_name, field)
121
- settings[report_name][:fields] << field
122
-
123
- class_eval <<-FIELD
124
- def #{field}
125
- @#{field} ||= 0
126
- end
127
- FIELD
121
+ def add_field(attach_name, field, name)
122
+ settings[attach_name][:fields][field] = name
128
123
  end
129
124
 
130
125
  end
@@ -166,6 +166,51 @@ describe Mongoid::Report do
166
166
  expect(rows[1]['field2']).to eq(2)
167
167
  expect(rows[1]['day']).to eq(yesterday)
168
168
  end
169
+
170
+ class Report11
171
+ include Mongoid::Report
172
+
173
+ report 'example' do
174
+ attach_to Model, as: 'model1' do
175
+ group_by :day
176
+ aggregation_field :field1, as: 'new-field1'
177
+ end
178
+
179
+ attach_to Model, as: 'model2' do
180
+ group_by :day
181
+ aggregation_field :field2
182
+ end
183
+ end
184
+ end
185
+
186
+ it 'should still aggregate with combined report and project using the new names' do
187
+ klass.create(day: today , field1: 1 , field2: 2)
188
+ klass.create(day: today , field1: 1 , field2: 2)
189
+ klass.create(day: yesterday , field1: 1 , field2: 2)
190
+ klass.create(day: two_days_ago , field1: 1 , field2: 2)
191
+
192
+ example = Report11.new
193
+ scope = example.aggregate
194
+ scope
195
+ .query('$match' => { :day => { '$gte' => yesterday.mongoize, '$lte' => today.mongoize } })
196
+ .yield
197
+ .query('$sort' => { day: -1 })
198
+ scope = scope.all
199
+
200
+ rows = scope['example-model1']
201
+ expect(rows.size).to eq(2)
202
+ expect(rows[0]['new-field1']).to eq(2)
203
+ expect(rows[0]['day']).to eq(today)
204
+ expect(rows[1]['new-field1']).to eq(1)
205
+ expect(rows[1]['day']).to eq(yesterday)
206
+
207
+ rows = scope['example-model2']
208
+ expect(rows.size).to eq(2)
209
+ expect(rows[0]['field2']).to eq(4)
210
+ expect(rows[0]['day']).to eq(today)
211
+ expect(rows[1]['field2']).to eq(2)
212
+ expect(rows[1]['day']).to eq(yesterday)
213
+ end
169
214
  end
170
215
 
171
216
  end
@@ -19,7 +19,7 @@ describe Mongoid::Report::QueriesBuilder do
19
19
  expect(queries[2]).to eq(
20
20
  '$project' => {
21
21
  :_id => '$_id',
22
- :field1 => 1,
22
+ :field1 => '$field1',
23
23
  })
24
24
  end
25
25
 
@@ -41,7 +41,7 @@ describe Mongoid::Report::QueriesBuilder do
41
41
  '$project' => {
42
42
  :_id => 0,
43
43
  :day => '$_id.day',
44
- :field1 => 1,
44
+ :field1 => '$field1',
45
45
  })
46
46
  end
47
47
 
@@ -77,8 +77,8 @@ describe Mongoid::Report::QueriesBuilder do
77
77
  :_id => 0,
78
78
  :day => '$_id.day',
79
79
  :field2 => '$_id.field2',
80
- :field1 => 1,
81
- :field3 => 1,
80
+ :field1 => '$field1',
81
+ :field3 => '$field3',
82
82
  })
83
83
  end
84
84
  end
@@ -3,28 +3,13 @@ require 'spec_helper'
3
3
  describe Mongoid::Report do
4
4
 
5
5
  describe '.aggregation_field' do
6
- it 'defines field for aggregation using class method' do
7
- example = Report1.new
8
- expect(example).to be_respond_to(:field1)
9
- end
10
-
11
- it 'defines as reader only' do
12
- example = Report1.new
13
- expect{ example.field1 = 'value' }.to raise_error
14
- end
15
-
16
- it 'defines field with 0 by default' do
17
- example = Report1.new
18
- expect(example.field1).to eq(0)
19
- end
20
-
21
6
  it 'defines aggegration settings' do
22
7
  expect(Report1).to be_respond_to(:settings)
23
8
  end
24
9
 
25
10
  it 'defines aggregation field for specific model to make queries' do
26
11
  fields = Report1.fields(Model)
27
- expect(fields).to eq([:field1])
12
+ expect(fields).to eq({ field1: :field1 })
28
13
  end
29
14
  end
30
15
 
@@ -35,7 +20,7 @@ describe Mongoid::Report do
35
20
 
36
21
  it 'defines field in terms of attached model' do
37
22
  fields = Report2.fields(Model)
38
- expect(fields).to eq([:field1])
23
+ expect(fields).to eq({ field1: :field1 })
39
24
  end
40
25
  end
41
26
 
@@ -89,4 +74,17 @@ describe Mongoid::Report do
89
74
  expect(Report7.settings).to have_key("example-#{Model.collection.name}")
90
75
  end
91
76
  end
77
+
78
+ class Report10
79
+ include Mongoid::Report
80
+
81
+ aggregation_field :field1, for: Model, as: 'field-name'
82
+ end
83
+
84
+ describe '.aggregation_field `as` option' do
85
+ 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'])
88
+ end
89
+ end
92
90
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid-report
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Korsak