mongoid 7.1.0.rc0 → 7.2.0.rc1

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 (508) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +6 -6
  5. data/LICENSE +1 -1
  6. data/README.md +14 -7
  7. data/Rakefile +21 -0
  8. data/lib/config/locales/en.yml +42 -6
  9. data/lib/mongoid.rb +26 -2
  10. data/lib/mongoid/association/accessors.rb +37 -2
  11. data/lib/mongoid/association/depending.rb +1 -6
  12. data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
  14. data/lib/mongoid/association/many.rb +5 -4
  15. data/lib/mongoid/association/proxy.rb +6 -4
  16. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
  17. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  18. data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
  19. data/lib/mongoid/association/referenced/eager.rb +29 -9
  20. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  21. data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -15
  22. data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -3
  23. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  24. data/lib/mongoid/atomic.rb +13 -3
  25. data/lib/mongoid/atomic/modifiers.rb +1 -1
  26. data/lib/mongoid/attributes.rb +28 -20
  27. data/lib/mongoid/attributes/dynamic.rb +1 -1
  28. data/lib/mongoid/clients/factory.rb +19 -2
  29. data/lib/mongoid/clients/options.rb +8 -8
  30. data/lib/mongoid/clients/sessions.rb +20 -4
  31. data/lib/mongoid/clients/storage_options.rb +5 -5
  32. data/lib/mongoid/composable.rb +1 -0
  33. data/lib/mongoid/config.rb +45 -12
  34. data/lib/mongoid/config/options.rb +5 -2
  35. data/lib/mongoid/contextual.rb +5 -4
  36. data/lib/mongoid/contextual/geo_near.rb +3 -2
  37. data/lib/mongoid/contextual/map_reduce.rb +3 -2
  38. data/lib/mongoid/contextual/mongo.rb +25 -5
  39. data/lib/mongoid/copyable.rb +2 -2
  40. data/lib/mongoid/criteria.rb +80 -11
  41. data/lib/mongoid/criteria/modifiable.rb +2 -1
  42. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  43. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  45. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  46. data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
  47. data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
  48. data/lib/mongoid/criteria/queryable/selectable.rb +141 -19
  49. data/lib/mongoid/criteria/queryable/selector.rb +3 -3
  50. data/lib/mongoid/criteria/queryable/storable.rb +106 -101
  51. data/lib/mongoid/document.rb +15 -3
  52. data/lib/mongoid/errors.rb +7 -0
  53. data/lib/mongoid/errors/eager_load.rb +2 -0
  54. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  55. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  56. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  57. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  58. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  59. data/lib/mongoid/errors/invalid_query.rb +41 -0
  60. data/lib/mongoid/errors/no_client_config.rb +2 -2
  61. data/lib/mongoid/errors/no_default_client.rb +1 -1
  62. data/lib/mongoid/extensions/hash.rb +4 -2
  63. data/lib/mongoid/extensions/regexp.rb +1 -1
  64. data/lib/mongoid/factory.rb +27 -10
  65. data/lib/mongoid/fields.rb +2 -1
  66. data/lib/mongoid/fields/standard.rb +2 -1
  67. data/lib/mongoid/fields/validators/macro.rb +26 -10
  68. data/lib/mongoid/findable.rb +55 -18
  69. data/lib/mongoid/indexable.rb +2 -2
  70. data/lib/mongoid/interceptable.rb +5 -1
  71. data/lib/mongoid/matchable.rb +1 -149
  72. data/lib/mongoid/matcher.rb +127 -0
  73. data/lib/mongoid/matcher/all.rb +22 -0
  74. data/lib/mongoid/matcher/and.rb +21 -0
  75. data/lib/mongoid/matcher/elem_match.rb +35 -0
  76. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  77. data/lib/mongoid/matcher/eq.rb +11 -0
  78. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  79. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  80. data/lib/mongoid/matcher/exists.rb +15 -0
  81. data/lib/mongoid/matcher/expression.rb +40 -0
  82. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  83. data/lib/mongoid/matcher/field_expression.rb +63 -0
  84. data/lib/mongoid/matcher/field_operator.rb +52 -0
  85. data/lib/mongoid/matcher/gt.rb +17 -0
  86. data/lib/mongoid/matcher/gte.rb +17 -0
  87. data/lib/mongoid/matcher/in.rb +25 -0
  88. data/lib/mongoid/matcher/lt.rb +17 -0
  89. data/lib/mongoid/matcher/lte.rb +17 -0
  90. data/lib/mongoid/matcher/ne.rb +16 -0
  91. data/lib/mongoid/matcher/nin.rb +11 -0
  92. data/lib/mongoid/matcher/nor.rb +25 -0
  93. data/lib/mongoid/matcher/not.rb +29 -0
  94. data/lib/mongoid/matcher/or.rb +21 -0
  95. data/lib/mongoid/matcher/regex.rb +41 -0
  96. data/lib/mongoid/matcher/size.rb +26 -0
  97. data/lib/mongoid/persistable/deletable.rb +1 -1
  98. data/lib/mongoid/persistable/pushable.rb +11 -2
  99. data/lib/mongoid/persistence_context.rb +6 -6
  100. data/lib/mongoid/query_cache.rb +83 -38
  101. data/lib/mongoid/railties/database.rake +7 -0
  102. data/lib/mongoid/reloadable.rb +2 -2
  103. data/lib/mongoid/serializable.rb +11 -3
  104. data/lib/mongoid/shardable.rb +56 -4
  105. data/lib/mongoid/tasks/database.rake +10 -5
  106. data/lib/mongoid/tasks/database.rb +83 -0
  107. data/lib/mongoid/timestamps/timeless.rb +3 -1
  108. data/lib/mongoid/traversable.rb +111 -4
  109. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  110. data/lib/mongoid/version.rb +1 -1
  111. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
  112. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  113. data/spec/integration/app_spec.rb +254 -0
  114. data/spec/integration/associations/embedded_spec.rb +148 -0
  115. data/spec/integration/associations/has_many_spec.rb +69 -0
  116. data/spec/integration/associations/has_one_spec.rb +69 -0
  117. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  118. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  119. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  120. data/spec/integration/criteria/date_field_spec.rb +41 -0
  121. data/spec/integration/criteria/logical_spec.rb +13 -0
  122. data/spec/integration/discriminator_key_spec.rb +354 -0
  123. data/spec/integration/discriminator_value_spec.rb +207 -0
  124. data/spec/integration/document_spec.rb +22 -0
  125. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  126. data/spec/integration/matcher_operator_data/all.yml +140 -0
  127. data/spec/integration/matcher_operator_data/and.yml +93 -0
  128. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  129. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  130. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  131. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  132. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  133. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  134. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  135. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  136. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  137. data/spec/integration/matcher_operator_data/in.yml +194 -0
  138. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  139. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  140. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  141. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  142. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  143. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  144. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  145. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  146. data/spec/integration/matcher_operator_data/not.yml +196 -0
  147. data/spec/integration/matcher_operator_data/or.yml +137 -0
  148. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  149. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  150. data/spec/integration/matcher_operator_data/size.yml +174 -0
  151. data/spec/integration/matcher_operator_spec.rb +100 -0
  152. data/spec/integration/matcher_spec.rb +189 -0
  153. data/spec/integration/server_query_spec.rb +142 -0
  154. data/spec/integration/shardable_spec.rb +149 -0
  155. data/spec/lite_spec_helper.rb +15 -4
  156. data/spec/mongoid/association/accessors_spec.rb +238 -63
  157. data/spec/mongoid/association/depending_spec.rb +78 -26
  158. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  159. data/spec/mongoid/association/embedded/embeds_many_models.rb +20 -0
  160. data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
  161. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  162. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
  163. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
  164. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
  165. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +146 -68
  166. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +462 -187
  167. data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
  168. data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
  169. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  170. data/spec/mongoid/atomic_spec.rb +23 -0
  171. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  172. data/spec/mongoid/attributes_spec.rb +19 -7
  173. data/spec/mongoid/changeable_spec.rb +23 -0
  174. data/spec/mongoid/clients/factory_spec.rb +45 -8
  175. data/spec/mongoid/clients/options_spec.rb +11 -11
  176. data/spec/mongoid/clients/sessions_spec.rb +9 -10
  177. data/spec/mongoid/clients/transactions_spec.rb +20 -8
  178. data/spec/mongoid/clients_spec.rb +2 -2
  179. data/spec/mongoid/config_spec.rb +28 -0
  180. data/spec/mongoid/contextual/atomic_spec.rb +22 -11
  181. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  182. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  183. data/spec/mongoid/contextual/mongo_spec.rb +146 -69
  184. data/spec/mongoid/copyable_spec.rb +153 -1
  185. data/spec/mongoid/copyable_spec_models.rb +14 -0
  186. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
  187. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  188. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
  189. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  190. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  191. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
  192. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
  193. data/spec/mongoid/criteria/queryable/selectable_spec.rb +136 -82
  194. data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
  195. data/spec/mongoid/criteria_spec.rb +240 -41
  196. data/spec/mongoid/document_fields_spec.rb +29 -0
  197. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  198. data/spec/mongoid/document_spec.rb +89 -15
  199. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  200. data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
  201. data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
  202. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
  203. data/spec/mongoid/factory_spec.rb +261 -28
  204. data/spec/mongoid/fields_spec.rb +72 -3
  205. data/spec/mongoid/findable_spec.rb +32 -0
  206. data/spec/mongoid/indexable_spec.rb +34 -6
  207. data/spec/mongoid/inspectable_spec.rb +29 -2
  208. data/spec/mongoid/interceptable_spec.rb +64 -2
  209. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  210. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  211. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  212. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  213. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  214. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  215. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  216. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  217. data/spec/mongoid/query_cache_spec.rb +498 -29
  218. data/spec/mongoid/relations/proxy_spec.rb +1 -1
  219. data/spec/mongoid/reloadable_spec.rb +72 -0
  220. data/spec/mongoid/scopable_spec.rb +2 -1
  221. data/spec/mongoid/serializable_spec.rb +149 -20
  222. data/spec/mongoid/shardable_models.rb +61 -0
  223. data/spec/mongoid/shardable_spec.rb +69 -16
  224. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  225. data/spec/mongoid/tasks/database_spec.rb +1 -1
  226. data/spec/mongoid/traversable_spec.rb +1100 -0
  227. data/spec/spec_helper.rb +4 -33
  228. data/spec/support/child_process_helper.rb +79 -0
  229. data/spec/support/cluster_config.rb +3 -3
  230. data/spec/support/constraints.rb +50 -10
  231. data/spec/support/expectations.rb +3 -1
  232. data/spec/support/helpers.rb +11 -0
  233. data/spec/support/lite_constraints.rb +22 -0
  234. data/spec/{app → support}/models/account.rb +0 -0
  235. data/spec/{app → support}/models/acolyte.rb +0 -0
  236. data/spec/{app → support}/models/actor.rb +1 -1
  237. data/spec/{app → support}/models/actress.rb +0 -0
  238. data/spec/{app → support}/models/address.rb +0 -0
  239. data/spec/{app → support}/models/address_component.rb +0 -0
  240. data/spec/{app → support}/models/address_number.rb +0 -0
  241. data/spec/{app → support}/models/agency.rb +0 -0
  242. data/spec/{app → support}/models/agent.rb +0 -0
  243. data/spec/{app → support}/models/album.rb +0 -0
  244. data/spec/{app → support}/models/alert.rb +0 -0
  245. data/spec/{app → support}/models/animal.rb +0 -0
  246. data/spec/{app → support}/models/answer.rb +0 -0
  247. data/spec/{app → support}/models/appointment.rb +0 -0
  248. data/spec/support/models/armrest.rb +10 -0
  249. data/spec/{app → support}/models/array_field.rb +0 -0
  250. data/spec/{app → support}/models/article.rb +0 -0
  251. data/spec/{app → support}/models/artist.rb +0 -0
  252. data/spec/{app → support}/models/artwork.rb +0 -0
  253. data/spec/{app → support}/models/audio.rb +0 -0
  254. data/spec/{app → support}/models/augmentation.rb +0 -0
  255. data/spec/{app → support}/models/author.rb +0 -0
  256. data/spec/{app → support}/models/baby.rb +0 -0
  257. data/spec/{app → support}/models/band.rb +0 -0
  258. data/spec/{app → support}/models/bar.rb +0 -0
  259. data/spec/{app → support}/models/basic.rb +0 -0
  260. data/spec/{app → support}/models/bed.rb +0 -0
  261. data/spec/{app → support}/models/big_palette.rb +0 -0
  262. data/spec/{app → support}/models/birthday.rb +0 -0
  263. data/spec/{app → support}/models/bomb.rb +0 -0
  264. data/spec/{app → support}/models/book.rb +0 -0
  265. data/spec/{app → support}/models/breed.rb +0 -0
  266. data/spec/{app → support}/models/browser.rb +1 -1
  267. data/spec/{app → support}/models/building.rb +0 -0
  268. data/spec/{app → support}/models/building_address.rb +0 -0
  269. data/spec/{app → support}/models/bus.rb +0 -0
  270. data/spec/{app → support}/models/business.rb +0 -0
  271. data/spec/{app → support}/models/callback_test.rb +0 -0
  272. data/spec/{app → support}/models/canvas.rb +1 -1
  273. data/spec/{app → support}/models/car.rb +0 -0
  274. data/spec/{app → support}/models/cat.rb +0 -0
  275. data/spec/{app → support}/models/category.rb +0 -0
  276. data/spec/{app → support}/models/child.rb +0 -0
  277. data/spec/{app → support}/models/child_doc.rb +0 -0
  278. data/spec/{app → support}/models/church.rb +0 -0
  279. data/spec/{app → support}/models/circle.rb +0 -0
  280. data/spec/{app → support}/models/circuit.rb +0 -0
  281. data/spec/{app → support}/models/circus.rb +0 -0
  282. data/spec/{app → support}/models/code.rb +0 -0
  283. data/spec/support/models/coding.rb +4 -0
  284. data/spec/support/models/coding/pull_request.rb +12 -0
  285. data/spec/{app → support}/models/comment.rb +0 -0
  286. data/spec/{app → support}/models/company.rb +0 -0
  287. data/spec/{app → support}/models/consumption_period.rb +0 -0
  288. data/spec/{app → support}/models/contextable_item.rb +0 -0
  289. data/spec/{app → support}/models/contractor.rb +0 -0
  290. data/spec/{app → support}/models/cookie.rb +0 -0
  291. data/spec/{app → support}/models/country_code.rb +0 -0
  292. data/spec/{app → support}/models/courier_job.rb +0 -0
  293. data/spec/support/models/crate.rb +13 -0
  294. data/spec/support/models/deed.rb +8 -0
  295. data/spec/{app → support}/models/definition.rb +0 -0
  296. data/spec/support/models/delegating_patient.rb +16 -0
  297. data/spec/{app → support}/models/description.rb +0 -0
  298. data/spec/{app → support}/models/dictionary.rb +0 -0
  299. data/spec/{app → support}/models/division.rb +0 -0
  300. data/spec/{app → support}/models/doctor.rb +0 -0
  301. data/spec/{app → support}/models/dog.rb +0 -0
  302. data/spec/{app → support}/models/dokument.rb +0 -0
  303. data/spec/{app → support}/models/draft.rb +0 -0
  304. data/spec/{app → support}/models/dragon.rb +0 -0
  305. data/spec/{app → support}/models/driver.rb +1 -1
  306. data/spec/{app → support}/models/drug.rb +0 -0
  307. data/spec/{app → support}/models/dungeon.rb +0 -0
  308. data/spec/{app → support}/models/edit.rb +0 -0
  309. data/spec/{app → support}/models/email.rb +0 -0
  310. data/spec/{app → support}/models/employer.rb +0 -0
  311. data/spec/{app → support}/models/entry.rb +0 -0
  312. data/spec/{app → support}/models/eraser.rb +0 -0
  313. data/spec/{app → support}/models/even.rb +0 -0
  314. data/spec/{app → support}/models/event.rb +0 -0
  315. data/spec/{app → support}/models/exhibition.rb +0 -0
  316. data/spec/{app → support}/models/exhibitor.rb +0 -0
  317. data/spec/{app → support}/models/explosion.rb +0 -0
  318. data/spec/{app → support}/models/eye.rb +0 -0
  319. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  320. data/spec/{app → support}/models/face.rb +0 -0
  321. data/spec/{app → support}/models/favorite.rb +0 -0
  322. data/spec/{app → support}/models/filesystem.rb +0 -0
  323. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  324. data/spec/{app → support}/models/firefox.rb +0 -0
  325. data/spec/{app → support}/models/fish.rb +0 -0
  326. data/spec/{app → support}/models/folder.rb +0 -0
  327. data/spec/{app → support}/models/folder_item.rb +0 -0
  328. data/spec/{app → support}/models/fruits.rb +0 -0
  329. data/spec/{app → support}/models/game.rb +0 -0
  330. data/spec/{app → support}/models/ghost.rb +0 -0
  331. data/spec/support/models/guitar.rb +5 -0
  332. data/spec/{app → support}/models/home.rb +0 -0
  333. data/spec/{app → support}/models/house.rb +0 -0
  334. data/spec/{app → support}/models/html_writer.rb +0 -0
  335. data/spec/{app → support}/models/id_key.rb +0 -0
  336. data/spec/support/models/idnodef.rb +8 -0
  337. data/spec/{app → support}/models/image.rb +0 -0
  338. data/spec/{app → support}/models/implant.rb +0 -0
  339. data/spec/support/models/instrument.rb +9 -0
  340. data/spec/{app → support}/models/item.rb +1 -1
  341. data/spec/{app → support}/models/jar.rb +0 -0
  342. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  343. data/spec/{app → support}/models/kangaroo.rb +0 -0
  344. data/spec/{app → support}/models/label.rb +0 -0
  345. data/spec/{app → support}/models/language.rb +0 -0
  346. data/spec/{app → support}/models/lat_lng.rb +0 -0
  347. data/spec/{app → support}/models/league.rb +0 -0
  348. data/spec/{app → support}/models/learner.rb +0 -0
  349. data/spec/{app → support}/models/line_item.rb +0 -0
  350. data/spec/{app → support}/models/location.rb +0 -0
  351. data/spec/{app → support}/models/login.rb +0 -0
  352. data/spec/{app → support}/models/manufacturer.rb +0 -0
  353. data/spec/{app → support}/models/meat.rb +0 -0
  354. data/spec/{app → support}/models/membership.rb +0 -0
  355. data/spec/{app → support}/models/message.rb +0 -0
  356. data/spec/{app → support}/models/minim.rb +0 -0
  357. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  358. data/spec/support/models/mop.rb +16 -0
  359. data/spec/{app → support}/models/movie.rb +0 -0
  360. data/spec/{app → support}/models/my_hash.rb +0 -0
  361. data/spec/{app → support}/models/name.rb +0 -0
  362. data/spec/{app → support}/models/name_only.rb +0 -0
  363. data/spec/{app → support}/models/node.rb +0 -0
  364. data/spec/{app → support}/models/note.rb +0 -0
  365. data/spec/{app → support}/models/odd.rb +0 -0
  366. data/spec/{app → support}/models/ordered_post.rb +0 -0
  367. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  368. data/spec/{app → support}/models/oscar.rb +0 -0
  369. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  370. data/spec/{app → support}/models/override.rb +0 -0
  371. data/spec/{app → support}/models/ownable.rb +0 -0
  372. data/spec/{app → support}/models/owner.rb +2 -0
  373. data/spec/{app → support}/models/pack.rb +0 -0
  374. data/spec/{app → support}/models/page.rb +0 -0
  375. data/spec/{app → support}/models/page_question.rb +0 -0
  376. data/spec/{app → support}/models/palette.rb +1 -1
  377. data/spec/{app → support}/models/parent.rb +0 -0
  378. data/spec/{app → support}/models/parent_doc.rb +0 -0
  379. data/spec/{app → support}/models/passport.rb +1 -0
  380. data/spec/{app → support}/models/patient.rb +0 -0
  381. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  382. data/spec/{app → support}/models/pencil.rb +0 -0
  383. data/spec/{app → support}/models/person.rb +1 -1
  384. data/spec/{app → support}/models/pet.rb +0 -0
  385. data/spec/{app → support}/models/pet_owner.rb +0 -0
  386. data/spec/{app → support}/models/phone.rb +1 -0
  387. data/spec/support/models/piano.rb +5 -0
  388. data/spec/{app → support}/models/pizza.rb +0 -0
  389. data/spec/{app → support}/models/player.rb +0 -0
  390. data/spec/{app → support}/models/post.rb +0 -0
  391. data/spec/{app → support}/models/post_genre.rb +0 -0
  392. data/spec/{app → support}/models/powerup.rb +0 -0
  393. data/spec/{app → support}/models/preference.rb +0 -0
  394. data/spec/{app → support}/models/princess.rb +0 -0
  395. data/spec/{app → support}/models/product.rb +0 -0
  396. data/spec/support/models/profile.rb +18 -0
  397. data/spec/{app → support}/models/pronunciation.rb +0 -0
  398. data/spec/{app → support}/models/pub.rb +0 -0
  399. data/spec/support/models/publication.rb +5 -0
  400. data/spec/support/models/publication/encyclopedia.rb +12 -0
  401. data/spec/support/models/publication/review.rb +14 -0
  402. data/spec/{app → support}/models/purchase.rb +0 -0
  403. data/spec/{app → support}/models/question.rb +0 -0
  404. data/spec/{app → support}/models/quiz.rb +0 -0
  405. data/spec/{app → support}/models/rating.rb +0 -0
  406. data/spec/{app → support}/models/record.rb +0 -0
  407. data/spec/{app → support}/models/registry.rb +0 -0
  408. data/spec/{app → support}/models/role.rb +0 -0
  409. data/spec/{app → support}/models/root_category.rb +0 -0
  410. data/spec/{app → support}/models/sandwich.rb +0 -0
  411. data/spec/{app → support}/models/scheduler.rb +0 -0
  412. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  413. data/spec/support/models/seat.rb +25 -0
  414. data/spec/{app → support}/models/seo.rb +0 -0
  415. data/spec/{app → support}/models/series.rb +0 -0
  416. data/spec/{app → support}/models/server.rb +0 -0
  417. data/spec/{app → support}/models/service.rb +0 -0
  418. data/spec/{app → support}/models/shape.rb +2 -2
  419. data/spec/{app → support}/models/shelf.rb +0 -0
  420. data/spec/{app → support}/models/shipment_address.rb +0 -0
  421. data/spec/{app → support}/models/shipping_container.rb +0 -0
  422. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  423. data/spec/{app → support}/models/shop.rb +0 -0
  424. data/spec/{app → support}/models/short_agent.rb +0 -0
  425. data/spec/{app → support}/models/short_quiz.rb +0 -0
  426. data/spec/{app → support}/models/simple.rb +0 -0
  427. data/spec/{app → support}/models/slave.rb +0 -0
  428. data/spec/{app → support}/models/song.rb +0 -0
  429. data/spec/{app → support}/models/sound.rb +0 -0
  430. data/spec/{app → support}/models/square.rb +0 -0
  431. data/spec/{app → support}/models/staff.rb +0 -0
  432. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  433. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  434. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  435. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  436. data/spec/{app → support}/models/strategy.rb +0 -0
  437. data/spec/{app → support}/models/sub_item.rb +0 -0
  438. data/spec/{app → support}/models/subscription.rb +0 -0
  439. data/spec/{app → support}/models/survey.rb +0 -0
  440. data/spec/{app → support}/models/symptom.rb +0 -0
  441. data/spec/support/models/system_role.rb +7 -0
  442. data/spec/{app → support}/models/tag.rb +0 -0
  443. data/spec/{app → support}/models/target.rb +0 -0
  444. data/spec/{app → support}/models/template.rb +0 -0
  445. data/spec/{app → support}/models/thing.rb +0 -0
  446. data/spec/{app → support}/models/title.rb +0 -0
  447. data/spec/{app → support}/models/tool.rb +2 -2
  448. data/spec/{app → support}/models/topping.rb +0 -0
  449. data/spec/support/models/toy.rb +10 -0
  450. data/spec/{app → support}/models/track.rb +0 -0
  451. data/spec/{app → support}/models/translation.rb +0 -0
  452. data/spec/{app → support}/models/tree.rb +0 -0
  453. data/spec/{app → support}/models/truck.rb +2 -0
  454. data/spec/{app → support}/models/updatable.rb +0 -0
  455. data/spec/{app → support}/models/user.rb +0 -0
  456. data/spec/{app → support}/models/user_account.rb +0 -0
  457. data/spec/{app → support}/models/validation_callback.rb +0 -0
  458. data/spec/{app → support}/models/vehicle.rb +7 -2
  459. data/spec/{app → support}/models/version.rb +0 -0
  460. data/spec/{app → support}/models/vertex.rb +0 -0
  461. data/spec/{app → support}/models/vet_visit.rb +0 -0
  462. data/spec/{app → support}/models/video.rb +0 -0
  463. data/spec/{app → support}/models/video_game.rb +0 -0
  464. data/spec/{app → support}/models/weapon.rb +0 -0
  465. data/spec/{app → support}/models/wiki_page.rb +0 -0
  466. data/spec/{app → support}/models/word.rb +0 -0
  467. data/spec/{app → support}/models/word_origin.rb +0 -0
  468. data/spec/{app → support}/models/writer.rb +2 -2
  469. data/spec/support/session_registry.rb +50 -0
  470. data/spec/support/spec_config.rb +13 -5
  471. data/spec/support/spec_organizer.rb +130 -0
  472. metadata +882 -752
  473. metadata.gz.sig +0 -0
  474. data/lib/mongoid/matchable/all.rb +0 -30
  475. data/lib/mongoid/matchable/and.rb +0 -32
  476. data/lib/mongoid/matchable/default.rb +0 -121
  477. data/lib/mongoid/matchable/elem_match.rb +0 -36
  478. data/lib/mongoid/matchable/eq.rb +0 -23
  479. data/lib/mongoid/matchable/exists.rb +0 -25
  480. data/lib/mongoid/matchable/gt.rb +0 -25
  481. data/lib/mongoid/matchable/gte.rb +0 -25
  482. data/lib/mongoid/matchable/in.rb +0 -26
  483. data/lib/mongoid/matchable/lt.rb +0 -25
  484. data/lib/mongoid/matchable/lte.rb +0 -25
  485. data/lib/mongoid/matchable/ne.rb +0 -23
  486. data/lib/mongoid/matchable/nin.rb +0 -24
  487. data/lib/mongoid/matchable/nor.rb +0 -38
  488. data/lib/mongoid/matchable/or.rb +0 -35
  489. data/lib/mongoid/matchable/regexp.rb +0 -30
  490. data/lib/mongoid/matchable/size.rb +0 -23
  491. data/spec/mongoid/matchable/all_spec.rb +0 -34
  492. data/spec/mongoid/matchable/and_spec.rb +0 -190
  493. data/spec/mongoid/matchable/default_spec.rb +0 -140
  494. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  495. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  496. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  497. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  498. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  499. data/spec/mongoid/matchable/in_spec.rb +0 -52
  500. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  501. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  502. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  503. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  504. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  505. data/spec/mongoid/matchable/or_spec.rb +0 -134
  506. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  507. data/spec/mongoid/matchable/size_spec.rb +0 -28
  508. data/spec/mongoid/matchable_spec.rb +0 -856
@@ -41,12 +41,20 @@ module Mongoid
41
41
  #
42
42
  # @since 6.4.0
43
43
  def with_session(options = {})
44
- raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting) if Threaded.get_session
44
+ if Threaded.get_session
45
+ raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
46
+ end
45
47
  session = persistence_context.client.start_session(options)
46
48
  Threaded.set_session(session)
47
49
  yield(session)
48
50
  rescue Mongo::Error::InvalidSession => ex
49
- if ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
51
+ if
52
+ # Driver 2.13.0+
53
+ defined?(Mongo::Error::SessionsNotSupported) &&
54
+ Mongo::Error::SessionsNotSupported === ex ||
55
+ # Legacy drivers
56
+ ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
57
+ then
50
58
  raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
51
59
  end
52
60
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
@@ -92,12 +100,20 @@ module Mongoid
92
100
  #
93
101
  # @since 6.4.0
94
102
  def with_session(options = {})
95
- raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting) if Threaded.get_session
103
+ if Threaded.get_session
104
+ raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_nesting)
105
+ end
96
106
  session = persistence_context.client.start_session(options)
97
107
  Threaded.set_session(session)
98
108
  yield(session)
99
109
  rescue Mongo::Error::InvalidSession => ex
100
- if ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
110
+ if
111
+ # Driver 2.13.0+
112
+ defined?(Mongo::Error::SessionsNotSupported) &&
113
+ Mongo::Error::SessionsNotSupported === ex ||
114
+ # Legacy drivers
115
+ ex.message == Mongo::Session::SESSIONS_NOT_SUPPORTED
116
+ then
101
117
  raise Mongoid::Errors::InvalidSessionUse.new(:sessions_not_supported)
102
118
  end
103
119
  raise Mongoid::Errors::InvalidSessionUse.new(:invalid_session_use)
@@ -32,20 +32,20 @@ module Mongoid
32
32
  # @example Store this model by default in a different client.
33
33
  # class Band
34
34
  # include Mongoid::Document
35
- # store_in client: "secondary"
35
+ # store_in client: "analytics"
36
36
  # end
37
37
  #
38
38
  # @example Store this model with a combination of options.
39
39
  # class Band
40
40
  # include Mongoid::Document
41
- # store_in collection: "artists", database: "secondary"
41
+ # store_in collection: "artists", database: "music"
42
42
  # end
43
43
  #
44
44
  # @param [ Hash ] options The storage options.
45
45
  #
46
- # @option options [ String, Symbol ] :collection The collection name.
47
- # @option options [ String, Symbol ] :database The database name.
48
- # @option options [ String, Symbol ] :client The client name.
46
+ # @option options [ String | Symbol ] :collection The collection name.
47
+ # @option options [ String | Symbol ] :database The database name.
48
+ # @option options [ String | Symbol ] :client The client name.
49
49
  #
50
50
  # @return [ Class ] The model class.
51
51
  #
@@ -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"
@@ -10,22 +10,42 @@ module Mongoid
10
10
  # This module defines all the configuration options for Mongoid, including
11
11
  # the database connections.
12
12
  module Config
13
- extend self
13
+ extend Forwardable
14
14
  extend Options
15
+ extend self
15
16
 
16
- delegate :logger=, to: ::Mongoid
17
- delegate :logger, to: ::Mongoid
17
+ def_delegators ::Mongoid, :logger, :logger=
18
18
 
19
19
  LOCK = Mutex.new
20
20
 
21
+ # Application name that is printed to the mongodb logs upon establishing
22
+ # a connection in server versions >= 3.4. Note that the name cannot
23
+ # exceed 128 bytes. It is also used as the database name if the
24
+ # database name is not explicitly defined.
25
+ option :app_name, default: nil
26
+
27
+ # Create indexes in background by default.
28
+ option :background_indexing, default: false
29
+
30
+ # Mark belongs_to associations as required by default, so that saving a
31
+ # model with a missing belongs_to association will trigger a validation
32
+ # error.
33
+ option :belongs_to_required_by_default, default: true
34
+
35
+ # Set the global discriminator key.
36
+ option :discriminator_key, default: "_type"
37
+
38
+ # Raise an exception when a field is redefined.
39
+ option :duplicate_fields_exception, default: false
40
+
41
+ # Include the root model name in json serialization.
21
42
  option :include_root_in_json, default: false
43
+
44
+ # # Include the _type field in serialization.
22
45
  option :include_type_for_serialization, default: false
23
- option :preload_models, default: false
24
- option :raise_not_found_error, default: true
25
- option :scope_overwrite_exception, default: false
26
- option :duplicate_fields_exception, default: false
27
- option :use_activesupport_time_zone, default: true
28
- option :use_utc, default: false
46
+
47
+ # Whether to join nested persistence contexts for atomic operations
48
+ # to parent contexts by default.
29
49
  option :join_contexts, default: false
30
50
 
31
51
  # The log level.
@@ -38,9 +58,22 @@ module Mongoid
38
58
  # configuration file is the log level given by this option honored.
39
59
  option :log_level, default: :info
40
60
 
41
- option :belongs_to_required_by_default, default: true
42
- option :app_name, default: nil
43
- option :background_indexing, default: false
61
+ # Preload all models in development, needed when models use inheritance.
62
+ option :preload_models, default: false
63
+
64
+ # Raise an error when performing a #find and the document is not found.
65
+ option :raise_not_found_error, default: true
66
+
67
+ # Raise an error when defining a scope with the same name as an
68
+ # existing method.
69
+ option :scope_overwrite_exception, default: false
70
+
71
+ # Use ActiveSupport's time zone in time operations instead of the
72
+ # Ruby default time zone.
73
+ option :use_activesupport_time_zone, default: true
74
+
75
+ # Return stored times as UTC.
76
+ option :use_utc, default: false
44
77
 
45
78
  # Has Mongoid been configured? This is checking that at least a valid
46
79
  # client config exists.
@@ -34,8 +34,11 @@ module Mongoid
34
34
  defaults[name] = settings[name] = options[:default]
35
35
 
36
36
  class_eval do
37
- define_method(name) do
38
- settings[name]
37
+ # log_level accessor is defined specially below
38
+ unless name.to_sym == :log_level
39
+ define_method(name) do
40
+ settings[name]
41
+ end
39
42
  end
40
43
 
41
44
  define_method("#{name}=") do |value|
@@ -8,21 +8,22 @@ require "mongoid/contextual/none"
8
8
 
9
9
  module Mongoid
10
10
  module Contextual
11
+ extend Forwardable
11
12
 
12
13
  # The aggregate operations provided in the aggregate module get delegated
13
14
  # through to the context from the criteria.
14
- delegate(*Aggregable::Mongo.public_instance_methods(false), to: :context)
15
+ def_delegators :context, *Aggregable::Mongo.public_instance_methods(false)
15
16
 
16
17
  # The atomic operations provided in the atomic context get delegated
17
18
  # through to the context from the criteria.
18
- delegate(*Atomic.public_instance_methods(false), to: :context)
19
+ def_delegators :context, *Atomic.public_instance_methods(false)
19
20
 
20
21
  # The methods in the contexts themselves should all get delegated to,
21
22
  # including destructive, modification, and optional methods.
22
- delegate(*(Mongo.public_instance_methods(false) - [ :skip, :limit ]), to: :context)
23
+ def_delegators :context, *(Mongo.public_instance_methods(false) - [ :skip, :limit ])
23
24
 
24
25
  # This gets blank and empty included.
25
- delegate(*Queryable.public_instance_methods(false), to: :context)
26
+ def_delegators :context, *Queryable.public_instance_methods(false)
26
27
 
27
28
  # Get the context in which criteria queries should execute. This is either
28
29
  # in memory (for embedded documents) or mongo (for root level documents.)
@@ -4,11 +4,12 @@
4
4
  module Mongoid
5
5
  module Contextual
6
6
  class GeoNear
7
+ extend Forwardable
7
8
  include Enumerable
8
9
  include Command
9
10
 
10
- delegate :[], to: :results
11
- delegate :==, :empty?, to: :entries
11
+ def_delegator :results, :[]
12
+ def_delegators :entries, :==, :empty?
12
13
 
13
14
  # Get the average distance for all documents from the point in the
14
15
  # command.
@@ -4,11 +4,12 @@
4
4
  module Mongoid
5
5
  module Contextual
6
6
  class MapReduce
7
+ extend Forwardable
7
8
  include Enumerable
8
9
  include Command
9
10
 
10
- delegate :[], to: :results
11
- delegate :==, :empty?, to: :entries
11
+ def_delegators :results, :[]
12
+ def_delegators :entries, :==, :empty?
12
13
 
13
14
  # Get all the counts returned by the map/reduce.
14
15
  #
@@ -11,6 +11,7 @@ require "mongoid/association/eager_loadable"
11
11
  module Mongoid
12
12
  module Contextual
13
13
  class Mongo
14
+ extend Forwardable
14
15
  include Enumerable
15
16
  include Aggregable::Mongo
16
17
  include Atomic
@@ -70,7 +71,26 @@ module Mongoid
70
71
  # @since 3.0.0
71
72
  def count(options = {}, &block)
72
73
  return super(&block) if block_given?
73
- 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) }
74
94
  end
75
95
 
76
96
  # Delete all documents in the database that match the selector.
@@ -257,12 +277,12 @@ module Mongoid
257
277
  return documents.first if cached? && cache_loaded?
258
278
  try_cache(:first) do
259
279
  if sort = view.sort || ({ _id: 1 } unless opts[:id_sort] == :none)
260
- if raw_doc = view.sort(sort).limit(-1).first
280
+ if raw_doc = view.sort(sort).limit(1).first
261
281
  doc = Factory.from_db(klass, raw_doc, criteria)
262
282
  eager_load([doc]).first
263
283
  end
264
284
  else
265
- if raw_doc = view.limit(-1).first
285
+ if raw_doc = view.limit(1).first
266
286
  doc = Factory.from_db(klass, raw_doc, criteria)
267
287
  eager_load([doc]).first
268
288
  end
@@ -349,7 +369,7 @@ module Mongoid
349
369
  apply_options
350
370
  end
351
371
 
352
- delegate(:database_field_name, to: :@klass)
372
+ def_delegator :@klass, :database_field_name
353
373
 
354
374
  # Get the last document in the database for the criteria's selector.
355
375
  #
@@ -371,7 +391,7 @@ module Mongoid
371
391
  def last(opts = {})
372
392
  try_cache(:last) do
373
393
  with_inverse_sorting(opts) do
374
- if raw_doc = view.limit(-1).first
394
+ if raw_doc = view.limit(1).first
375
395
  doc = Factory.from_db(klass, raw_doc, criteria)
376
396
  eager_load([doc]).first
377
397
  end
@@ -76,8 +76,8 @@ module Mongoid
76
76
 
77
77
  if association.is_a?(Association::Embedded::EmbedsMany)
78
78
  attrs[association.key].each do |attr|
79
- embedded_klass = if type = attr['_type']
80
- type.constantize
79
+ embedded_klass = if type = attr[self.class.discriminator_key]
80
+ association.relation_class.get_discriminator_mapping(type) || association.relation_class
81
81
  else
82
82
  association.relation_class
83
83
  end
@@ -20,9 +20,17 @@ module Mongoid
20
20
  # against the database.
21
21
  class Criteria
22
22
  include Enumerable
23
+
24
+ # @api private
25
+ alias :_enumerable_find :find
26
+
23
27
  include Contextual
24
28
  include Queryable
25
29
  include Findable
30
+
31
+ # @api private
32
+ alias :_findable_find :find
33
+
26
34
  include Inspectable
27
35
  include Includable
28
36
  include Marshalable
@@ -55,6 +63,48 @@ module Mongoid
55
63
  entries == other
56
64
  end
57
65
 
66
+ # Finds one or many documents given the provided _id values, or filters
67
+ # the documents in the current scope in the application process space
68
+ # after loading them if needed.
69
+ #
70
+ # If this method is not given a block, it delegates to +Findable#find+
71
+ # and finds one or many documents for the provided _id values.
72
+ #
73
+ # If this method is given a block, it delegates to +Enumerable#find+ and
74
+ # returns the first document of those found by the current Crieria object
75
+ # for which the block returns a truthy value.
76
+ #
77
+ # Note that the "default proc" argument of Enumerable is not specially
78
+ # treated by Mongoid - the decision between delegating to +Findable+ vs
79
+ # +Enumerable+ is made solely based on whether +find+ is passed a block.
80
+ #
81
+ # @example Finds a document by its _id, invokes Findable#find.
82
+ # critera.find("1234")
83
+ #
84
+ # @example Finds the first matching document using a block, invokes Enumerable#find.
85
+ # criteria.find { |item| item.name == "Depeche Mode" }
86
+ #
87
+ # @example Finds the first matching document using a block using the default Proc, invokes Enumerable#find.
88
+ # criteria.find(-> { "Default Band" }) { |item| item.name == "Milwaukee Mode" }
89
+ #
90
+ # @example Tries to find a document whose _id is the stringification of the provided Proc, typically failing.
91
+ # enumerator = criteria.find(-> { "Default Band" })
92
+ #
93
+ # @return [ Document | Array<Document> | nil ] A document or matching documents.
94
+ #
95
+ # @raise Errors::DocumentNotFound If the parameters were _id values and
96
+ # not all documents are found and the +raise_not_found_error+
97
+ # Mongoid configuration option is truthy.
98
+ #
99
+ # @see https://ruby-doc.org/core/Enumerable.html#method-i-find
100
+ def find(*args, &block)
101
+ if block_given?
102
+ _enumerable_find(*args, &block)
103
+ else
104
+ _findable_find(*args)
105
+ end
106
+ end
107
+
58
108
  # Needed to properly get a criteria back as json
59
109
  #
60
110
  # @example Get the criteria as json.
@@ -169,7 +219,7 @@ module Mongoid
169
219
  # @since 2.0.0
170
220
  def field_list
171
221
  if options[:fields]
172
- options[:fields].keys.reject{ |key| key == "_type" }
222
+ options[:fields].keys.reject{ |key| key == klass.discriminator_key }
173
223
  else
174
224
  []
175
225
  end
@@ -292,7 +342,7 @@ module Mongoid
292
342
  args.unshift(:_id)
293
343
  end
294
344
  if klass.hereditary?
295
- super(*args.push(:_type))
345
+ super(*args.push(klass.discriminator_key.to_sym))
296
346
  else
297
347
  super(*args)
298
348
  end
@@ -379,7 +429,7 @@ module Mongoid
379
429
  #
380
430
  # @return [ Criteria ] The cloned criteria.
381
431
  def type(types)
382
- any_in(_type: Array(types))
432
+ any_in(self.discriminator_key.to_sym => Array(types))
383
433
  end
384
434
 
385
435
  # This is the general entry point for most MongoDB queries. This either
@@ -400,9 +450,22 @@ module Mongoid
400
450
  # @return [ Criteria ] The cloned selectable.
401
451
  #
402
452
  # @since 1.0.0
403
- def where(expression)
404
- if expression.is_a?(::String) && embedded?
405
- raise Errors::UnsupportedJavascript.new(klass, expression)
453
+ def where(*args)
454
+ # Historically this method required exactly one argument.
455
+ # As of https://jira.mongodb.org/browse/MONGOID-4804 it also accepts
456
+ # zero arguments.
457
+ # The underlying where implemetation that super invokes supports
458
+ # any number of arguments, but we don't presently allow mutiple
459
+ # arguments through this method. This API can be reconsidered in the
460
+ # future.
461
+ if args.length > 1
462
+ raise ArgumentError, "Criteria#where requires zero or one arguments (given #{args.length})"
463
+ end
464
+ if args.length == 1
465
+ expression = args.first
466
+ if expression.is_a?(::String) && embedded?
467
+ raise Errors::UnsupportedJavascript.new(klass, expression)
468
+ end
406
469
  end
407
470
  super
408
471
  end
@@ -437,7 +500,13 @@ module Mongoid
437
500
  #
438
501
  # @since 3.1.0
439
502
  def for_js(javascript, scope = {})
440
- js_query(BSON::CodeWithScope.new(javascript, scope))
503
+ code = if scope.empty?
504
+ # CodeWithScope is not supported for $where as of MongoDB 4.4
505
+ BSON::Code.new(javascript)
506
+ else
507
+ BSON::CodeWithScope.new(javascript, scope)
508
+ end
509
+ js_query(code)
441
510
  end
442
511
 
443
512
  private
@@ -536,8 +605,8 @@ module Mongoid
536
605
  # @since 3.0.3
537
606
  def type_selectable?
538
607
  klass.hereditary? &&
539
- !selector.keys.include?("_type") &&
540
- !selector.keys.include?(:_type)
608
+ !selector.keys.include?(self.discriminator_key) &&
609
+ !selector.keys.include?(self.discriminator_key.to_sym)
541
610
  end
542
611
 
543
612
  # Get the selector for type selection.
@@ -553,9 +622,9 @@ module Mongoid
553
622
  def type_selection
554
623
  klasses = klass._types
555
624
  if klasses.size > 1
556
- { _type: { "$in" => klass._types }}
625
+ { klass.discriminator_key.to_sym => { "$in" => klass._types }}
557
626
  else
558
- { _type: klass._types[0] }
627
+ { klass.discriminator_key.to_sym => klass._types[0] }
559
628
  end
560
629
  end
561
630