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
@@ -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