mongoid 5.4.1 → 6.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (264) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/config/locales/en.yml +23 -16
  5. data/lib/mongoid.rb +4 -9
  6. data/lib/mongoid/atomic.rb +1 -1
  7. data/lib/mongoid/atomic/modifiers.rb +8 -12
  8. data/lib/mongoid/attributes.rb +9 -11
  9. data/lib/mongoid/attributes/dynamic.rb +5 -6
  10. data/lib/mongoid/attributes/nested.rb +1 -1
  11. data/lib/mongoid/attributes/processing.rb +4 -0
  12. data/lib/mongoid/attributes/readonly.rb +22 -0
  13. data/lib/mongoid/cacheable.rb +36 -0
  14. data/lib/mongoid/changeable.rb +37 -1
  15. data/lib/mongoid/clients.rb +0 -63
  16. data/lib/mongoid/clients/factory.rb +0 -2
  17. data/lib/mongoid/clients/options.rb +54 -249
  18. data/lib/mongoid/clients/storage_options.rb +1 -69
  19. data/lib/mongoid/composable.rb +26 -2
  20. data/lib/mongoid/config.rb +1 -1
  21. data/lib/mongoid/config/options.rb +1 -1
  22. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
  23. data/lib/mongoid/contextual/atomic.rb +6 -9
  24. data/lib/mongoid/contextual/geo_near.rb +2 -3
  25. data/lib/mongoid/contextual/map_reduce.rb +97 -24
  26. data/lib/mongoid/contextual/memory.rb +7 -4
  27. data/lib/mongoid/contextual/mongo.rb +63 -54
  28. data/lib/mongoid/contextual/none.rb +2 -2
  29. data/lib/mongoid/copyable.rb +19 -19
  30. data/lib/mongoid/criteria.rb +5 -4
  31. data/lib/mongoid/criteria/findable.rb +2 -3
  32. data/lib/mongoid/criteria/includable.rb +63 -16
  33. data/lib/mongoid/criteria/marshalable.rb +2 -2
  34. data/lib/mongoid/criteria/modifiable.rb +17 -1
  35. data/lib/mongoid/criteria/options.rb +25 -0
  36. data/lib/mongoid/criteria/queryable.rb +86 -0
  37. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  38. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  39. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  40. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  41. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  42. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  43. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  44. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  45. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  46. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  47. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  48. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  49. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
  50. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  51. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  52. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  53. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  54. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  55. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  56. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  57. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  58. data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
  59. data/lib/mongoid/criteria/queryable/optional.rb +411 -0
  60. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  61. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  62. data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
  63. data/lib/mongoid/criteria/queryable/selector.rb +196 -0
  64. data/lib/mongoid/criteria/queryable/smash.rb +103 -0
  65. data/lib/mongoid/document.rb +9 -23
  66. data/lib/mongoid/errors.rb +2 -1
  67. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  68. data/lib/mongoid/errors/delete_restriction.rb +2 -2
  69. data/lib/mongoid/errors/invalid_field.rb +2 -2
  70. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  71. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  72. data/lib/mongoid/errors/inverse_not_found.rb +1 -1
  73. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  74. data/lib/mongoid/evolvable.rb +1 -1
  75. data/lib/mongoid/extensions.rb +0 -5
  76. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  77. data/lib/mongoid/extensions/date.rb +4 -1
  78. data/lib/mongoid/extensions/hash.rb +2 -3
  79. data/lib/mongoid/extensions/object.rb +2 -2
  80. data/lib/mongoid/extensions/string.rb +4 -3
  81. data/lib/mongoid/extensions/time.rb +5 -2
  82. data/lib/mongoid/factory.rb +1 -0
  83. data/lib/mongoid/fields/foreign_key.rb +2 -2
  84. data/lib/mongoid/fields/localized.rb +3 -8
  85. data/lib/mongoid/fields/validators/macro.rb +18 -0
  86. data/lib/mongoid/findable.rb +3 -3
  87. data/lib/mongoid/indexable.rb +17 -16
  88. data/lib/mongoid/indexable/specification.rb +1 -1
  89. data/lib/mongoid/indexable/validators/options.rb +1 -2
  90. data/lib/mongoid/interceptable.rb +6 -17
  91. data/lib/mongoid/loggable.rb +1 -1
  92. data/lib/mongoid/matchable.rb +3 -10
  93. data/lib/mongoid/matchable/gt.rb +2 -0
  94. data/lib/mongoid/matchable/gte.rb +2 -0
  95. data/lib/mongoid/matchable/lt.rb +2 -0
  96. data/lib/mongoid/matchable/lte.rb +2 -0
  97. data/lib/mongoid/persistable.rb +6 -5
  98. data/lib/mongoid/persistable/creatable.rb +2 -0
  99. data/lib/mongoid/persistable/deletable.rb +7 -3
  100. data/lib/mongoid/persistable/settable.rb +3 -16
  101. data/lib/mongoid/persistable/updatable.rb +10 -12
  102. data/lib/mongoid/persistence_context.rb +216 -0
  103. data/lib/mongoid/query_cache.rb +5 -30
  104. data/lib/mongoid/relations/accessors.rb +6 -2
  105. data/lib/mongoid/relations/auto_save.rb +12 -4
  106. data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
  107. data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
  108. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
  109. data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
  110. data/lib/mongoid/relations/builders.rb +2 -2
  111. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  112. data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
  113. data/lib/mongoid/relations/conversions.rb +1 -1
  114. data/lib/mongoid/relations/counter_cache.rb +28 -18
  115. data/lib/mongoid/relations/eager.rb +19 -7
  116. data/lib/mongoid/relations/eager/base.rb +5 -5
  117. data/lib/mongoid/relations/embedded/batchable.rb +9 -33
  118. data/lib/mongoid/relations/embedded/in.rb +16 -2
  119. data/lib/mongoid/relations/embedded/many.rb +23 -8
  120. data/lib/mongoid/relations/embedded/one.rb +17 -2
  121. data/lib/mongoid/relations/macros.rb +9 -2
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/nested_builder.rb +1 -1
  124. data/lib/mongoid/relations/options.rb +2 -2
  125. data/lib/mongoid/relations/proxy.rb +2 -33
  126. data/lib/mongoid/relations/referenced/in.rb +23 -11
  127. data/lib/mongoid/relations/referenced/many.rb +24 -16
  128. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  129. data/lib/mongoid/relations/referenced/one.rb +17 -1
  130. data/lib/mongoid/relations/reflections.rb +3 -5
  131. data/lib/mongoid/relations/touchable.rb +1 -1
  132. data/lib/mongoid/reloadable.rb +1 -1
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +2 -3
  135. data/lib/mongoid/tasks/database.rb +1 -2
  136. data/lib/mongoid/threaded.rb +4 -4
  137. data/lib/mongoid/traversable.rb +1 -1
  138. data/lib/mongoid/validatable.rb +1 -1
  139. data/lib/mongoid/validatable/macros.rb +2 -4
  140. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  141. data/lib/mongoid/version.rb +1 -1
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
  143. data/spec/app/models/album.rb +5 -1
  144. data/spec/app/models/artist.rb +21 -0
  145. data/spec/app/models/band.rb +0 -1
  146. data/spec/app/models/church.rb +0 -2
  147. data/spec/app/models/ordered_post.rb +5 -0
  148. data/spec/app/models/oscar.rb +1 -2
  149. data/spec/app/models/person.rb +3 -1
  150. data/spec/app/models/post.rb +0 -1
  151. data/spec/app/models/princess.rb +2 -0
  152. data/spec/app/models/record.rb +1 -0
  153. data/spec/app/models/thing.rb +1 -1
  154. data/spec/config/mongoid.yml +1 -5
  155. data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
  156. data/spec/mongoid/atomic_spec.rb +17 -17
  157. data/spec/mongoid/attributes/nested_spec.rb +14 -14
  158. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  159. data/spec/mongoid/attributes_spec.rb +63 -0
  160. data/spec/mongoid/cacheable_spec.rb +112 -0
  161. data/spec/mongoid/changeable_spec.rb +58 -0
  162. data/spec/mongoid/clients/factory_spec.rb +3 -11
  163. data/spec/mongoid/clients/options_spec.rb +378 -96
  164. data/spec/mongoid/clients_spec.rb +207 -170
  165. data/spec/mongoid/composable_spec.rb +7 -0
  166. data/spec/mongoid/config_spec.rb +41 -21
  167. data/spec/mongoid/contextual/atomic_spec.rb +77 -343
  168. data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
  169. data/spec/mongoid/contextual/memory_spec.rb +56 -316
  170. data/spec/mongoid/contextual/mongo_spec.rb +104 -378
  171. data/spec/mongoid/copyable_spec.rb +8 -15
  172. data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
  173. data/spec/mongoid/criteria/options_spec.rb +29 -0
  174. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  175. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  176. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  177. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  178. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  179. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  180. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  181. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  182. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  183. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  184. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  185. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  186. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  187. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  188. data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
  189. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  190. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  191. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  192. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  193. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  194. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  195. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  196. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  197. data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
  198. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  199. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  200. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  201. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
  202. data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
  203. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  204. data/spec/mongoid/criteria_spec.rb +45 -63
  205. data/spec/mongoid/document_spec.rb +21 -88
  206. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  207. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  208. data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
  209. data/spec/mongoid/extensions/date_spec.rb +2 -6
  210. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  211. data/spec/mongoid/extensions/float_spec.rb +8 -1
  212. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  213. data/spec/mongoid/extensions/object_spec.rb +11 -0
  214. data/spec/mongoid/extensions/string_spec.rb +21 -0
  215. data/spec/mongoid/extensions/time_spec.rb +4 -8
  216. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  217. data/spec/mongoid/fields/localized_spec.rb +0 -91
  218. data/spec/mongoid/findable_spec.rb +46 -1
  219. data/spec/mongoid/indexable_spec.rb +6 -46
  220. data/spec/mongoid/interceptable_spec.rb +49 -10
  221. data/spec/mongoid/matchable/gt_spec.rb +11 -0
  222. data/spec/mongoid/matchable/gte_spec.rb +10 -0
  223. data/spec/mongoid/matchable/lt_spec.rb +11 -0
  224. data/spec/mongoid/matchable/lte_spec.rb +11 -0
  225. data/spec/mongoid/matchable_spec.rb +1 -51
  226. data/spec/mongoid/persistable/creatable_spec.rb +2 -2
  227. data/spec/mongoid/persistable/deletable_spec.rb +1 -1
  228. data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
  229. data/spec/mongoid/persistable/savable_spec.rb +30 -30
  230. data/spec/mongoid/persistable/settable_spec.rb +0 -185
  231. data/spec/mongoid/persistable/updatable_spec.rb +166 -5
  232. data/spec/mongoid/persistence_context_spec.rb +654 -0
  233. data/spec/mongoid/positional_spec.rb +10 -10
  234. data/spec/mongoid/query_cache_spec.rb +89 -65
  235. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  236. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  237. data/spec/mongoid/relations/builders_spec.rb +37 -10
  238. data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
  239. data/spec/mongoid/relations/cyclic_spec.rb +0 -22
  240. data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
  241. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  242. data/spec/mongoid/relations/macros_spec.rb +395 -7
  243. data/spec/mongoid/relations/proxy_spec.rb +3 -1
  244. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  245. data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
  246. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
  247. data/spec/mongoid/relations/reflections_spec.rb +9 -9
  248. data/spec/mongoid/reloadable_spec.rb +51 -0
  249. data/spec/mongoid/scopable_spec.rb +0 -12
  250. data/spec/mongoid/serializable_spec.rb +0 -50
  251. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  252. data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
  253. data/spec/mongoid/validatable_spec.rb +16 -0
  254. data/spec/spec_helper.rb +10 -10
  255. metadata +536 -479
  256. metadata.gz.sig +0 -0
  257. data/lib/mongoid/clients/thread_options.rb +0 -19
  258. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
  259. data/lib/mongoid/extensions/decimal128.rb +0 -39
  260. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  261. data/lib/mongoid/matchable/regexp.rb +0 -27
  262. data/spec/app/models/post_genre.rb +0 -6
  263. data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
  264. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
@@ -32,15 +32,15 @@ describe Mongoid::Contextual::MapReduce do
32
32
  Band.collection
33
33
  end
34
34
 
35
- let(:criteria) do
36
- Band.all
37
- end
35
+ describe "#command" do
38
36
 
39
- let(:map_reduce) do
40
- described_class.new(collection, criteria, map, reduce)
41
- end
37
+ let(:criteria) do
38
+ Band.all
39
+ end
42
40
 
43
- describe "#command" do
41
+ let(:map_reduce) do
42
+ described_class.new(collection, criteria, map, reduce)
43
+ end
44
44
 
45
45
  let(:base_command) do
46
46
  {
@@ -51,25 +51,27 @@ describe Mongoid::Contextual::MapReduce do
51
51
  }
52
52
  end
53
53
 
54
- context "with sort" do
54
+ it "returns the db command" do
55
+ expect(map_reduce.command).to eq(base_command)
56
+ end
55
57
 
58
+ context "with sort" do
56
59
  let(:criteria) do
57
60
  Band.order_by(name: -1)
58
61
  end
59
62
 
60
- it "includes a sort option in the map reduce command" do
61
- expect(map_reduce.command[:sort]).to eq('name' => -1)
63
+ it "returns the db command with a sort option" do
64
+ expect(map_reduce.command).to eq(base_command.merge(sort: {'name' => -1}))
62
65
  end
63
66
  end
64
67
 
65
68
  context "with limit" do
66
-
67
69
  let(:criteria) do
68
70
  Band.limit(10)
69
71
  end
70
72
 
71
73
  it "returns the db command with a limit option" do
72
- expect(map_reduce.command[:limit]).to eq(10)
74
+ expect(map_reduce.command).to eq(base_command.merge(limit: 10))
73
75
  end
74
76
  end
75
77
  end
@@ -80,6 +82,10 @@ describe Mongoid::Contextual::MapReduce do
80
82
  Band.all
81
83
  end
82
84
 
85
+ let(:map_reduce) do
86
+ described_class.new(collection, criteria, map, reduce)
87
+ end
88
+
83
89
  let(:counts) do
84
90
  map_reduce.out(inline: 1).counts
85
91
  end
@@ -96,6 +102,14 @@ describe Mongoid::Contextual::MapReduce do
96
102
 
97
103
  describe "#each" do
98
104
 
105
+ let(:criteria) do
106
+ Band.all
107
+ end
108
+
109
+ let(:map_reduce) do
110
+ described_class.new(collection, criteria, map, reduce)
111
+ end
112
+
99
113
  context "when the map/reduce is inline" do
100
114
 
101
115
  let(:results) do
@@ -116,40 +130,20 @@ describe Mongoid::Contextual::MapReduce do
116
130
  map_reduce.out(replace: "mr-output")
117
131
  end
118
132
 
119
- let(:expected_results) do
120
- [
133
+ it "iterates over the results" do
134
+ expect(results.entries).to eq([
121
135
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
122
136
  { "_id" => "Tool", "value" => { "likes" => 100 }}
123
- ]
124
- end
125
-
126
- it "iterates over the results" do
127
- expect(results.entries).to eq(expected_results)
128
- end
129
-
130
- it 'outputs to the collection' do
131
- expect(results.entries).to eq(map_reduce.criteria.view.database["mr-output"].find.to_a)
137
+ ])
132
138
  end
133
139
  end
134
140
 
135
141
  context "when no output is provided" do
136
142
 
137
- context "when the results are iterated" do
138
-
139
- it "raises an error" do
140
- expect {
141
- map_reduce.entries
142
- }.to raise_error(Mongoid::Errors::NoMapReduceOutput)
143
- end
144
- end
145
-
146
- context "when the statstics are requested" do
147
-
148
- it "raises an error" do
149
- expect {
150
- map_reduce.counts
151
- }.to raise_error(Mongoid::Errors::NoMapReduceOutput)
152
- end
143
+ it "raises an error" do
144
+ expect {
145
+ map_reduce.entries
146
+ }.to raise_error(Mongoid::Errors::NoMapReduceOutput)
153
147
  end
154
148
  end
155
149
 
@@ -167,46 +161,17 @@ describe Mongoid::Contextual::MapReduce do
167
161
  expect(results.entries).to be_empty
168
162
  end
169
163
  end
164
+ end
170
165
 
171
- context "when there is a collation on the criteria" do
172
-
173
- let(:map) do
174
- %Q{
175
- function() {
176
- emit(this.name, 1);
177
- }}
178
- end
179
-
180
- let(:reduce) do
181
- %Q{
182
- function(key, values) {
183
- return Array.sum(values);
184
- }}
185
- end
186
-
187
- let(:criteria) do
188
- Band.where(name: 'DEPECHE MODE').collation(locale: 'en_US', strength: 2)
189
- end
190
-
191
- context 'when the server supports collations', if: collation_supported? do
192
-
193
- it 'applies the collation' do
194
- expect(map_reduce.out(inline: 1).count).to eq(1)
195
- end
196
- end
197
-
198
- context 'when the server does not support collations', unless: collation_supported? do
166
+ describe "#emitted" do
199
167
 
200
- it 'raises an exception' do
201
- expect {
202
- map_reduce.out(inline: 1).to_a
203
- }.to raise_exception(Mongo::Error::UnsupportedCollation)
204
- end
205
- end
168
+ let(:criteria) do
169
+ Band.all
206
170
  end
207
- end
208
171
 
209
- describe "#emitted" do
172
+ let(:map_reduce) do
173
+ described_class.new(collection, criteria, map, reduce)
174
+ end
210
175
 
211
176
  let(:emitted) do
212
177
  map_reduce.out(inline: 1).emitted
@@ -219,8 +184,16 @@ describe Mongoid::Contextual::MapReduce do
219
184
 
220
185
  describe "#empty?" do
221
186
 
187
+ let(:map_reduce) do
188
+ described_class.new(collection, criteria, map, reduce)
189
+ end
190
+
222
191
  context "when the map/reduce has results" do
223
192
 
193
+ let(:criteria) do
194
+ Band.all
195
+ end
196
+
224
197
  let(:results) do
225
198
  map_reduce.out(inline: 1)
226
199
  end
@@ -248,6 +221,14 @@ describe Mongoid::Contextual::MapReduce do
248
221
 
249
222
  describe "#finalize" do
250
223
 
224
+ let(:criteria) do
225
+ Band.all
226
+ end
227
+
228
+ let(:map_reduce) do
229
+ described_class.new(collection, criteria, map, reduce)
230
+ end
231
+
251
232
  let(:finalized) do
252
233
  map_reduce.finalize("testing")
253
234
  end
@@ -259,6 +240,14 @@ describe Mongoid::Contextual::MapReduce do
259
240
 
260
241
  describe "#input" do
261
242
 
243
+ let(:criteria) do
244
+ Band.all
245
+ end
246
+
247
+ let(:map_reduce) do
248
+ described_class.new(collection, criteria, map, reduce)
249
+ end
250
+
262
251
  let(:input) do
263
252
  map_reduce.out(inline: 1).input
264
253
  end
@@ -270,6 +259,14 @@ describe Mongoid::Contextual::MapReduce do
270
259
 
271
260
  describe "#js_mode" do
272
261
 
262
+ let(:criteria) do
263
+ Band.all
264
+ end
265
+
266
+ let(:map_reduce) do
267
+ described_class.new(collection, criteria, map, reduce)
268
+ end
269
+
273
270
  let(:results) do
274
271
  map_reduce.out(inline: 1).js_mode
275
272
  end
@@ -281,6 +278,14 @@ describe Mongoid::Contextual::MapReduce do
281
278
 
282
279
  describe "#out" do
283
280
 
281
+ let(:criteria) do
282
+ Band.all
283
+ end
284
+
285
+ let(:map_reduce) do
286
+ described_class.new(collection, criteria, map, reduce)
287
+ end
288
+
284
289
  context "when providing inline" do
285
290
 
286
291
  let(:out) do
@@ -288,7 +293,7 @@ describe Mongoid::Contextual::MapReduce do
288
293
  end
289
294
 
290
295
  it "sets the out command" do
291
- expect(out.command[:out][:inline]).to eq(1)
296
+ expect(out.command[:out]).to eq(inline: 1)
292
297
  end
293
298
  end
294
299
 
@@ -301,7 +306,7 @@ describe Mongoid::Contextual::MapReduce do
301
306
  end
302
307
 
303
308
  it "sets the out command value to a string" do
304
- expect(out.command[:out][:replace]).to eq('test')
309
+ expect(out.command[:out]).to eq(replace: "test")
305
310
  end
306
311
  end
307
312
  end
@@ -309,6 +314,14 @@ describe Mongoid::Contextual::MapReduce do
309
314
 
310
315
  describe "#output" do
311
316
 
317
+ let(:criteria) do
318
+ Band.all
319
+ end
320
+
321
+ let(:map_reduce) do
322
+ described_class.new(collection, criteria, map, reduce)
323
+ end
324
+
312
325
  let(:output) do
313
326
  map_reduce.out(inline: 1).output
314
327
  end
@@ -318,44 +331,15 @@ describe Mongoid::Contextual::MapReduce do
318
331
  end
319
332
  end
320
333
 
321
- describe "#raw" do
322
-
323
- let(:client) do
324
- collection.database.client
325
- end
326
-
327
- context "when not specifying an out" do
334
+ describe "#reduced" do
328
335
 
329
- it "raises a NoMapReduceOutput error" do
330
- expect {
331
- map_reduce.raw
332
- }.to raise_error(Mongoid::Errors::NoMapReduceOutput)
333
- end
336
+ let(:criteria) do
337
+ Band.all
334
338
  end
335
339
 
336
- context "when providing replace" do
337
-
338
- let(:replace_map_reduce) do
339
- map_reduce.out(replace: 'output-collection')
340
- end
341
-
342
- context 'when a read preference is defined' do
343
-
344
- let(:criteria) do
345
- Band.all.read(mode: :secondary)
346
- end
347
-
348
- it "uses the read preference", if: testing_replica_set? do
349
-
350
- expect {
351
- replace_map_reduce.raw
352
- }.to raise_exception(Mongo::Error::OperationFailure)
353
- end
354
- end
340
+ let(:map_reduce) do
341
+ described_class.new(collection, criteria, map, reduce)
355
342
  end
356
- end
357
-
358
- describe "#reduced" do
359
343
 
360
344
  let(:reduced) do
361
345
  map_reduce.out(inline: 1).reduced
@@ -368,6 +352,14 @@ describe Mongoid::Contextual::MapReduce do
368
352
 
369
353
  describe "#scope" do
370
354
 
355
+ let(:criteria) do
356
+ Band.all
357
+ end
358
+
359
+ let(:map_reduce) do
360
+ described_class.new(collection, criteria, map, reduce)
361
+ end
362
+
371
363
  let(:finalize) do
372
364
  %Q{
373
365
  function(key, value) {
@@ -387,6 +379,14 @@ describe Mongoid::Contextual::MapReduce do
387
379
 
388
380
  describe "#time" do
389
381
 
382
+ let(:criteria) do
383
+ Band.all
384
+ end
385
+
386
+ let(:map_reduce) do
387
+ described_class.new(collection, criteria, map, reduce)
388
+ end
389
+
390
390
  let(:time) do
391
391
  map_reduce.out(inline: 1).time
392
392
  end
@@ -398,6 +398,14 @@ describe Mongoid::Contextual::MapReduce do
398
398
 
399
399
  describe "#execute" do
400
400
 
401
+ let(:criteria) do
402
+ Band.all
403
+ end
404
+
405
+ let(:map_reduce) do
406
+ described_class.new(collection, criteria, map, reduce)
407
+ end
408
+
401
409
  let(:execution_results) do
402
410
  map_reduce.out(inline: 1).execute
403
411
  end
@@ -47,21 +47,6 @@ describe Mongoid::Contextual::Memory do
47
47
  expect(context.send(method)).to be true
48
48
  end
49
49
  end
50
-
51
- context 'when there is a collation on the criteria' do
52
-
53
- let(:criteria) do
54
- Address.where(street: "hobrecht").tap do |crit|
55
- crit.documents = [ hobrecht, friedel ]
56
- end.collation(locale: 'en_US', strength: 2)
57
- end
58
-
59
- it "raises an exception" do
60
- expect {
61
- context.send(method)
62
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
63
- end
64
- end
65
50
  end
66
51
  end
67
52
 
@@ -92,21 +77,6 @@ describe Mongoid::Contextual::Memory do
92
77
  end
93
78
  end
94
79
 
95
- context 'when there is a collation on the criteria' do
96
-
97
- let(:criteria) do
98
- Address.where(street: "hobrecht").tap do |crit|
99
- crit.documents = [ hobrecht, friedel ]
100
- end.collation(locale: 'en_US', strength: 2)
101
- end
102
-
103
- it "raises an exception" do
104
- expect {
105
- context.count
106
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
107
- end
108
- end
109
-
110
80
  context "when provided a document" do
111
81
 
112
82
  context "when the document matches" do
@@ -275,21 +245,6 @@ describe Mongoid::Contextual::Memory do
275
245
  expect(deleted).to eq(1)
276
246
  end
277
247
  end
278
-
279
- context 'when there is a collation on the criteria' do
280
-
281
- let(:criteria) do
282
- Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
283
- crit.documents = [ hobrecht, friedel, pfluger ]
284
- end.collation(locale: 'en_US', strength: 2)
285
- end
286
-
287
- it "raises an exception" do
288
- expect {
289
- context.send(method)
290
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
291
- end
292
- end
293
248
  end
294
249
  end
295
250
 
@@ -323,54 +278,36 @@ describe Mongoid::Contextual::Memory do
323
278
 
324
279
  describe "##{method}" do
325
280
 
326
- context 'when there is no collation on the criteria' do
327
-
328
- let!(:destroyed) do
329
- context.send(method)
330
- end
331
-
332
- it "deletes the first matching document" do
333
- expect(hobrecht).to be_destroyed
334
- end
335
-
336
- it "deletes the last matching document" do
337
- expect(friedel).to be_destroyed
338
- end
339
-
340
- it "does not delete non matching docs" do
341
- expect(pfluger).to_not be_destroyed
342
- end
281
+ let!(:destroyed) do
282
+ context.send(method)
283
+ end
343
284
 
344
- it "removes the docs from the relation" do
345
- expect(person.addresses).to eq([ pfluger ])
346
- end
285
+ it "deletes the first matching document" do
286
+ expect(hobrecht).to be_destroyed
287
+ end
347
288
 
348
- it "removes the docs from the context" do
349
- expect(context.entries).to be_empty
350
- end
289
+ it "deletes the last matching document" do
290
+ expect(friedel).to be_destroyed
291
+ end
351
292
 
352
- it "persists the changes to the database" do
353
- expect(person.reload.addresses).to eq([ pfluger ])
354
- end
293
+ it "does not delete non matching docs" do
294
+ expect(pfluger).to_not be_destroyed
295
+ end
355
296
 
356
- it "returns the number of destroyed documents" do
357
- expect(destroyed).to eq(2)
358
- end
297
+ it "removes the docs from the relation" do
298
+ expect(person.addresses).to eq([ pfluger ])
359
299
  end
360
300
 
361
- context 'when there is a collation on the criteria' do
301
+ it "removes the docs from the context" do
302
+ expect(context.entries).to be_empty
303
+ end
362
304
 
363
- let(:criteria) do
364
- Address.any_in(street: [ "hobrecht", "friedel" ]).tap do |crit|
365
- crit.documents = [ hobrecht, friedel, pfluger ]
366
- end.collation(locale: 'en_US', strength: 2)
367
- end
305
+ it "persists the changes to the database" do
306
+ expect(person.reload.addresses).to eq([ pfluger ])
307
+ end
368
308
 
369
- it "raises an exception" do
370
- expect {
371
- context.send(method)
372
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
373
- end
309
+ it "returns the number of destroyed documents" do
310
+ expect(destroyed).to eq(2)
374
311
  end
375
312
  end
376
313
  end
@@ -418,21 +355,6 @@ describe Mongoid::Contextual::Memory do
418
355
  expect(context.distinct(:street)).to eq([ "hobrecht", "friedel" ])
419
356
  end
420
357
  end
421
-
422
- context 'when there is a collation on the criteria' do
423
-
424
- let(:criteria) do
425
- Address.where(street: "hobrecht").tap do |crit|
426
- crit.documents = [ hobrecht, hobrecht, friedel ]
427
- end.collation(locale: 'en_US', strength: 2)
428
- end
429
-
430
- it "raises an exception" do
431
- expect {
432
- context.distinct(:street)
433
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
434
- end
435
- end
436
358
  end
437
359
 
438
360
  describe "#each" do
@@ -519,21 +441,6 @@ describe Mongoid::Contextual::Memory do
519
441
  end
520
442
  end
521
443
  end
522
-
523
- context 'when there is a collation on the criteria' do
524
-
525
- let(:criteria) do
526
- Address.where(street: "hobrecht").tap do |crit|
527
- crit.documents = [ hobrecht, friedel ]
528
- end.collation(locale: 'en_US', strength: 2)
529
- end
530
-
531
- it "raises an exception" do
532
- expect {
533
- context.each
534
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
535
- end
536
- end
537
444
  end
538
445
 
539
446
  describe "#exists?" do
@@ -579,21 +486,6 @@ describe Mongoid::Contextual::Memory do
579
486
  expect(context).to_not be_exists
580
487
  end
581
488
  end
582
-
583
- context 'when there is a collation on the criteria' do
584
-
585
- let(:criteria) do
586
- Address.where(street: "pfluger").tap do |crit|
587
- crit.documents = [ hobrecht, friedel ]
588
- end.collation(locale: 'en_US', strength: 2)
589
- end
590
-
591
- it "raises an exception" do
592
- expect {
593
- context
594
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
595
- end
596
- end
597
489
  end
598
490
 
599
491
  [ :first, :one ].each do |method|
@@ -621,21 +513,6 @@ describe Mongoid::Contextual::Memory do
621
513
  it "returns the first matching document" do
622
514
  expect(context.send(method)).to eq(hobrecht)
623
515
  end
624
-
625
- context 'when there is a collation on the criteria' do
626
-
627
- let(:criteria) do
628
- Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
629
- crit.documents = [ hobrecht, friedel ]
630
- end.collation(locale: 'en_US', strength: 2)
631
- end
632
-
633
- it "raises an exception" do
634
- expect {
635
- context.send(method)
636
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
637
- end
638
- end
639
516
  end
640
517
  end
641
518
 
@@ -723,21 +600,6 @@ describe Mongoid::Contextual::Memory do
723
600
  expect(context).to eq([ hobrecht ])
724
601
  end
725
602
  end
726
-
727
- context 'when there is a collation on the criteria' do
728
-
729
- let(:criteria) do
730
- Address.all.limit(1).tap do |crit|
731
- crit.documents = [ hobrecht, friedel ]
732
- end.collation(locale: 'en_US', strength: 2)
733
- end
734
-
735
- it "raises an exception" do
736
- expect {
737
- context
738
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
739
- end
740
- end
741
603
  end
742
604
 
743
605
  describe "#last" do
@@ -763,21 +625,6 @@ describe Mongoid::Contextual::Memory do
763
625
  it "returns the last matching document" do
764
626
  expect(context.last).to eq(friedel)
765
627
  end
766
-
767
- context 'when there is a collation on the criteria' do
768
-
769
- let(:criteria) do
770
- Address.where(:street.in => [ "hobrecht", "friedel" ]).tap do |crit|
771
- crit.documents = [ hobrecht, friedel ]
772
- end.collation(locale: 'en_US', strength: 2)
773
- end
774
-
775
- it "raises an exception" do
776
- expect {
777
- context.last
778
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
779
- end
780
- end
781
628
  end
782
629
 
783
630
  [ :length, :size ].each do |method|
@@ -825,21 +672,6 @@ describe Mongoid::Contextual::Memory do
825
672
  expect(context.send(method)).to eq(0)
826
673
  end
827
674
  end
828
-
829
- context 'when there is a collation on the criteria' do
830
-
831
- let(:criteria) do
832
- Address.where(street: "hobrecht").tap do |crit|
833
- crit.documents = [ hobrecht, friedel ]
834
- end.collation(locale: 'en_US', strength: 2)
835
- end
836
-
837
- it "raises an exception" do
838
- expect {
839
- context.send(method)
840
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
841
- end
842
- end
843
675
  end
844
676
  end
845
677
 
@@ -867,50 +699,32 @@ describe Mongoid::Contextual::Memory do
867
699
  described_class.new(criteria)
868
700
  end
869
701
 
870
- context 'when there is no collation on the criteria' do
871
-
872
- let!(:limit) do
873
- context.limit(2)
874
- end
875
-
876
- it "returns the context" do
877
- expect(limit).to eq(context)
878
- end
879
-
880
- context "when asking for all documents" do
881
-
882
- context "when only a limit exists" do
702
+ let!(:limit) do
703
+ context.limit(2)
704
+ end
883
705
 
884
- it "only returns the limited documents" do
885
- expect(context.entries).to eq([ hobrecht, friedel ])
886
- end
887
- end
706
+ it "returns the context" do
707
+ expect(limit).to eq(context)
708
+ end
888
709
 
889
- context "when a skip and limit exist" do
710
+ context "when asking for all documents" do
890
711
 
891
- before do
892
- limit.skip(1)
893
- end
712
+ context "when only a limit exists" do
894
713
 
895
- it "applies the skip before the limit" do
896
- expect(context.entries).to eq([ friedel, pfluger ])
897
- end
714
+ it "only returns the limited documents" do
715
+ expect(context.entries).to eq([ hobrecht, friedel ])
898
716
  end
899
717
  end
900
- end
901
718
 
902
- context 'when there is a collation on the criteria' do
719
+ context "when a skip and limit exist" do
903
720
 
904
- let(:criteria) do
905
- Address.all.tap do |crit|
906
- crit.documents = [ hobrecht, friedel, pfluger ]
907
- end.collation(locale: 'en_US', strength: 2)
908
- end
721
+ before do
722
+ limit.skip(1)
723
+ end
909
724
 
910
- it "raises an exception" do
911
- expect {
912
- context.limit(2)
913
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
725
+ it "applies the skip before the limit" do
726
+ expect(context.entries).to eq([ friedel, pfluger ])
727
+ end
914
728
  end
915
729
  end
916
730
  end
@@ -970,21 +784,6 @@ describe Mongoid::Contextual::Memory do
970
784
  end
971
785
  end
972
786
  end
973
-
974
- context 'when there is a collation on the criteria' do
975
-
976
- let(:criteria) do
977
- Address.all.tap do |crit|
978
- crit.documents = [ hobrecht, friedel ]
979
- end.collation(locale: 'en_US', strength: 2)
980
- end
981
-
982
- it "raises an exception" do
983
- expect {
984
- context.pluck(:foo, :bar)
985
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
986
- end
987
- end
988
787
  end
989
788
 
990
789
  describe "#skip" do
@@ -1011,50 +810,32 @@ describe Mongoid::Contextual::Memory do
1011
810
  described_class.new(criteria)
1012
811
  end
1013
812
 
1014
- context 'when there is no collation on the criteria' do
1015
-
1016
- let!(:skip) do
1017
- context.skip(1)
1018
- end
1019
-
1020
- it "returns the context" do
1021
- expect(skip).to eq(context)
1022
- end
1023
-
1024
- context "when asking for all documents" do
1025
-
1026
- context "when only a skip exists" do
813
+ let!(:skip) do
814
+ context.skip(1)
815
+ end
1027
816
 
1028
- it "skips the correct number" do
1029
- expect(context.entries).to eq([ friedel, pfluger ])
1030
- end
1031
- end
817
+ it "returns the context" do
818
+ expect(skip).to eq(context)
819
+ end
1032
820
 
1033
- context "when a skip and limit exist" do
821
+ context "when asking for all documents" do
1034
822
 
1035
- before do
1036
- skip.limit(1)
1037
- end
823
+ context "when only a skip exists" do
1038
824
 
1039
- it "applies the skip before the limit" do
1040
- expect(context.entries).to eq([ friedel ])
1041
- end
825
+ it "skips the correct number" do
826
+ expect(context.entries).to eq([ friedel, pfluger ])
1042
827
  end
1043
828
  end
1044
- end
1045
829
 
1046
- context 'when there is a collation on the criteria' do
830
+ context "when a skip and limit exist" do
1047
831
 
1048
- let(:criteria) do
1049
- Address.all.tap do |crit|
1050
- crit.documents = [ hobrecht, friedel, pfluger ]
1051
- end.collation(locale: 'en_US', strength: 2)
1052
- end
832
+ before do
833
+ skip.limit(1)
834
+ end
1053
835
 
1054
- it "raises an exception" do
1055
- expect {
1056
- context.skip(1)
1057
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
836
+ it "applies the skip before the limit" do
837
+ expect(context.entries).to eq([ friedel ])
838
+ end
1058
839
  end
1059
840
  end
1060
841
  end
@@ -1210,21 +991,6 @@ describe Mongoid::Contextual::Memory do
1210
991
  expect(context.entries).to eq([ friedel, hobrecht, pfluger ])
1211
992
  end
1212
993
  end
1213
-
1214
- context 'when there is a collation on the criteria' do
1215
-
1216
- let(:criteria) do
1217
- Address.all.tap do |crit|
1218
- crit.documents = [ hobrecht, friedel, pfluger ]
1219
- end.collation(locale: 'en_US', strength: 2)
1220
- end
1221
-
1222
- it "raises an exception" do
1223
- expect {
1224
- context.sort(state: 1)
1225
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1226
- end
1227
- end
1228
994
  end
1229
995
 
1230
996
  describe "#update" do
@@ -1352,19 +1118,6 @@ describe Mongoid::Contextual::Memory do
1352
1118
  end
1353
1119
  end
1354
1120
  end
1355
-
1356
- context 'when there is a collation on the criteria' do
1357
-
1358
- let(:criteria) do
1359
- Address.all.collation(locale: 'en_US', strength: 2)
1360
- end
1361
-
1362
- it "raises an exception" do
1363
- expect {
1364
- context.update
1365
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1366
- end
1367
- end
1368
1121
  end
1369
1122
 
1370
1123
  describe "#update_all" do
@@ -1385,19 +1138,6 @@ describe Mongoid::Contextual::Memory do
1385
1138
  person.addresses.create(street: "pfluger")
1386
1139
  end
1387
1140
 
1388
- context 'when there is a collation on the criteria' do
1389
-
1390
- let(:criteria) do
1391
- Address.all.collation(locale: 'en_US', strength: 2)
1392
- end
1393
-
1394
- it "raises an exception" do
1395
- expect {
1396
- context.update_all({})
1397
- }.to raise_exception(Mongoid::Errors::InMemoryCollationNotSupported)
1398
- end
1399
- end
1400
-
1401
1141
  context "when the documents are empty" do
1402
1142
 
1403
1143
  let(:person_two) do