mongoid 7.1.7 → 7.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (447) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +9 -2
  5. data/Rakefile +14 -2
  6. data/lib/config/locales/en.yml +37 -1
  7. data/lib/mongoid.rb +23 -0
  8. data/lib/mongoid/association/depending.rb +1 -6
  9. data/lib/mongoid/association/many.rb +3 -3
  10. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  12. data/lib/mongoid/association/referenced/has_many/enumerable.rb +36 -1
  13. data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
  14. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +1 -6
  16. data/lib/mongoid/atomic/modifiers.rb +1 -1
  17. data/lib/mongoid/attributes/dynamic.rb +1 -1
  18. data/lib/mongoid/clients/factory.rb +17 -0
  19. data/lib/mongoid/composable.rb +1 -0
  20. data/lib/mongoid/config.rb +3 -0
  21. data/lib/mongoid/contextual/mongo.rb +23 -4
  22. data/lib/mongoid/copyable.rb +2 -2
  23. data/lib/mongoid/criteria.rb +57 -7
  24. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  25. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  26. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  27. data/lib/mongoid/criteria/queryable/selector.rb +7 -3
  28. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  29. data/lib/mongoid/document.rb +17 -6
  30. data/lib/mongoid/errors.rb +7 -0
  31. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  32. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  33. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  34. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  35. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  36. data/lib/mongoid/errors/invalid_query.rb +41 -0
  37. data/lib/mongoid/factory.rb +27 -10
  38. data/lib/mongoid/fields/validators/macro.rb +22 -9
  39. data/lib/mongoid/findable.rb +50 -14
  40. data/lib/mongoid/indexable.rb +2 -2
  41. data/lib/mongoid/interceptable.rb +1 -3
  42. data/lib/mongoid/matchable.rb +1 -149
  43. data/lib/mongoid/matcher.rb +127 -0
  44. data/lib/mongoid/matcher/all.rb +22 -0
  45. data/lib/mongoid/matcher/and.rb +21 -0
  46. data/lib/mongoid/matcher/elem_match.rb +35 -0
  47. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  48. data/lib/mongoid/matcher/eq.rb +11 -0
  49. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  50. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  51. data/lib/mongoid/matcher/exists.rb +15 -0
  52. data/lib/mongoid/matcher/expression.rb +40 -0
  53. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  54. data/lib/mongoid/matcher/field_expression.rb +63 -0
  55. data/lib/mongoid/matcher/field_operator.rb +52 -0
  56. data/lib/mongoid/matcher/gt.rb +17 -0
  57. data/lib/mongoid/matcher/gte.rb +17 -0
  58. data/lib/mongoid/matcher/in.rb +25 -0
  59. data/lib/mongoid/matcher/lt.rb +17 -0
  60. data/lib/mongoid/matcher/lte.rb +17 -0
  61. data/lib/mongoid/matcher/ne.rb +16 -0
  62. data/lib/mongoid/matcher/nin.rb +11 -0
  63. data/lib/mongoid/matcher/nor.rb +25 -0
  64. data/lib/mongoid/matcher/not.rb +29 -0
  65. data/lib/mongoid/matcher/or.rb +21 -0
  66. data/lib/mongoid/matcher/regex.rb +41 -0
  67. data/lib/mongoid/matcher/size.rb +26 -0
  68. data/lib/mongoid/persistable/deletable.rb +1 -1
  69. data/lib/mongoid/query_cache.rb +64 -62
  70. data/lib/mongoid/reloadable.rb +2 -2
  71. data/lib/mongoid/serializable.rb +1 -1
  72. data/lib/mongoid/traversable.rb +111 -4
  73. data/lib/mongoid/version.rb +1 -1
  74. data/spec/integration/app_spec.rb +2 -35
  75. data/spec/integration/associations/embedded_spec.rb +94 -0
  76. data/spec/integration/associations/has_many_spec.rb +39 -46
  77. data/spec/integration/associations/has_one_spec.rb +39 -46
  78. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  79. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  80. data/spec/integration/discriminator_key_spec.rb +354 -0
  81. data/spec/integration/discriminator_value_spec.rb +207 -0
  82. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  83. data/spec/integration/matcher_operator_data/all.yml +140 -0
  84. data/spec/integration/matcher_operator_data/and.yml +93 -0
  85. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  86. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  87. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  88. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  89. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  90. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  91. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  92. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  93. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  94. data/spec/integration/matcher_operator_data/in.yml +194 -0
  95. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  96. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  97. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  98. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  99. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  100. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  101. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  102. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  103. data/spec/integration/matcher_operator_data/not.yml +196 -0
  104. data/spec/integration/matcher_operator_data/or.yml +137 -0
  105. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  106. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  107. data/spec/integration/matcher_operator_data/size.yml +174 -0
  108. data/spec/integration/matcher_operator_spec.rb +100 -0
  109. data/spec/integration/matcher_spec.rb +189 -0
  110. data/spec/integration/server_query_spec.rb +142 -0
  111. data/spec/lite_spec_helper.rb +2 -2
  112. data/spec/mongoid/association/depending_spec.rb +78 -26
  113. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +0 -50
  114. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  115. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  116. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  117. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  118. data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
  119. data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
  120. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  121. data/spec/mongoid/atomic/paths_spec.rb +0 -41
  122. data/spec/mongoid/atomic_spec.rb +23 -0
  123. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  124. data/spec/mongoid/clients/factory_spec.rb +37 -0
  125. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  126. data/spec/mongoid/config_spec.rb +28 -0
  127. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  128. data/spec/mongoid/copyable_spec.rb +153 -1
  129. data/spec/mongoid/copyable_spec_models.rb +14 -0
  130. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -36
  131. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  132. data/spec/mongoid/criteria_spec.rb +204 -39
  133. data/spec/mongoid/document_spec.rb +89 -15
  134. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  135. data/spec/mongoid/factory_spec.rb +261 -28
  136. data/spec/mongoid/fields_spec.rb +48 -2
  137. data/spec/mongoid/findable_spec.rb +32 -0
  138. data/spec/mongoid/indexable_spec.rb +28 -2
  139. data/spec/mongoid/inspectable_spec.rb +29 -2
  140. data/spec/mongoid/interceptable_spec.rb +2 -2
  141. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  142. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  143. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  144. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  145. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  146. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  147. data/spec/mongoid/query_cache_spec.rb +442 -41
  148. data/spec/mongoid/reloadable_spec.rb +72 -0
  149. data/spec/mongoid/serializable_spec.rb +21 -3
  150. data/spec/mongoid/traversable_spec.rb +1100 -0
  151. data/spec/spec_helper.rb +2 -2
  152. data/spec/support/child_process_helper.rb +5 -2
  153. data/spec/support/constraints.rb +24 -0
  154. data/spec/support/helpers.rb +1 -1
  155. data/spec/{app → support}/models/account.rb +0 -0
  156. data/spec/{app → support}/models/acolyte.rb +0 -0
  157. data/spec/{app → support}/models/actor.rb +1 -1
  158. data/spec/{app → support}/models/actress.rb +0 -0
  159. data/spec/{app → support}/models/address.rb +0 -0
  160. data/spec/{app → support}/models/address_component.rb +0 -0
  161. data/spec/{app → support}/models/address_number.rb +0 -0
  162. data/spec/{app → support}/models/agency.rb +0 -0
  163. data/spec/{app → support}/models/agent.rb +0 -0
  164. data/spec/{app → support}/models/album.rb +0 -0
  165. data/spec/{app → support}/models/alert.rb +0 -0
  166. data/spec/{app → support}/models/animal.rb +0 -0
  167. data/spec/{app → support}/models/answer.rb +0 -0
  168. data/spec/{app → support}/models/appointment.rb +0 -0
  169. data/spec/support/models/armrest.rb +10 -0
  170. data/spec/{app → support}/models/array_field.rb +0 -0
  171. data/spec/{app → support}/models/article.rb +0 -0
  172. data/spec/{app → support}/models/artist.rb +0 -0
  173. data/spec/{app → support}/models/artwork.rb +0 -0
  174. data/spec/{app → support}/models/audio.rb +0 -0
  175. data/spec/{app → support}/models/augmentation.rb +0 -0
  176. data/spec/{app → support}/models/author.rb +0 -0
  177. data/spec/{app → support}/models/baby.rb +0 -0
  178. data/spec/{app → support}/models/band.rb +0 -0
  179. data/spec/{app → support}/models/bar.rb +0 -0
  180. data/spec/{app → support}/models/basic.rb +0 -0
  181. data/spec/{app → support}/models/bed.rb +0 -0
  182. data/spec/{app → support}/models/big_palette.rb +0 -0
  183. data/spec/{app → support}/models/birthday.rb +0 -0
  184. data/spec/{app → support}/models/bomb.rb +0 -0
  185. data/spec/{app → support}/models/book.rb +0 -0
  186. data/spec/{app → support}/models/breed.rb +0 -0
  187. data/spec/{app → support}/models/browser.rb +1 -1
  188. data/spec/{app → support}/models/building.rb +0 -0
  189. data/spec/{app → support}/models/building_address.rb +0 -0
  190. data/spec/{app → support}/models/bus.rb +0 -0
  191. data/spec/{app → support}/models/business.rb +0 -0
  192. data/spec/{app → support}/models/callback_test.rb +0 -0
  193. data/spec/{app → support}/models/canvas.rb +1 -1
  194. data/spec/{app → support}/models/car.rb +0 -0
  195. data/spec/{app → support}/models/cat.rb +0 -0
  196. data/spec/{app → support}/models/category.rb +0 -0
  197. data/spec/{app → support}/models/child.rb +0 -0
  198. data/spec/{app → support}/models/child_doc.rb +0 -0
  199. data/spec/{app → support}/models/church.rb +0 -0
  200. data/spec/{app → support}/models/circle.rb +0 -0
  201. data/spec/{app → support}/models/circuit.rb +0 -0
  202. data/spec/{app → support}/models/circus.rb +0 -0
  203. data/spec/{app → support}/models/code.rb +0 -0
  204. data/spec/{app → support}/models/coding.rb +1 -1
  205. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  206. data/spec/{app → support}/models/comment.rb +0 -0
  207. data/spec/{app → support}/models/company.rb +0 -0
  208. data/spec/{app → support}/models/consumption_period.rb +0 -0
  209. data/spec/{app → support}/models/contextable_item.rb +0 -0
  210. data/spec/{app → support}/models/contractor.rb +0 -0
  211. data/spec/{app → support}/models/cookie.rb +0 -0
  212. data/spec/{app → support}/models/country_code.rb +0 -0
  213. data/spec/{app → support}/models/courier_job.rb +0 -0
  214. data/spec/support/models/crate.rb +13 -0
  215. data/spec/support/models/deed.rb +8 -0
  216. data/spec/{app → support}/models/definition.rb +0 -0
  217. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  218. data/spec/{app → support}/models/description.rb +0 -0
  219. data/spec/{app → support}/models/dictionary.rb +0 -6
  220. data/spec/{app → support}/models/division.rb +0 -0
  221. data/spec/{app → support}/models/doctor.rb +0 -0
  222. data/spec/{app → support}/models/dog.rb +0 -0
  223. data/spec/{app → support}/models/dokument.rb +0 -0
  224. data/spec/{app → support}/models/draft.rb +0 -0
  225. data/spec/{app → support}/models/dragon.rb +0 -0
  226. data/spec/{app → support}/models/driver.rb +1 -1
  227. data/spec/{app → support}/models/drug.rb +0 -0
  228. data/spec/{app → support}/models/dungeon.rb +0 -0
  229. data/spec/{app → support}/models/edit.rb +0 -0
  230. data/spec/{app → support}/models/email.rb +0 -0
  231. data/spec/{app → support}/models/employer.rb +0 -0
  232. data/spec/{app → support}/models/entry.rb +0 -0
  233. data/spec/{app → support}/models/eraser.rb +0 -0
  234. data/spec/{app → support}/models/even.rb +0 -0
  235. data/spec/{app → support}/models/event.rb +0 -0
  236. data/spec/{app → support}/models/exhibition.rb +0 -0
  237. data/spec/{app → support}/models/exhibitor.rb +0 -0
  238. data/spec/{app → support}/models/explosion.rb +0 -0
  239. data/spec/{app → support}/models/eye.rb +0 -0
  240. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  241. data/spec/{app → support}/models/face.rb +0 -0
  242. data/spec/{app → support}/models/favorite.rb +0 -0
  243. data/spec/{app → support}/models/filesystem.rb +0 -0
  244. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  245. data/spec/{app → support}/models/firefox.rb +0 -0
  246. data/spec/{app → support}/models/fish.rb +0 -0
  247. data/spec/{app → support}/models/folder.rb +0 -0
  248. data/spec/{app → support}/models/folder_item.rb +0 -0
  249. data/spec/{app → support}/models/fruits.rb +0 -0
  250. data/spec/{app → support}/models/game.rb +0 -0
  251. data/spec/{app → support}/models/ghost.rb +0 -0
  252. data/spec/support/models/guitar.rb +5 -0
  253. data/spec/{app → support}/models/home.rb +0 -0
  254. data/spec/{app → support}/models/house.rb +0 -0
  255. data/spec/{app → support}/models/html_writer.rb +0 -0
  256. data/spec/{app → support}/models/id_key.rb +0 -0
  257. data/spec/support/models/idnodef.rb +8 -0
  258. data/spec/{app → support}/models/image.rb +0 -0
  259. data/spec/{app → support}/models/implant.rb +0 -0
  260. data/spec/support/models/instrument.rb +9 -0
  261. data/spec/{app → support}/models/item.rb +1 -1
  262. data/spec/{app → support}/models/jar.rb +0 -0
  263. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  264. data/spec/{app → support}/models/kangaroo.rb +0 -0
  265. data/spec/{app → support}/models/label.rb +0 -0
  266. data/spec/{app → support}/models/language.rb +0 -0
  267. data/spec/{app → support}/models/lat_lng.rb +0 -0
  268. data/spec/{app → support}/models/league.rb +0 -0
  269. data/spec/{app → support}/models/learner.rb +0 -0
  270. data/spec/{app → support}/models/line_item.rb +0 -0
  271. data/spec/{app → support}/models/location.rb +0 -0
  272. data/spec/{app → support}/models/login.rb +0 -0
  273. data/spec/{app → support}/models/manufacturer.rb +0 -0
  274. data/spec/{app → support}/models/meat.rb +0 -0
  275. data/spec/{app → support}/models/membership.rb +0 -0
  276. data/spec/{app → support}/models/message.rb +0 -0
  277. data/spec/{app → support}/models/minim.rb +0 -0
  278. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  279. data/spec/support/models/mop.rb +16 -0
  280. data/spec/{app → support}/models/movie.rb +0 -0
  281. data/spec/{app → support}/models/my_hash.rb +0 -0
  282. data/spec/{app → support}/models/name.rb +0 -0
  283. data/spec/{app → support}/models/name_only.rb +0 -0
  284. data/spec/{app → support}/models/node.rb +0 -0
  285. data/spec/{app → support}/models/note.rb +0 -0
  286. data/spec/{app → support}/models/odd.rb +0 -0
  287. data/spec/{app → support}/models/ordered_post.rb +0 -0
  288. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  289. data/spec/{app → support}/models/oscar.rb +0 -0
  290. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  291. data/spec/{app → support}/models/override.rb +0 -0
  292. data/spec/{app → support}/models/ownable.rb +0 -0
  293. data/spec/{app → support}/models/owner.rb +2 -0
  294. data/spec/{app → support}/models/pack.rb +0 -0
  295. data/spec/{app → support}/models/page.rb +0 -0
  296. data/spec/{app → support}/models/page_question.rb +0 -0
  297. data/spec/{app → support}/models/palette.rb +1 -1
  298. data/spec/{app → support}/models/parent.rb +0 -0
  299. data/spec/{app → support}/models/parent_doc.rb +0 -0
  300. data/spec/{app → support}/models/passport.rb +0 -0
  301. data/spec/{app → support}/models/patient.rb +0 -0
  302. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  303. data/spec/{app → support}/models/pencil.rb +0 -0
  304. data/spec/{app → support}/models/person.rb +1 -3
  305. data/spec/{app → support}/models/pet.rb +0 -0
  306. data/spec/{app → support}/models/pet_owner.rb +0 -0
  307. data/spec/{app → support}/models/phone.rb +0 -0
  308. data/spec/support/models/piano.rb +5 -0
  309. data/spec/{app → support}/models/pizza.rb +0 -0
  310. data/spec/{app → support}/models/player.rb +0 -0
  311. data/spec/{app → support}/models/post.rb +0 -0
  312. data/spec/{app → support}/models/post_genre.rb +0 -0
  313. data/spec/{app → support}/models/powerup.rb +0 -0
  314. data/spec/{app → support}/models/preference.rb +0 -0
  315. data/spec/{app → support}/models/princess.rb +0 -0
  316. data/spec/{app → support}/models/product.rb +0 -0
  317. data/spec/support/models/profile.rb +18 -0
  318. data/spec/{app → support}/models/pronunciation.rb +0 -0
  319. data/spec/{app → support}/models/pub.rb +0 -0
  320. data/spec/support/models/publication.rb +5 -0
  321. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  322. data/spec/{app → support}/models/publication/review.rb +0 -0
  323. data/spec/{app → support}/models/purchase.rb +0 -0
  324. data/spec/{app → support}/models/question.rb +0 -0
  325. data/spec/{app → support}/models/quiz.rb +0 -0
  326. data/spec/{app → support}/models/rating.rb +0 -0
  327. data/spec/{app → support}/models/record.rb +0 -0
  328. data/spec/{app → support}/models/registry.rb +0 -0
  329. data/spec/{app → support}/models/role.rb +0 -0
  330. data/spec/{app → support}/models/root_category.rb +0 -0
  331. data/spec/{app → support}/models/sandwich.rb +0 -0
  332. data/spec/{app → support}/models/scheduler.rb +0 -0
  333. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  334. data/spec/support/models/seat.rb +25 -0
  335. data/spec/{app → support}/models/seo.rb +0 -0
  336. data/spec/{app → support}/models/series.rb +0 -1
  337. data/spec/{app → support}/models/server.rb +0 -0
  338. data/spec/{app → support}/models/service.rb +0 -0
  339. data/spec/{app → support}/models/shape.rb +2 -2
  340. data/spec/{app → support}/models/shelf.rb +0 -0
  341. data/spec/{app → support}/models/shipment_address.rb +0 -0
  342. data/spec/{app → support}/models/shipping_container.rb +0 -0
  343. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  344. data/spec/{app → support}/models/shop.rb +0 -0
  345. data/spec/{app → support}/models/short_agent.rb +0 -0
  346. data/spec/{app → support}/models/short_quiz.rb +0 -0
  347. data/spec/{app → support}/models/simple.rb +0 -0
  348. data/spec/{app → support}/models/slave.rb +0 -0
  349. data/spec/{app → support}/models/song.rb +0 -0
  350. data/spec/{app → support}/models/sound.rb +0 -0
  351. data/spec/{app → support}/models/square.rb +0 -0
  352. data/spec/{app → support}/models/staff.rb +0 -0
  353. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  354. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  355. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  356. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  357. data/spec/{app → support}/models/strategy.rb +0 -0
  358. data/spec/{app → support}/models/sub_item.rb +0 -0
  359. data/spec/{app → support}/models/subscription.rb +0 -0
  360. data/spec/{app → support}/models/survey.rb +0 -0
  361. data/spec/{app → support}/models/symptom.rb +0 -0
  362. data/spec/support/models/system_role.rb +7 -0
  363. data/spec/{app → support}/models/tag.rb +0 -0
  364. data/spec/{app → support}/models/target.rb +0 -0
  365. data/spec/{app → support}/models/template.rb +0 -0
  366. data/spec/{app → support}/models/thing.rb +0 -0
  367. data/spec/{app → support}/models/title.rb +0 -0
  368. data/spec/{app → support}/models/tool.rb +2 -2
  369. data/spec/{app → support}/models/topping.rb +0 -0
  370. data/spec/support/models/toy.rb +10 -0
  371. data/spec/{app → support}/models/track.rb +0 -0
  372. data/spec/{app → support}/models/translation.rb +0 -0
  373. data/spec/{app → support}/models/tree.rb +0 -0
  374. data/spec/{app → support}/models/truck.rb +2 -0
  375. data/spec/{app → support}/models/updatable.rb +0 -0
  376. data/spec/{app → support}/models/user.rb +0 -0
  377. data/spec/{app → support}/models/user_account.rb +0 -0
  378. data/spec/{app → support}/models/validation_callback.rb +0 -0
  379. data/spec/{app → support}/models/vehicle.rb +7 -2
  380. data/spec/{app → support}/models/version.rb +0 -0
  381. data/spec/{app → support}/models/vertex.rb +0 -0
  382. data/spec/{app → support}/models/vet_visit.rb +0 -0
  383. data/spec/{app → support}/models/video.rb +0 -0
  384. data/spec/{app → support}/models/video_game.rb +0 -0
  385. data/spec/{app → support}/models/weapon.rb +0 -0
  386. data/spec/{app → support}/models/wiki_page.rb +0 -1
  387. data/spec/{app → support}/models/word.rb +0 -0
  388. data/spec/{app → support}/models/word_origin.rb +0 -0
  389. data/spec/{app → support}/models/writer.rb +2 -2
  390. data/spec/support/spec_config.rb +1 -1
  391. data/spec/support/spec_organizer.rb +130 -0
  392. metadata +845 -790
  393. metadata.gz.sig +0 -0
  394. data/lib/mongoid/matchable/all.rb +0 -30
  395. data/lib/mongoid/matchable/and.rb +0 -32
  396. data/lib/mongoid/matchable/default.rb +0 -121
  397. data/lib/mongoid/matchable/elem_match.rb +0 -36
  398. data/lib/mongoid/matchable/eq.rb +0 -23
  399. data/lib/mongoid/matchable/exists.rb +0 -25
  400. data/lib/mongoid/matchable/gt.rb +0 -25
  401. data/lib/mongoid/matchable/gte.rb +0 -25
  402. data/lib/mongoid/matchable/in.rb +0 -26
  403. data/lib/mongoid/matchable/lt.rb +0 -25
  404. data/lib/mongoid/matchable/lte.rb +0 -25
  405. data/lib/mongoid/matchable/ne.rb +0 -23
  406. data/lib/mongoid/matchable/nin.rb +0 -24
  407. data/lib/mongoid/matchable/nor.rb +0 -38
  408. data/lib/mongoid/matchable/or.rb +0 -35
  409. data/lib/mongoid/matchable/regexp.rb +0 -30
  410. data/lib/mongoid/matchable/size.rb +0 -23
  411. data/spec/app/models/customer.rb +0 -11
  412. data/spec/app/models/customer_address.rb +0 -12
  413. data/spec/app/models/publication.rb +0 -5
  414. data/spec/integration/associations/embeds_many_spec.rb +0 -24
  415. data/spec/integration/associations/embeds_one_spec.rb +0 -24
  416. data/spec/integration/callbacks_models.rb +0 -49
  417. data/spec/integration/callbacks_spec.rb +0 -216
  418. data/spec/mongoid/matchable/all_spec.rb +0 -34
  419. data/spec/mongoid/matchable/and_spec.rb +0 -190
  420. data/spec/mongoid/matchable/default_spec.rb +0 -140
  421. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  422. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  423. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  424. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  425. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  426. data/spec/mongoid/matchable/in_spec.rb +0 -52
  427. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  428. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  429. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  430. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  431. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  432. data/spec/mongoid/matchable/or_spec.rb +0 -134
  433. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  434. data/spec/mongoid/matchable/size_spec.rb +0 -28
  435. data/spec/mongoid/matchable_spec.rb +0 -856
  436. data/spec/shared/LICENSE +0 -20
  437. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  438. data/spec/shared/lib/mrss/cluster_config.rb +0 -211
  439. data/spec/shared/lib/mrss/constraints.rb +0 -330
  440. data/spec/shared/lib/mrss/docker_runner.rb +0 -262
  441. data/spec/shared/lib/mrss/lite_constraints.rb +0 -175
  442. data/spec/shared/lib/mrss/server_version_registry.rb +0 -69
  443. data/spec/shared/lib/mrss/spec_organizer.rb +0 -149
  444. data/spec/shared/share/Dockerfile.erb +0 -229
  445. data/spec/shared/shlib/distro.sh +0 -73
  446. data/spec/shared/shlib/server.sh +0 -270
  447. data/spec/shared/shlib/set_env.sh +0 -128
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93d8b658e53d12f1deb7a131e3d58155fead7576955078187f3b3181072c193f
4
- data.tar.gz: 35e629224f7495969e5a695a9641043ad61b92d61b57926b1d1956bd2f5e1d7c
3
+ metadata.gz: da086175f8b41ffc6991262225460da5577f7ea47d3c355f34e072ff5c78d5f1
4
+ data.tar.gz: 7797a83ed15fd55f0ec8aba1a43569393f99f037a7f1013aeb0770f0aa4c3000
5
5
  SHA512:
6
- metadata.gz: 33920733722a4da26c23190788ef198d86d0d3edfcedc3d53bc7364d9abfbda7c54634af875c678757745c1d18b225457ef8e0a5b5711db7e76b93350548d14b
7
- data.tar.gz: cb0acea4219ce1972fe67b63f988b0f31197ab44142288e5af4fe84e63f602dbc9b7dcc23edbf54cc5e465288c23346f62d3cf0632e0b37a59fabc6acb1c6925
6
+ metadata.gz: f18e6f9ca45ce9cc406a32983d031388c5f6a76100de18fcdf036163bf08c74f4f15a1e77a02c6445e37f2824ec6ecf549514bf78447f7876b8d52d2c2fb4947
7
+ data.tar.gz: ca7b9fe36e273d4e2dab3680dbaa973450eb2b87ae58a9d462bba6ec95d27de1479255175a9d7971b32e61b5a43726d7b7855134c5ec733b75e126e6e51fb408
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
- # Mongoid
2
- [![Code Climate](https://codeclimate.com/github/mongodb/mongoid.svg)](https://codeclimate.com/github/mongodb/mongoid)
1
+ Mongoid
2
+ [![Gem Version][rubygems-img]][rubygems-url]
3
+ [![Inline docs][inch-img]][inch-url]
4
+ ====
3
5
 
4
6
  Mongoid is an ODM (Object-Document Mapper) framework for MongoDB in Ruby.
5
7
 
@@ -63,3 +65,8 @@ Credits
63
65
  -------
64
66
 
65
67
  Durran Jordan: durran at gmail dot com
68
+
69
+ [rubygems-img]: https://badge.fury.io/rb/mongoid.svg
70
+ [rubygems-url]: http://badge.fury.io/rb/mongoid
71
+ [inch-img]: http://inch-ci.org/github/mongodb/mongoid.svg?branch=master
72
+ [inch-url]: http://inch-ci.org/github/mongodb/mongoid
data/Rakefile CHANGED
@@ -22,8 +22,11 @@ task :install => :build do
22
22
  system "sudo gem install mongoid-#{Mongoid::VERSION}.gem"
23
23
  end
24
24
 
25
- task :release do
26
- raise "Please use ./release.sh to release"
25
+ task :release => :build do
26
+ system "git tag -a v#{Mongoid::VERSION} -m 'Tagging #{Mongoid::VERSION}'"
27
+ system "git push --tags"
28
+ system "gem push mongoid-#{Mongoid::VERSION}.gem"
29
+ system "rm mongoid-#{Mongoid::VERSION}.gem"
27
30
  end
28
31
 
29
32
  RSpec::Core::RakeTask.new("spec") do |spec|
@@ -35,6 +38,13 @@ RSpec::Core::RakeTask.new('spec:progress') do |spec|
35
38
  spec.pattern = "spec/**/*_spec.rb"
36
39
  end
37
40
 
41
+ task :ci do
42
+ $LOAD_PATH.push File.expand_path("../spec", __FILE__)
43
+ require 'support/spec_organizer'
44
+
45
+ SpecOrganizer.new.run
46
+ end
47
+
38
48
  task :default => :spec
39
49
 
40
50
  desc "Generate all documentation"
@@ -56,3 +66,5 @@ namespace :release do
56
66
  end
57
67
  end
58
68
  end
69
+
70
+ task :release => ['release:check_private_key', 'release:do']
@@ -7,6 +7,7 @@ en:
7
7
  message_title: "message"
8
8
  summary_title: "summary"
9
9
  resolution_title: "resolution"
10
+
10
11
  ambiguous_relationship:
11
12
  message: "Ambiguous associations %{candidates} defined on %{klass}."
12
13
  summary:
@@ -43,6 +44,8 @@ en:
43
44
  resolution: "Most likely this is caused by passing parameters directly
44
45
  through to the find, and the parameter either is not present or the
45
46
  key from which it is accessed is incorrect."
47
+ destroy_restrict_with_error_dependencies_exist:
48
+ "is not empty and prevents the document from being destroyed"
46
49
  document_not_destroyed:
47
50
  message: "%{klass} with id %{id} was not destroyed."
48
51
  summary: "When calling %{klass}#destroy! and a callback halts the destroy
@@ -105,6 +108,32 @@ en:
105
108
  summary: "An invalid dependent strategy was defined for the association:
106
109
  %{association}. The valid strategies are: %{valid_strategies}."
107
110
  resolution: "Change the dependent strategy to one of the valid types."
111
+ invalid_discriminator_key_target:
112
+ message: "Setting the discriminator key on a child class is not allowed."
113
+ summary: "The discriminator key on the class %{class_name} was attempted
114
+ to be changed. Changing the discriminator key on a child class is not
115
+ allowed."
116
+ resolution: "Try setting the discriminator key on %{superclass} or one of %{class_name}'s
117
+ ancestors."
118
+ invalid_elem_match_operator:
119
+ message: "Invalid $elemMatch operator '%{operator}'."
120
+ summary: "You misspelled an operator or are using an operator that
121
+ Mongoid does not support."
122
+ resolution: "Valid field operators are: %{valid_operators}.
123
+ Ensure you are using one of these operators."
124
+ invalid_estimated_count_criteria:
125
+ message: "Invalid criteria for estimated_count."
126
+ summary: "Estimated count is strictly a collection-level operation and cannot be called
127
+ on a filtered critera."
128
+ resolution: "Try calling estimated_count directly on the class: %{class_name}.estimated_count.\n\n
129
+ \_If the class defines a default scope, use unscoped: %{class_name}.unscoped.estimated_count."
130
+ invalid_expression_operator:
131
+ message: "Invalid expression operator '%{operator}'."
132
+ summary: "You misspelled an operator, are using an operator that
133
+ Mongoid does not support, or are trying to use a field-level
134
+ operator on expression level."
135
+ resolution: "Valid expression operators are: %{valid_operators}.
136
+ Ensure you are using one of these operators."
108
137
  invalid_field:
109
138
  message: "Defining a field named '%{name}' is not allowed."
110
139
  summary: "Defining this field would override the method '%{name}',
@@ -118,6 +147,13 @@ en:
118
147
  allowed, and don't use these names. These include names that also
119
148
  conflict with core Ruby methods on Object, Module, Enumerable, or
120
149
  included gems that inject methods into these or Mongoid internals."
150
+ invalid_field_operator:
151
+ message: "Invalid field operator '%{operator}'."
152
+ summary: "You misspelled an operator, are using an operator that
153
+ Mongoid does not support, or are trying to use an expression-level
154
+ operator on field level."
155
+ resolution: "Valid field operators are: %{valid_operators}.
156
+ Ensure you are using one of these operators."
121
157
  invalid_field_option:
122
158
  message: "Invalid option :%{option} provided for field :%{name}."
123
159
  summary: "Mongoid requires that you only provide valid options on each
@@ -543,7 +579,7 @@ en:
543
579
  the validations."
544
580
  delete_restriction:
545
581
  message: "Cannot delete %{document} because of dependent '%{relation}'."
546
- summary: "When defining '%{relation}' with a :dependent => :restrict,
582
+ summary: "When defining '%{relation}' with a :dependent => :restrict_with_error,
547
583
  Mongoid will raise an error when attempting to delete the
548
584
  %{document} when the child '%{relation}' still has documents in it."
549
585
  resolution: "Don't attempt to delete the parent %{document} when
data/lib/mongoid.rb CHANGED
@@ -111,4 +111,27 @@ module Mongoid
111
111
  #
112
112
  # @since 1.0.0
113
113
  def_delegators Config, *(Config.public_instance_methods(false) - [ :logger=, :logger ])
114
+
115
+
116
+ # Module used to prepend the discriminator key assignment function to change
117
+ # the value assigned to the discriminator key to a string.
118
+ #
119
+ # @api private
120
+ module GlobalDiscriminatorKeyAssignment
121
+ # This class is used for obtaining the method definition location for
122
+ # Mongoid methods.
123
+ class InvalidFieldHost
124
+ include Mongoid::Document
125
+ end
126
+
127
+ def discriminator_key=(value)
128
+ Mongoid::Fields::Validators::Macro.validate_field_name(InvalidFieldHost, value)
129
+ value = value.to_s
130
+ super
131
+ end
132
+ end
133
+
134
+ class << self
135
+ prepend GlobalDiscriminatorKeyAssignment
136
+ end
114
137
  end
@@ -41,11 +41,6 @@ module Mongoid
41
41
  :restrict_with_error
42
42
  ]
43
43
 
44
- # The error message when a strategy cannot delete objects because there are associated objects.
45
- #
46
- # @since 7.0
47
- RESTRICT_ERROR_MSG = 'Cannot delete record because associated objects exist.'.freeze
48
-
49
44
  # Attempt to add the cascading information for the document to know how
50
45
  # to handle associated documents on a removal.
51
46
  #
@@ -131,7 +126,7 @@ module Mongoid
131
126
 
132
127
  def _dependent_restrict_with_error!(association)
133
128
  if (relation = send(association.name)) && !relation.blank?
134
- errors.add(association.name, RESTRICT_ERROR_MSG)
129
+ errors.add(association.name, :destroy_restrict_with_error_dependencies_exist)
135
130
  throw(:abort, false)
136
131
  end
137
132
  end
@@ -11,7 +11,7 @@ module Mongoid
11
11
  include ::Enumerable
12
12
 
13
13
  def_delegators :criteria, :avg, :max, :min, :sum
14
- def_delegators :_target, :length, :size
14
+ def_delegators :_target, :length, :size, :any?
15
15
 
16
16
  # Is the association empty?
17
17
  #
@@ -22,7 +22,7 @@ module Mongoid
22
22
  #
23
23
  # @since 2.1.0
24
24
  def blank?
25
- size == 0
25
+ !any?
26
26
  end
27
27
 
28
28
  # Creates a new document on the references many association. This will
@@ -207,7 +207,7 @@ module Mongoid
207
207
  #
208
208
  # @return [ Document ] A matching document or a new/created one.
209
209
  def find_or(method, attrs = {}, type = nil, &block)
210
- attrs["_type"] = type.to_s if type
210
+ attrs[klass.discriminator_key] = type.discriminator_value if type
211
211
  where(attrs).first || send(method, attrs, type, &block)
212
212
  end
213
213
  end
@@ -31,7 +31,7 @@ module Mongoid
31
31
  private
32
32
 
33
33
  def execute_query(object, type)
34
- query_criteria(object, type).limit(-1).first(id_sort: :none)
34
+ query_criteria(object, type).limit(1).first(id_sort: :none)
35
35
  end
36
36
 
37
37
  def query_criteria(object, type)
@@ -101,7 +101,7 @@ module Mongoid
101
101
 
102
102
  # Delete the document from the association. This will set the foreign key
103
103
  # on the document to nil. If the dependent options on the association are
104
- # :delete or :destroy the appropriate removal will occur.
104
+ # :delete_all or :destroy the appropriate removal will occur.
105
105
  #
106
106
  # @example Delete the document.
107
107
  # person.posts.delete(post)
@@ -216,6 +216,40 @@ module Mongoid
216
216
  end
217
217
  end
218
218
 
219
+ # Returns whether the association has any documents, optionally
220
+ # subject to the provided filters.
221
+ #
222
+ # This method returns true if the association has any persisted
223
+ # documents and if it has any not yet persisted documents.
224
+ #
225
+ # If the association is already loaded, this method inspects the
226
+ # loaded documents and does not query the database. If the
227
+ # association is not loaded, the argument-less and block-less
228
+ # version does not load the association; the other versions
229
+ # (that delegate to Enumerable) may or may not load the association
230
+ # completely depending on whether it is iterated to completion.
231
+ #
232
+ # This method can take a parameter and a block. The behavior with
233
+ # either the paramater or the block is delegated to the standard
234
+ # library Enumerable module.
235
+ #
236
+ # Note that when Enumerable's any? method is invoked with both
237
+ # a block and a pattern, it only uses the pattern.
238
+ #
239
+ # @param [ Object ] condition The condition that documents
240
+ # must satisfy. See Enumerable documentation for details.
241
+ #
242
+ # @return [ true, false ] If the association has any documents.
243
+ def any?(*args)
244
+ return super if args.any? || block_given?
245
+
246
+ if _loaded?
247
+ in_memory.length > 0
248
+ else
249
+ _unloaded.exists? || _added.length > 0
250
+ end
251
+ end
252
+
219
253
  # Get the first document in the enumerable. Will check the persisted
220
254
  # documents first. Does not load the entire enumerable.
221
255
  #
@@ -395,7 +429,8 @@ module Mongoid
395
429
  #
396
430
  # @since 2.1.0
397
431
  def reset
398
- _loaded.clear and _added.clear
432
+ _loaded.clear
433
+ _added.clear
399
434
  @executed = false
400
435
  end
401
436
 
@@ -90,7 +90,7 @@ module Mongoid
90
90
 
91
91
  # Delete the document from the association. This will set the foreign key
92
92
  # on the document to nil. If the dependent options on the association are
93
- # :delete or :destroy the appropriate removal will occur.
93
+ # :delete_all or :destroy the appropriate removal will occur.
94
94
  #
95
95
  # @example Delete the document.
96
96
  # person.posts.delete(post)
@@ -170,6 +170,13 @@ module Mongoid
170
170
 
171
171
  # Determine if any documents in this association exist in the database.
172
172
  #
173
+ # If the association contains documents but all of the documents
174
+ # exist only in the application, i.e. have not been persisted to the
175
+ # database, this method returns false.
176
+ #
177
+ # This method queries the database on each invocation even if the
178
+ # association is already loaded into memory.
179
+ #
173
180
  # @example Are there persisted documents?
174
181
  # person.posts.exists?
175
182
  #
@@ -46,7 +46,7 @@ module Mongoid
46
46
  end
47
47
 
48
48
  def execute_query(object, base)
49
- query_criteria(object, base).limit(-1).first(id_sort: :none)
49
+ query_criteria(object, base).limit(1).first(id_sort: :none)
50
50
  end
51
51
 
52
52
  def with_polymorphic_criterion(criteria, base)
@@ -54,14 +54,9 @@ module Mongoid
54
54
  #
55
55
  # @since 2.0.0.rc.1
56
56
  def substitute(replacement)
57
- # If the same object currently associated is being assigned,
58
- # rebind the association and save the target but do not destroy
59
- # the target.
60
-
61
57
  unbind_one
62
58
  if persistable?
63
- # TODO can this entire method be skipped if self == replacement?
64
- if _association.destructive? && self != replacement
59
+ if _association.destructive?
65
60
  send(_association.dependent)
66
61
  else
67
62
  save if persisted?
@@ -193,7 +193,7 @@ module Mongoid
193
193
  def push_conflict?(field)
194
194
  name = field.split(".", 2)[0]
195
195
  set_fields.has_key?(name) || pull_fields.has_key?(name) ||
196
- (push_fields.keys.count { |item| item =~ /#{name}/ } > 1)
196
+ (push_fields.keys.count { |item| item.split('.', 2).first == name } > 1)
197
197
  end
198
198
 
199
199
  # Get the conflicting pull modifications.
@@ -116,7 +116,7 @@ module Mongoid
116
116
  #
117
117
  # @since 4.0.0
118
118
  def inspect_dynamic_fields
119
- keys = attributes.keys - fields.keys - relations.keys - ["_id", "_type"]
119
+ keys = attributes.keys - fields.keys - relations.keys - ["_id", self.class.discriminator_key]
120
120
  return keys.map do |name|
121
121
  "#{name}: #{attributes[name].inspect}"
122
122
  end
@@ -69,11 +69,28 @@ module Mongoid
69
69
  end
70
70
  end
71
71
 
72
+ MONGOID_WRAPPING_LIBRARY = {
73
+ name: 'Mongoid',
74
+ version: VERSION,
75
+ }.freeze
76
+
77
+ def driver_version
78
+ Mongo::VERSION.split('.')[0...2].map(&:to_i)
79
+ end
80
+
72
81
  def options(configuration)
73
82
  config = configuration.dup
74
83
  options = config.delete(:options) || {}
75
84
  options[:platform] = PLATFORM_DETAILS
76
85
  options[:app_name] = Mongoid::Config.app_name if Mongoid::Config.app_name
86
+ if (driver_version <=> [2, 13]) >= 0
87
+ wrap_lib = if options[:wrapping_libraries]
88
+ [MONGOID_WRAPPING_LIBRARY] + options[:wrapping_libraries]
89
+ else
90
+ [MONGOID_WRAPPING_LIBRARY]
91
+ end
92
+ options[:wrapping_libraries] = wrap_lib
93
+ end
77
94
  options.reject{ |k, v| k == :hosts }.to_hash.symbolize_keys!
78
95
  end
79
96
  end
@@ -6,6 +6,7 @@ require "mongoid/findable"
6
6
  require "mongoid/indexable"
7
7
  require "mongoid/inspectable"
8
8
  require "mongoid/interceptable"
9
+ require "mongoid/matcher"
9
10
  require "mongoid/matchable"
10
11
  require "mongoid/persistable"
11
12
  require "mongoid/reloadable"
@@ -32,6 +32,9 @@ module Mongoid
32
32
  # error.
33
33
  option :belongs_to_required_by_default, default: true
34
34
 
35
+ # Set the global discriminator key.
36
+ option :discriminator_key, default: "_type"
37
+
35
38
  # Raise an exception when a field is redefined.
36
39
  option :duplicate_fields_exception, default: false
37
40
 
@@ -71,7 +71,26 @@ module Mongoid
71
71
  # @since 3.0.0
72
72
  def count(options = {}, &block)
73
73
  return super(&block) if block_given?
74
- try_cache(:count) { view.count(options) }
74
+ try_cache(:count) { view.count_documents(options) }
75
+ end
76
+
77
+ # Get the estimated number of documents matching the query.
78
+ #
79
+ # Unlike count, estimated_count does not take a block because it is not
80
+ # traditionally defined (with a block) on Enumarable like count is.
81
+ #
82
+ # @example Get the estimated number of matching documents.
83
+ # context.estimated_count
84
+ #
85
+ # @param [ Hash ] options The options, such as maxTimeMS to be factored
86
+ # into the count.
87
+ #
88
+ # @return [ Integer ] The number of matches.
89
+ def estimated_count(options = {})
90
+ unless self.criteria.selector.empty?
91
+ raise Mongoid::Errors::InvalidEstimatedCountCriteria.new(self.klass)
92
+ end
93
+ try_cache(:estimated_count) { view.estimated_document_count(options) }
75
94
  end
76
95
 
77
96
  # Delete all documents in the database that match the selector.
@@ -258,12 +277,12 @@ module Mongoid
258
277
  return documents.first if cached? && cache_loaded?
259
278
  try_cache(:first) do
260
279
  if sort = view.sort || ({ _id: 1 } unless opts[:id_sort] == :none)
261
- if raw_doc = view.sort(sort).limit(-1).first
280
+ if raw_doc = view.sort(sort).limit(1).first
262
281
  doc = Factory.from_db(klass, raw_doc, criteria)
263
282
  eager_load([doc]).first
264
283
  end
265
284
  else
266
- if raw_doc = view.limit(-1).first
285
+ if raw_doc = view.limit(1).first
267
286
  doc = Factory.from_db(klass, raw_doc, criteria)
268
287
  eager_load([doc]).first
269
288
  end
@@ -372,7 +391,7 @@ module Mongoid
372
391
  def last(opts = {})
373
392
  try_cache(:last) do
374
393
  with_inverse_sorting(opts) do
375
- if raw_doc = view.limit(-1).first
394
+ if raw_doc = view.limit(1).first
376
395
  doc = Factory.from_db(klass, raw_doc, criteria)
377
396
  eager_load([doc]).first
378
397
  end