mongoid 5.4.1 → 6.0.0.beta

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.
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
@@ -115,6 +115,21 @@ describe Mongoid::Contextual::Mongo do
115
115
  end
116
116
  end
117
117
 
118
+ context "when provided a document" do
119
+
120
+ let(:context) do
121
+ described_class.new(criteria)
122
+ end
123
+
124
+ let(:count) do
125
+ context.count(depeche)
126
+ end
127
+
128
+ it "returns the number of documents that match" do
129
+ expect(count).to eq(1)
130
+ end
131
+ end
132
+
118
133
  context "when provided a block" do
119
134
 
120
135
  let(:context) do
@@ -167,28 +182,6 @@ describe Mongoid::Contextual::Mongo do
167
182
  expect(count).to eq(2)
168
183
  end
169
184
  end
170
-
171
- context 'when a collation is specified', if: collation_supported? do
172
-
173
- let(:context) do
174
- described_class.new(criteria)
175
- end
176
-
177
- context 'when the collation is specified on the criteria' do
178
-
179
- let(:criteria) do
180
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
181
- end
182
-
183
- let(:count) do
184
- context.count
185
- end
186
-
187
- it 'applies the collation' do
188
- expect(count).to eq(1)
189
- end
190
- end
191
- end
192
185
  end
193
186
 
194
187
  [ :delete, :delete_all ].each do |method|
@@ -230,34 +223,7 @@ describe Mongoid::Contextual::Mongo do
230
223
  end
231
224
  end
232
225
 
233
- context 'when the criteria has a collation', if: collation_supported? do
234
-
235
- let(:criteria) do
236
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
237
- end
238
-
239
- let(:context) do
240
- described_class.new(criteria)
241
- end
242
-
243
- let!(:deleted) do
244
- context.send(method)
245
- end
246
-
247
- it "deletes the matching documents" do
248
- expect(Band.find(new_order.id)).to eq(new_order)
249
- end
250
-
251
- it "deletes the correct number of documents" do
252
- expect(Band.count).to eq(1)
253
- end
254
-
255
- it "returns the number of documents deleted" do
256
- expect(deleted).to eq(1)
257
- end
258
- end
259
-
260
- context "when the selector is not constraining" do
226
+ context "when the selector is not contraining" do
261
227
 
262
228
  let(:criteria) do
263
229
  Band.all
@@ -315,33 +281,6 @@ describe Mongoid::Contextual::Mongo do
315
281
  it "returns the number of documents destroyed" do
316
282
  expect(destroyed).to eq(1)
317
283
  end
318
-
319
- context 'when the criteria has a collation', if: collation_supported? do
320
-
321
- let(:criteria) do
322
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
323
- end
324
-
325
- let(:context) do
326
- described_class.new(criteria)
327
- end
328
-
329
- let!(:destroyed) do
330
- context.send(method)
331
- end
332
-
333
- it "destroys the matching documents" do
334
- expect(Band.find(new_order.id)).to eq(new_order)
335
- end
336
-
337
- it "destroys the correct number of documents" do
338
- expect(Band.count).to eq(1)
339
- end
340
-
341
- it "returns the number of documents destroyed" do
342
- expect(destroyed).to eq(1)
343
- end
344
- end
345
284
  end
346
285
 
347
286
  context "when the selector is not contraining" do
@@ -416,29 +355,6 @@ describe Mongoid::Contextual::Mongo do
416
355
  expect(context.distinct(:years)).to eq([ 30, 25 ])
417
356
  end
418
357
  end
419
-
420
- context 'when a collation is specified', if: collation_supported? do
421
-
422
- before do
423
- Band.create(name: 'DEPECHE MODE')
424
- end
425
-
426
- let(:context) do
427
- described_class.new(criteria)
428
- end
429
-
430
- let(:expected_results) do
431
- ["Depeche Mode", "New Order"]
432
- end
433
-
434
- let(:criteria) do
435
- Band.where({}).collation(locale: 'en_US', strength: 2)
436
- end
437
-
438
- it 'applies the collation' do
439
- expect(context.distinct(:name)).to eq(expected_results)
440
- end
441
- end
442
358
  end
443
359
 
444
360
  describe "#each" do
@@ -455,29 +371,6 @@ describe Mongoid::Contextual::Mongo do
455
371
  described_class.new(criteria)
456
372
  end
457
373
 
458
- context 'when the criteria has a collation', if: collation_supported? do
459
-
460
- let(:criteria) do
461
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
462
- end
463
-
464
- it "yields mongoid documents to the block" do
465
- context.each do |doc|
466
- expect(doc).to be_a(Mongoid::Document)
467
- end
468
- end
469
-
470
- it "iterates over the matching documents" do
471
- context.each do |doc|
472
- expect(doc.name).to eq("Depeche Mode")
473
- end
474
- end
475
-
476
- it "returns self" do
477
- expect(context.each{}).to be(context)
478
- end
479
- end
480
-
481
374
  context "when providing a block" do
482
375
 
483
376
  it "yields mongoid documents to the block" do
@@ -520,22 +413,9 @@ describe Mongoid::Contextual::Mongo do
520
413
 
521
414
  context "when iterating with next" do
522
415
 
523
- before do
524
- 10.times { |i| Band.create(name: "Test #{i}") }
525
- end
526
-
527
- let(:criteria) do
528
- Band.batch_size(5)
529
- end
530
-
531
416
  it "yields mongoid documents" do
532
417
  expect(enum.next).to be_a(Mongoid::Document)
533
418
  end
534
-
535
- it "does not load all documents" do
536
- expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times.and_call_original
537
- enum.next
538
- end
539
419
  end
540
420
  end
541
421
  end
@@ -677,7 +557,7 @@ describe Mongoid::Contextual::Mongo do
677
557
  end
678
558
  end
679
559
 
680
- describe "#find_one_and_replace" do
560
+ describe "#find_one_and_update" do
681
561
 
682
562
  let!(:depeche) do
683
563
  Band.create(name: "Depeche Mode")
@@ -700,7 +580,7 @@ describe Mongoid::Contextual::Mongo do
700
580
  end
701
581
 
702
582
  let!(:result) do
703
- context.find_one_and_replace(name: 'FKA Twigs')
583
+ context.find_one_and_update("$inc" => { likes: 1 })
704
584
  end
705
585
 
706
586
  it "returns the first matching document" do
@@ -708,7 +588,7 @@ describe Mongoid::Contextual::Mongo do
708
588
  end
709
589
 
710
590
  it "updates the document in the database" do
711
- expect(depeche.reload.name).to eq('FKA Twigs')
591
+ expect(depeche.reload.likes).to eq(1)
712
592
  end
713
593
  end
714
594
 
@@ -723,7 +603,7 @@ describe Mongoid::Contextual::Mongo do
723
603
  end
724
604
 
725
605
  let!(:result) do
726
- context.find_one_and_replace(likes: 1)
606
+ context.find_one_and_update("$inc" => { likes: 1 })
727
607
  end
728
608
 
729
609
  it "returns the first matching document" do
@@ -732,7 +612,6 @@ describe Mongoid::Contextual::Mongo do
732
612
 
733
613
  it "updates the document in the database" do
734
614
  expect(tool.reload.likes).to eq(1)
735
- expect(tool.reload.name).to be_nil
736
615
  end
737
616
  end
738
617
 
@@ -747,7 +626,7 @@ describe Mongoid::Contextual::Mongo do
747
626
  end
748
627
 
749
628
  let!(:result) do
750
- context.find_one_and_replace(name: 'FKA Twigs', likes: 1)
629
+ context.find_one_and_update("$inc" => { likes: 1 })
751
630
  end
752
631
 
753
632
  it "returns the first matching document" do
@@ -774,7 +653,7 @@ describe Mongoid::Contextual::Mongo do
774
653
  end
775
654
 
776
655
  let!(:result) do
777
- context.find_one_and_replace({ likes: 1 }, return_document: :after)
656
+ context.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
778
657
  end
779
658
 
780
659
  it "returns the first matching document" do
@@ -782,15 +661,14 @@ describe Mongoid::Contextual::Mongo do
782
661
  end
783
662
 
784
663
  it "returns the updated document" do
785
- expect(result.name).to be_nil
786
664
  expect(result.likes).to eq(1)
787
665
  end
788
666
  end
789
667
 
790
- context 'when a collation is specified on the criteria', if: collation_supported? do
668
+ context "when removing" do
791
669
 
792
670
  let(:criteria) do
793
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
671
+ Band.where(name: "Depeche Mode")
794
672
  end
795
673
 
796
674
  let(:context) do
@@ -798,16 +676,17 @@ describe Mongoid::Contextual::Mongo do
798
676
  end
799
677
 
800
678
  let!(:result) do
801
- context.find_one_and_replace({ likes: 1 }, return_document: :after)
679
+ context.find_one_and_delete
802
680
  end
803
681
 
804
682
  it "returns the first matching document" do
805
683
  expect(result).to eq(depeche)
806
684
  end
807
685
 
808
- it "returns the updated document" do
809
- expect(result.likes).to eq(1)
810
- expect(result.name).to be_nil
686
+ it "deletes the document from the database" do
687
+ expect {
688
+ depeche.reload
689
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
811
690
  end
812
691
  end
813
692
  end
@@ -815,7 +694,7 @@ describe Mongoid::Contextual::Mongo do
815
694
  context "when the selector does not match" do
816
695
 
817
696
  let(:criteria) do
818
- Band.where(name: "DEPECHE MODE")
697
+ Band.where(name: "Placebo")
819
698
  end
820
699
 
821
700
  let(:context) do
@@ -823,7 +702,7 @@ describe Mongoid::Contextual::Mongo do
823
702
  end
824
703
 
825
704
  let(:result) do
826
- context.find_one_and_replace(name: 'FKA Twigs')
705
+ context.find_one_and_update("$inc" => { likes: 1 })
827
706
  end
828
707
 
829
708
  it "returns nil" do
@@ -832,19 +711,19 @@ describe Mongoid::Contextual::Mongo do
832
711
  end
833
712
  end
834
713
 
835
- describe "#find_one_and_update" do
714
+ [ :first, :one ].each do |method|
836
715
 
837
- let!(:depeche) do
838
- Band.create(name: "Depeche Mode")
839
- end
716
+ describe "##{method}" do
840
717
 
841
- let!(:tool) do
842
- Band.create(name: "Tool")
843
- end
718
+ let!(:depeche_mode) do
719
+ Band.create(name: "Depeche Mode")
720
+ end
844
721
 
845
- context "when the selector matches" do
722
+ let!(:new_order) do
723
+ Band.create(name: "New Order")
724
+ end
846
725
 
847
- context "when not providing options" do
726
+ context "when the context is not cached" do
848
727
 
849
728
  let(:criteria) do
850
729
  Band.where(name: "Depeche Mode")
@@ -854,20 +733,12 @@ describe Mongoid::Contextual::Mongo do
854
733
  described_class.new(criteria)
855
734
  end
856
735
 
857
- let!(:result) do
858
- context.find_one_and_update("$inc" => { likes: 1 })
859
- end
860
-
861
736
  it "returns the first matching document" do
862
- expect(result).to eq(depeche)
863
- end
864
-
865
- it "updates the document in the database" do
866
- expect(depeche.reload.likes).to eq(1)
737
+ expect(context.send(method)).to eq(depeche_mode)
867
738
  end
868
739
  end
869
740
 
870
- context "when sorting" do
741
+ context "when using .desc" do
871
742
 
872
743
  let(:criteria) do
873
744
  Band.desc(:name)
@@ -877,249 +748,104 @@ describe Mongoid::Contextual::Mongo do
877
748
  described_class.new(criteria)
878
749
  end
879
750
 
880
- let!(:result) do
881
- context.find_one_and_update("$inc" => { likes: 1 })
882
- end
883
-
884
- it "returns the first matching document" do
885
- expect(result).to eq(tool)
886
- end
887
-
888
- it "updates the document in the database" do
889
- expect(tool.reload.likes).to eq(1)
890
- end
891
- end
892
-
893
- context "when limiting fields" do
894
-
895
- let(:criteria) do
896
- Band.only(:_id)
897
- end
898
-
899
- let(:context) do
900
- described_class.new(criteria)
901
- end
902
-
903
- let!(:result) do
904
- context.find_one_and_update("$inc" => { likes: 1 })
905
- end
751
+ context "when there is sort on the context" do
906
752
 
907
- it "returns the first matching document" do
908
- expect(result).to eq(depeche)
753
+ it "follows the main sort" do
754
+ expect(context.send(method)).to eq(new_order)
755
+ end
909
756
  end
910
757
 
911
- it "limits the returned fields" do
912
- expect(result.name).to be_nil
913
- end
758
+ context "when subsequently calling #last" do
914
759
 
915
- it "updates the document in the database" do
916
- expect(depeche.reload.likes).to eq(1)
760
+ it "returns the correct document" do
761
+ expect(context.send(method)).to eq(new_order)
762
+ expect(context.last).to eq(depeche_mode)
763
+ end
917
764
  end
918
765
  end
919
766
 
920
- context "when returning new" do
767
+ context 'when the criteria has no sort' do
921
768
 
922
769
  let(:criteria) do
923
- Band.where(name: "Depeche Mode")
770
+ Band.all
924
771
  end
925
772
 
926
773
  let(:context) do
927
774
  described_class.new(criteria)
928
775
  end
929
776
 
930
- let!(:result) do
931
- context.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
932
- end
933
-
934
- it "returns the first matching document" do
935
- expect(result).to eq(depeche)
936
- end
937
-
938
- it "returns the updated document" do
939
- expect(result.likes).to eq(1)
940
- end
941
- end
942
777
 
943
- context 'when a collation is specified on the criteria', if: collation_supported? do
944
-
945
- let(:criteria) do
946
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
947
- end
948
-
949
- let(:context) do
950
- described_class.new(criteria)
951
- end
952
-
953
- let!(:result) do
954
- context.find_one_and_update({ "$inc" => { likes: 1 }}, return_document: :after)
778
+ it 'applies a sort on _id' do
779
+ expect(context.send(method)).to eq(depeche_mode)
955
780
  end
956
781
 
957
- it "returns the first matching document" do
958
- expect(result).to eq(depeche)
959
- end
782
+ context 'when calling #last' do
960
783
 
961
- it "returns the updated document" do
962
- expect(result.likes).to eq(1)
784
+ it 'returns the last document, sorted by _id' do
785
+ expect(context.send(method)).to eq(depeche_mode)
786
+ expect(context.last).to eq(new_order)
787
+ end
963
788
  end
964
- end
965
- end
966
-
967
- context "when the selector does not match" do
968
-
969
- let(:criteria) do
970
- Band.where(name: "Placebo")
971
- end
972
-
973
- let(:context) do
974
- described_class.new(criteria)
975
- end
976
-
977
- let(:result) do
978
- context.find_one_and_update("$inc" => { likes: 1 })
979
- end
980
-
981
- it "returns nil" do
982
- expect(result).to be_nil
983
- end
984
- end
985
- end
986
-
987
- describe "#find_one_and_delete" do
988
-
989
- let!(:depeche) do
990
- Band.create(name: "Depeche Mode")
991
- end
992
-
993
- let(:criteria) do
994
- Band.where(name: "Depeche Mode")
995
- end
996
-
997
- let(:context) do
998
- described_class.new(criteria)
999
- end
1000
-
1001
- let!(:result) do
1002
- context.find_one_and_delete
1003
- end
1004
-
1005
- context 'when the selector matches a document' do
1006
-
1007
- it "returns the first matching document" do
1008
- expect(result).to eq(depeche)
1009
- end
1010
-
1011
- it "deletes the document from the database" do
1012
- expect {
1013
- depeche.reload
1014
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
1015
- end
1016
-
1017
- context 'when a collation is specified on the criteria', if: collation_supported? do
1018
789
 
1019
- let(:criteria) do
1020
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
1021
- end
790
+ context 'with option { sort: :none }' do
1022
791
 
1023
- let(:context) do
1024
- described_class.new(criteria)
1025
- end
792
+ let(:opts) do
793
+ { id_sort: :none }
794
+ end
1026
795
 
1027
- let!(:result) do
1028
- context.find_one_and_delete
1029
- end
796
+ it 'does not apply the sort on _id' do
797
+ expect(context.send(method, opts)).to eq(depeche_mode)
798
+ end
1030
799
 
1031
- it "returns the first matching document" do
1032
- expect(result).to eq(depeche)
1033
- end
800
+ context 'when calling #last' do
1034
801
 
1035
- it "deletes the document from the database" do
1036
- expect {
1037
- depeche.reload
1038
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
802
+ it 'does not apply a sort on _id' do
803
+ expect(context.send(method, opts)).to eq(depeche_mode)
804
+ expect(context.last(opts)).to eq(depeche_mode)
805
+ end
806
+ end
1039
807
  end
1040
808
  end
1041
- end
1042
-
1043
- context 'when the selector does not match a document' do
1044
-
1045
- let(:criteria) do
1046
- Band.where(name: "Placebo")
1047
- end
1048
-
1049
- let(:context) do
1050
- described_class.new(criteria)
1051
- end
1052
-
1053
- let(:result) do
1054
- context.find_one_and_delete
1055
- end
1056
-
1057
- it "returns nil" do
1058
- expect(result).to be_nil
1059
- end
1060
- end
1061
- end
1062
-
1063
- [ :first, :one ].each do |method|
1064
-
1065
- describe "##{method}" do
1066
-
1067
- let!(:depeche_mode) do
1068
- Band.create(name: "Depeche Mode")
1069
- end
1070
-
1071
- let!(:new_order) do
1072
- Band.create(name: "New Order")
1073
- end
1074
809
 
1075
- context "when the context is not cached" do
810
+ context 'when the criteria has a sort' do
1076
811
 
1077
812
  let(:criteria) do
1078
- Band.where(name: "Depeche Mode")
813
+ Band.desc(:name)
1079
814
  end
1080
815
 
1081
816
  let(:context) do
1082
817
  described_class.new(criteria)
1083
818
  end
1084
819
 
1085
- it "returns the first matching document" do
1086
- expect(context.send(method)).to eq(depeche_mode)
1087
- end
1088
-
1089
- context 'when the criteria has a collation', if: collation_supported? do
1090
-
1091
- let(:criteria) do
1092
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
1093
- end
1094
820
 
1095
- it "returns the first matching document" do
1096
- expect(context.send(method)).to eq(depeche_mode)
1097
- end
821
+ it 'applies the criteria sort' do
822
+ expect(context.send(method)).to eq(new_order)
1098
823
  end
1099
- end
1100
824
 
1101
- context "when using .desc" do
825
+ context 'when calling #last' do
1102
826
 
1103
- let(:criteria) do
1104
- Band.desc(:name)
827
+ it 'applies the criteria sort' do
828
+ expect(context.send(method)).to eq(new_order)
829
+ expect(context.last).to eq(depeche_mode)
830
+ end
1105
831
  end
1106
832
 
1107
- let(:context) do
1108
- described_class.new(criteria)
1109
- end
833
+ context 'with option { sort: :none }' do
1110
834
 
1111
- context "when there is sort on the context" do
835
+ let(:opts) do
836
+ { id_sort: :none }
837
+ end
1112
838
 
1113
- it "follows the main sort" do
1114
- expect(context.send(method)).to eq(new_order)
839
+ it 'applies the criteria sort' do
840
+ expect(context.send(method, opts)).to eq(new_order)
1115
841
  end
1116
- end
1117
842
 
1118
- context "when subsequently calling #last" do
843
+ context 'when calling #last' do
1119
844
 
1120
- it "returns the correct document" do
1121
- expect(context.send(method)).to eq(new_order)
1122
- expect(context.last).to eq(depeche_mode)
845
+ it 'applies the criteria sort' do
846
+ expect(context.send(method, opts)).to eq(new_order)
847
+ expect(context.last(opts)).to eq(depeche_mode)
848
+ end
1123
849
  end
1124
850
  end
1125
851
  end
@@ -1363,6 +1089,11 @@ describe Mongoid::Contextual::Mongo do
1363
1089
 
1364
1090
  context "when passed the symbol field name" do
1365
1091
 
1092
+ it "limits query to that field" do
1093
+ expect(criteria).to receive(:only).with(:name).and_call_original
1094
+ context.map(:name)
1095
+ end
1096
+
1366
1097
  it "performs mapping" do
1367
1098
  expect(context.map(:name)).to eq ["Depeche Mode", "New Order"]
1368
1099
  end
@@ -2090,31 +1821,26 @@ describe Mongoid::Contextual::Mongo do
2090
1821
 
2091
1822
  describe '#pipeline' do
2092
1823
 
2093
- context 'when the criteria has a selector', if: non_legacy_server? do
2094
-
2095
- before do
2096
- Artist.index(name: "text")
2097
- Artist.create_indexes
2098
- end
1824
+ context 'when the criteria has a selector' do
2099
1825
 
2100
1826
  let(:criteria) do
2101
- Artist.text_search("New Order")
1827
+ Band.where(name: "New Order")
2102
1828
  end
2103
1829
 
2104
1830
  let(:context) do
2105
1831
  described_class.new(criteria)
2106
1832
  end
2107
1833
 
2108
- let(:pipeline_match) do
2109
- context.send(:pipeline, :some_field).first['$match']
1834
+ let(:matches_operators) do
1835
+ context.send(:pipeline, 'name').select { |o| o['$match'] }
2110
1836
  end
2111
1837
 
2112
1838
  it 'creates a pipeline with the selector as one of the $match criteria' do
2113
- expect(pipeline_match).to include({ :'$text' => { :'$search' => "New Order" } })
1839
+ expect(matches_operators).to include('$match' => criteria.selector)
2114
1840
  end
2115
1841
 
2116
1842
  it 'creates a pipeline with the $exists operator as one of the $match criteria' do
2117
- expect(pipeline_match).to include({ 'some_field' => { '$exists' => true } })
1843
+ expect(matches_operators).to include('$match' => { 'name' => { '$exists' => true } })
2118
1844
  end
2119
1845
  end
2120
1846
  end