mongoid 7.1.5 → 7.2.1

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 (461) 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 +33 -7
  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 +9 -1
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  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 +7 -3
  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 +3 -7
  28. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  29. data/lib/mongoid/document.rb +18 -5
  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/extensions.rb +1 -0
  38. data/lib/mongoid/factory.rb +27 -10
  39. data/lib/mongoid/fields.rb +3 -0
  40. data/lib/mongoid/fields/validators/macro.rb +22 -9
  41. data/lib/mongoid/findable.rb +50 -14
  42. data/lib/mongoid/indexable.rb +2 -2
  43. data/lib/mongoid/interceptable.rb +3 -1
  44. data/lib/mongoid/matchable.rb +1 -149
  45. data/lib/mongoid/matcher.rb +127 -0
  46. data/lib/mongoid/matcher/all.rb +22 -0
  47. data/lib/mongoid/matcher/and.rb +21 -0
  48. data/lib/mongoid/matcher/elem_match.rb +35 -0
  49. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  50. data/lib/mongoid/matcher/eq.rb +11 -0
  51. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  52. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  53. data/lib/mongoid/matcher/exists.rb +15 -0
  54. data/lib/mongoid/matcher/expression.rb +40 -0
  55. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  56. data/lib/mongoid/matcher/field_expression.rb +63 -0
  57. data/lib/mongoid/matcher/field_operator.rb +48 -0
  58. data/lib/mongoid/matcher/gt.rb +17 -0
  59. data/lib/mongoid/matcher/gte.rb +17 -0
  60. data/lib/mongoid/matcher/in.rb +25 -0
  61. data/lib/mongoid/matcher/lt.rb +17 -0
  62. data/lib/mongoid/matcher/lte.rb +17 -0
  63. data/lib/mongoid/matcher/ne.rb +16 -0
  64. data/lib/mongoid/matcher/nin.rb +11 -0
  65. data/lib/mongoid/matcher/nor.rb +25 -0
  66. data/lib/mongoid/matcher/not.rb +29 -0
  67. data/lib/mongoid/matcher/or.rb +21 -0
  68. data/lib/mongoid/matcher/regex.rb +41 -0
  69. data/lib/mongoid/matcher/size.rb +26 -0
  70. data/lib/mongoid/persistable/deletable.rb +1 -1
  71. data/lib/mongoid/query_cache.rb +64 -62
  72. data/lib/mongoid/reloadable.rb +2 -2
  73. data/lib/mongoid/serializable.rb +1 -1
  74. data/lib/mongoid/stringified_symbol.rb +53 -0
  75. data/lib/mongoid/traversable.rb +111 -4
  76. data/lib/mongoid/version.rb +1 -1
  77. data/spec/README.md +19 -4
  78. data/spec/integration/app_spec.rb +46 -13
  79. data/spec/integration/associations/embedded_spec.rb +94 -0
  80. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  81. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  82. data/spec/integration/associations/has_many_spec.rb +108 -13
  83. data/spec/integration/associations/has_one_spec.rb +108 -13
  84. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  85. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  86. data/spec/integration/callbacks_models.rb +49 -0
  87. data/spec/integration/callbacks_spec.rb +216 -0
  88. data/spec/integration/discriminator_key_spec.rb +354 -0
  89. data/spec/integration/discriminator_value_spec.rb +207 -0
  90. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  91. data/spec/integration/matcher_operator_data/all.yml +140 -0
  92. data/spec/integration/matcher_operator_data/and.yml +93 -0
  93. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  94. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  95. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  96. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  97. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  98. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  99. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  100. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  101. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  102. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  103. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  104. data/spec/integration/matcher_operator_data/in.yml +194 -0
  105. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  106. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  107. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  108. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  109. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  110. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  111. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  112. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  113. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  114. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  115. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  116. data/spec/integration/matcher_operator_data/not.yml +196 -0
  117. data/spec/integration/matcher_operator_data/or.yml +137 -0
  118. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  119. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  120. data/spec/integration/matcher_operator_data/size.yml +174 -0
  121. data/spec/integration/matcher_operator_spec.rb +100 -0
  122. data/spec/integration/matcher_spec.rb +189 -0
  123. data/spec/integration/server_query_spec.rb +142 -0
  124. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  125. data/spec/lite_spec_helper.rb +4 -3
  126. data/spec/mongoid/association/depending_spec.rb +78 -26
  127. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  128. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  129. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  130. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  131. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  132. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  133. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  134. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  135. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  136. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  137. data/spec/mongoid/atomic_spec.rb +23 -0
  138. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  139. data/spec/mongoid/clients/factory_spec.rb +37 -0
  140. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  141. data/spec/mongoid/config_spec.rb +28 -0
  142. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  143. data/spec/mongoid/copyable_spec.rb +197 -18
  144. data/spec/mongoid/copyable_spec_models.rb +28 -0
  145. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +36 -0
  146. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  147. data/spec/mongoid/criteria_spec.rb +204 -39
  148. data/spec/mongoid/document_spec.rb +89 -15
  149. data/spec/mongoid/equality_spec.rb +0 -1
  150. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  151. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  152. data/spec/mongoid/factory_spec.rb +261 -28
  153. data/spec/mongoid/fields_spec.rb +48 -2
  154. data/spec/mongoid/findable_spec.rb +32 -0
  155. data/spec/mongoid/indexable_spec.rb +28 -2
  156. data/spec/mongoid/inspectable_spec.rb +29 -2
  157. data/spec/mongoid/interceptable_spec.rb +2 -2
  158. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  159. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  160. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  161. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  162. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  163. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  164. data/spec/mongoid/query_cache_spec.rb +442 -41
  165. data/spec/mongoid/reloadable_spec.rb +72 -0
  166. data/spec/mongoid/serializable_spec.rb +21 -3
  167. data/spec/mongoid/traversable_spec.rb +1100 -0
  168. data/spec/shared/LICENSE +20 -0
  169. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  170. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  171. data/spec/shared/lib/mrss/constraints.rb +330 -0
  172. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  173. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  174. data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
  175. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  176. data/spec/shared/share/Dockerfile.erb +229 -0
  177. data/spec/shared/shlib/distro.sh +73 -0
  178. data/spec/shared/shlib/server.sh +270 -0
  179. data/spec/shared/shlib/set_env.sh +128 -0
  180. data/spec/spec_helper.rb +4 -2
  181. data/spec/support/constraints.rb +20 -222
  182. data/spec/support/helpers.rb +1 -1
  183. data/spec/{app → support}/models/account.rb +0 -0
  184. data/spec/{app → support}/models/acolyte.rb +0 -0
  185. data/spec/{app → support}/models/actor.rb +1 -1
  186. data/spec/{app → support}/models/actress.rb +0 -0
  187. data/spec/{app → support}/models/address.rb +0 -0
  188. data/spec/{app → support}/models/address_component.rb +0 -0
  189. data/spec/{app → support}/models/address_number.rb +0 -0
  190. data/spec/{app → support}/models/agency.rb +0 -0
  191. data/spec/{app → support}/models/agent.rb +0 -0
  192. data/spec/{app → support}/models/album.rb +0 -0
  193. data/spec/{app → support}/models/alert.rb +0 -0
  194. data/spec/{app → support}/models/animal.rb +0 -0
  195. data/spec/{app → support}/models/answer.rb +0 -0
  196. data/spec/{app → support}/models/appointment.rb +0 -0
  197. data/spec/support/models/armrest.rb +10 -0
  198. data/spec/{app → support}/models/array_field.rb +0 -0
  199. data/spec/{app → support}/models/article.rb +0 -0
  200. data/spec/{app → support}/models/artist.rb +0 -0
  201. data/spec/{app → support}/models/artwork.rb +0 -0
  202. data/spec/{app → support}/models/audio.rb +0 -0
  203. data/spec/{app → support}/models/augmentation.rb +0 -0
  204. data/spec/{app → support}/models/author.rb +0 -0
  205. data/spec/{app → support}/models/baby.rb +0 -0
  206. data/spec/{app → support}/models/band.rb +0 -0
  207. data/spec/{app → support}/models/bar.rb +0 -0
  208. data/spec/{app → support}/models/basic.rb +0 -0
  209. data/spec/{app → support}/models/bed.rb +0 -0
  210. data/spec/{app → support}/models/big_palette.rb +0 -0
  211. data/spec/{app → support}/models/birthday.rb +0 -0
  212. data/spec/{app → support}/models/bomb.rb +0 -0
  213. data/spec/{app → support}/models/book.rb +0 -0
  214. data/spec/{app → support}/models/breed.rb +0 -0
  215. data/spec/{app → support}/models/browser.rb +1 -1
  216. data/spec/{app → support}/models/building.rb +0 -0
  217. data/spec/{app → support}/models/building_address.rb +0 -0
  218. data/spec/{app → support}/models/bus.rb +0 -0
  219. data/spec/{app → support}/models/business.rb +0 -0
  220. data/spec/{app → support}/models/callback_test.rb +0 -0
  221. data/spec/{app → support}/models/canvas.rb +1 -1
  222. data/spec/{app → support}/models/car.rb +0 -0
  223. data/spec/{app → support}/models/cat.rb +0 -0
  224. data/spec/{app → support}/models/category.rb +0 -0
  225. data/spec/{app → support}/models/child.rb +0 -0
  226. data/spec/{app → support}/models/child_doc.rb +0 -0
  227. data/spec/{app → support}/models/church.rb +0 -0
  228. data/spec/{app → support}/models/circle.rb +0 -0
  229. data/spec/{app → support}/models/circuit.rb +0 -0
  230. data/spec/{app → support}/models/circus.rb +0 -0
  231. data/spec/{app → support}/models/code.rb +0 -0
  232. data/spec/{app → support}/models/coding.rb +1 -1
  233. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  234. data/spec/{app → support}/models/comment.rb +0 -0
  235. data/spec/{app → support}/models/company.rb +0 -0
  236. data/spec/{app → support}/models/consumption_period.rb +0 -0
  237. data/spec/{app → support}/models/contextable_item.rb +0 -0
  238. data/spec/{app → support}/models/contractor.rb +0 -0
  239. data/spec/{app → support}/models/cookie.rb +0 -0
  240. data/spec/{app → support}/models/country_code.rb +0 -0
  241. data/spec/{app → support}/models/courier_job.rb +0 -0
  242. data/spec/support/models/crate.rb +13 -0
  243. data/spec/support/models/customer.rb +11 -0
  244. data/spec/support/models/customer_address.rb +12 -0
  245. data/spec/support/models/deed.rb +8 -0
  246. data/spec/{app → support}/models/definition.rb +0 -0
  247. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  248. data/spec/{app → support}/models/description.rb +0 -0
  249. data/spec/{app → support}/models/dictionary.rb +6 -0
  250. data/spec/{app → support}/models/division.rb +0 -0
  251. data/spec/{app → support}/models/doctor.rb +0 -0
  252. data/spec/{app → support}/models/dog.rb +0 -0
  253. data/spec/{app → support}/models/dokument.rb +0 -0
  254. data/spec/{app → support}/models/draft.rb +0 -0
  255. data/spec/{app → support}/models/dragon.rb +0 -0
  256. data/spec/{app → support}/models/driver.rb +1 -1
  257. data/spec/{app → support}/models/drug.rb +0 -0
  258. data/spec/{app → support}/models/dungeon.rb +0 -0
  259. data/spec/{app → support}/models/edit.rb +0 -0
  260. data/spec/{app → support}/models/email.rb +0 -0
  261. data/spec/{app → support}/models/employer.rb +0 -0
  262. data/spec/{app → support}/models/entry.rb +0 -0
  263. data/spec/{app → support}/models/eraser.rb +0 -0
  264. data/spec/{app → support}/models/even.rb +0 -0
  265. data/spec/{app → support}/models/event.rb +0 -0
  266. data/spec/{app → support}/models/exhibition.rb +0 -0
  267. data/spec/{app → support}/models/exhibitor.rb +0 -0
  268. data/spec/{app → support}/models/explosion.rb +0 -0
  269. data/spec/{app → support}/models/eye.rb +0 -0
  270. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  271. data/spec/{app → support}/models/face.rb +0 -0
  272. data/spec/{app → support}/models/favorite.rb +0 -0
  273. data/spec/{app → support}/models/filesystem.rb +0 -0
  274. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  275. data/spec/{app → support}/models/firefox.rb +0 -0
  276. data/spec/{app → support}/models/fish.rb +0 -0
  277. data/spec/{app → support}/models/folder.rb +0 -0
  278. data/spec/{app → support}/models/folder_item.rb +0 -0
  279. data/spec/{app → support}/models/fruits.rb +0 -0
  280. data/spec/{app → support}/models/game.rb +0 -0
  281. data/spec/{app → support}/models/ghost.rb +0 -0
  282. data/spec/support/models/guitar.rb +5 -0
  283. data/spec/{app → support}/models/home.rb +0 -0
  284. data/spec/{app → support}/models/house.rb +0 -0
  285. data/spec/{app → support}/models/html_writer.rb +0 -0
  286. data/spec/{app → support}/models/id_key.rb +0 -0
  287. data/spec/support/models/idnodef.rb +8 -0
  288. data/spec/{app → support}/models/image.rb +0 -0
  289. data/spec/{app → support}/models/implant.rb +0 -0
  290. data/spec/support/models/instrument.rb +9 -0
  291. data/spec/{app → support}/models/item.rb +1 -1
  292. data/spec/{app → support}/models/jar.rb +0 -0
  293. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  294. data/spec/{app → support}/models/kangaroo.rb +0 -0
  295. data/spec/{app → support}/models/label.rb +0 -0
  296. data/spec/{app → support}/models/language.rb +0 -0
  297. data/spec/{app → support}/models/lat_lng.rb +0 -0
  298. data/spec/{app → support}/models/league.rb +0 -0
  299. data/spec/{app → support}/models/learner.rb +0 -0
  300. data/spec/{app → support}/models/line_item.rb +0 -0
  301. data/spec/{app → support}/models/location.rb +0 -0
  302. data/spec/{app → support}/models/login.rb +0 -0
  303. data/spec/{app → support}/models/manufacturer.rb +0 -0
  304. data/spec/{app → support}/models/meat.rb +0 -0
  305. data/spec/{app → support}/models/membership.rb +0 -0
  306. data/spec/{app → support}/models/message.rb +0 -0
  307. data/spec/{app → support}/models/minim.rb +0 -0
  308. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  309. data/spec/support/models/mop.rb +16 -0
  310. data/spec/{app → support}/models/movie.rb +0 -0
  311. data/spec/{app → support}/models/my_hash.rb +0 -0
  312. data/spec/{app → support}/models/name.rb +0 -0
  313. data/spec/{app → support}/models/name_only.rb +0 -0
  314. data/spec/{app → support}/models/node.rb +0 -0
  315. data/spec/{app → support}/models/note.rb +0 -0
  316. data/spec/{app → support}/models/odd.rb +0 -0
  317. data/spec/support/models/order.rb +11 -0
  318. data/spec/{app → support}/models/ordered_post.rb +0 -0
  319. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  320. data/spec/{app → support}/models/oscar.rb +0 -0
  321. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  322. data/spec/{app → support}/models/override.rb +0 -0
  323. data/spec/{app → support}/models/ownable.rb +0 -0
  324. data/spec/{app → support}/models/owner.rb +2 -0
  325. data/spec/{app → support}/models/pack.rb +0 -0
  326. data/spec/{app → support}/models/page.rb +0 -0
  327. data/spec/{app → support}/models/page_question.rb +0 -0
  328. data/spec/{app → support}/models/palette.rb +1 -1
  329. data/spec/{app → support}/models/parent.rb +0 -0
  330. data/spec/{app → support}/models/parent_doc.rb +0 -0
  331. data/spec/{app → support}/models/passport.rb +0 -0
  332. data/spec/{app → support}/models/patient.rb +0 -0
  333. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  334. data/spec/{app → support}/models/pencil.rb +0 -0
  335. data/spec/{app → support}/models/person.rb +3 -1
  336. data/spec/{app → support}/models/pet.rb +0 -0
  337. data/spec/{app → support}/models/pet_owner.rb +0 -0
  338. data/spec/{app → support}/models/phone.rb +0 -0
  339. data/spec/support/models/piano.rb +5 -0
  340. data/spec/{app → support}/models/pizza.rb +0 -0
  341. data/spec/{app → support}/models/player.rb +0 -0
  342. data/spec/{app → support}/models/post.rb +0 -0
  343. data/spec/{app → support}/models/post_genre.rb +0 -0
  344. data/spec/{app → support}/models/powerup.rb +0 -0
  345. data/spec/{app → support}/models/preference.rb +0 -0
  346. data/spec/{app → support}/models/princess.rb +0 -0
  347. data/spec/{app → support}/models/product.rb +0 -0
  348. data/spec/support/models/profile.rb +18 -0
  349. data/spec/{app → support}/models/pronunciation.rb +0 -0
  350. data/spec/{app → support}/models/pub.rb +0 -0
  351. data/spec/support/models/publication.rb +5 -0
  352. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  353. data/spec/{app → support}/models/publication/review.rb +0 -0
  354. data/spec/{app → support}/models/purchase.rb +0 -0
  355. data/spec/{app → support}/models/question.rb +0 -0
  356. data/spec/{app → support}/models/quiz.rb +0 -0
  357. data/spec/{app → support}/models/rating.rb +0 -0
  358. data/spec/{app → support}/models/record.rb +0 -0
  359. data/spec/{app → support}/models/registry.rb +0 -0
  360. data/spec/{app → support}/models/role.rb +0 -0
  361. data/spec/{app → support}/models/root_category.rb +0 -0
  362. data/spec/{app → support}/models/sandwich.rb +0 -0
  363. data/spec/{app → support}/models/scheduler.rb +0 -0
  364. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  365. data/spec/support/models/seat.rb +25 -0
  366. data/spec/{app → support}/models/seo.rb +0 -0
  367. data/spec/{app → support}/models/series.rb +1 -0
  368. data/spec/{app → support}/models/server.rb +0 -0
  369. data/spec/{app → support}/models/service.rb +0 -0
  370. data/spec/{app → support}/models/shape.rb +2 -2
  371. data/spec/{app → support}/models/shelf.rb +0 -0
  372. data/spec/{app → support}/models/shipment_address.rb +0 -0
  373. data/spec/{app → support}/models/shipping_container.rb +0 -0
  374. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  375. data/spec/{app → support}/models/shop.rb +0 -0
  376. data/spec/{app → support}/models/short_agent.rb +0 -0
  377. data/spec/{app → support}/models/short_quiz.rb +0 -0
  378. data/spec/{app → support}/models/simple.rb +0 -0
  379. data/spec/{app → support}/models/slave.rb +0 -0
  380. data/spec/{app → support}/models/song.rb +0 -0
  381. data/spec/{app → support}/models/sound.rb +0 -0
  382. data/spec/{app → support}/models/square.rb +0 -0
  383. data/spec/{app → support}/models/staff.rb +0 -0
  384. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  385. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  386. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  387. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  388. data/spec/{app → support}/models/strategy.rb +0 -0
  389. data/spec/{app → support}/models/sub_item.rb +0 -0
  390. data/spec/{app → support}/models/subscription.rb +0 -0
  391. data/spec/{app → support}/models/survey.rb +0 -0
  392. data/spec/{app → support}/models/symptom.rb +0 -0
  393. data/spec/support/models/system_role.rb +7 -0
  394. data/spec/{app → support}/models/tag.rb +0 -0
  395. data/spec/{app → support}/models/target.rb +0 -0
  396. data/spec/{app → support}/models/template.rb +0 -0
  397. data/spec/{app → support}/models/thing.rb +0 -0
  398. data/spec/{app → support}/models/title.rb +0 -0
  399. data/spec/{app → support}/models/tool.rb +2 -2
  400. data/spec/{app → support}/models/topping.rb +0 -0
  401. data/spec/support/models/toy.rb +10 -0
  402. data/spec/{app → support}/models/track.rb +0 -0
  403. data/spec/{app → support}/models/translation.rb +0 -0
  404. data/spec/{app → support}/models/tree.rb +0 -0
  405. data/spec/{app → support}/models/truck.rb +2 -0
  406. data/spec/{app → support}/models/updatable.rb +0 -0
  407. data/spec/{app → support}/models/user.rb +0 -0
  408. data/spec/{app → support}/models/user_account.rb +0 -0
  409. data/spec/{app → support}/models/validation_callback.rb +0 -0
  410. data/spec/{app → support}/models/vehicle.rb +7 -2
  411. data/spec/{app → support}/models/version.rb +0 -0
  412. data/spec/{app → support}/models/vertex.rb +0 -0
  413. data/spec/{app → support}/models/vet_visit.rb +0 -0
  414. data/spec/{app → support}/models/video.rb +0 -0
  415. data/spec/{app → support}/models/video_game.rb +0 -0
  416. data/spec/{app → support}/models/weapon.rb +0 -0
  417. data/spec/{app → support}/models/wiki_page.rb +1 -0
  418. data/spec/{app → support}/models/word.rb +0 -0
  419. data/spec/{app → support}/models/word_origin.rb +0 -0
  420. data/spec/{app → support}/models/writer.rb +2 -2
  421. data/spec/support/spec_config.rb +1 -1
  422. metadata +895 -755
  423. metadata.gz.sig +0 -0
  424. data/lib/mongoid/matchable/all.rb +0 -30
  425. data/lib/mongoid/matchable/and.rb +0 -32
  426. data/lib/mongoid/matchable/default.rb +0 -121
  427. data/lib/mongoid/matchable/elem_match.rb +0 -36
  428. data/lib/mongoid/matchable/eq.rb +0 -23
  429. data/lib/mongoid/matchable/exists.rb +0 -25
  430. data/lib/mongoid/matchable/gt.rb +0 -25
  431. data/lib/mongoid/matchable/gte.rb +0 -25
  432. data/lib/mongoid/matchable/in.rb +0 -26
  433. data/lib/mongoid/matchable/lt.rb +0 -25
  434. data/lib/mongoid/matchable/lte.rb +0 -25
  435. data/lib/mongoid/matchable/ne.rb +0 -23
  436. data/lib/mongoid/matchable/nin.rb +0 -24
  437. data/lib/mongoid/matchable/nor.rb +0 -38
  438. data/lib/mongoid/matchable/or.rb +0 -35
  439. data/lib/mongoid/matchable/regexp.rb +0 -30
  440. data/lib/mongoid/matchable/size.rb +0 -23
  441. data/spec/app/models/publication.rb +0 -5
  442. data/spec/mongoid/matchable/all_spec.rb +0 -34
  443. data/spec/mongoid/matchable/and_spec.rb +0 -190
  444. data/spec/mongoid/matchable/default_spec.rb +0 -140
  445. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  446. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  447. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  448. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  449. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  450. data/spec/mongoid/matchable/in_spec.rb +0 -52
  451. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  452. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  453. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  454. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  455. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  456. data/spec/mongoid/matchable/or_spec.rb +0 -134
  457. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  458. data/spec/mongoid/matchable/size_spec.rb +0 -28
  459. data/spec/mongoid/matchable_spec.rb +0 -856
  460. data/spec/support/child_process_helper.rb +0 -76
  461. data/spec/support/lite_constraints.rb +0 -22
@@ -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
@@ -23,8 +23,12 @@ module Mongoid
23
23
  # elsewhere.
24
24
  attrs = clone_document.except("_id", "id")
25
25
  dynamic_attrs = {}
26
+ _attribute_names = self.attribute_names
26
27
  attrs.reject! do |attr_name, value|
27
- dynamic_attrs.merge!(attr_name => value) unless self.attribute_names.include?(attr_name)
28
+ unless _attribute_names.include?(attr_name)
29
+ dynamic_attrs[attr_name] = value
30
+ true
31
+ end
28
32
  end
29
33
  self.class.new(attrs).tap do |object|
30
34
  dynamic_attrs.each do |attr_name, value|
@@ -76,8 +80,8 @@ module Mongoid
76
80
 
77
81
  if association.is_a?(Association::Embedded::EmbedsMany)
78
82
  attrs[association.key].each do |attr|
79
- embedded_klass = if type = attr['_type']
80
- type.constantize
83
+ embedded_klass = if type = attr[self.class.discriminator_key]
84
+ association.relation_class.get_discriminator_mapping(type) || association.relation_class
81
85
  else
82
86
  association.relation_class
83
87
  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
@@ -555,8 +605,8 @@ module Mongoid
555
605
  # @since 3.0.3
556
606
  def type_selectable?
557
607
  klass.hereditary? &&
558
- !selector.keys.include?("_type") &&
559
- !selector.keys.include?(:_type)
608
+ !selector.keys.include?(self.discriminator_key) &&
609
+ !selector.keys.include?(self.discriminator_key.to_sym)
560
610
  end
561
611
 
562
612
  # Get the selector for type selection.
@@ -572,9 +622,9 @@ module Mongoid
572
622
  def type_selection
573
623
  klasses = klass._types
574
624
  if klasses.size > 1
575
- { _type: { "$in" => klass._types }}
625
+ { klass.discriminator_key.to_sym => { "$in" => klass._types }}
576
626
  else
577
- { _type: klass._types[0] }
627
+ { klass.discriminator_key.to_sym => klass._types[0] }
578
628
  end
579
629
  end
580
630
 
@@ -33,7 +33,7 @@ module Mongoid
33
33
  #
34
34
  # A yet more more complex example is the following condition:
35
35
  #
36
- # Foo.geo_spacial(:boundary.intersects_point => [1, 10])
36
+ # Foo.geo_spatial(:boundary.intersects_point => [1, 10])
37
37
  #
38
38
  # Processing this condition will cause a Key instance to be created as
39
39
  # follows:
@@ -237,9 +237,9 @@ module Mongoid
237
237
  # Similarly, this method should never need to expand a literal value
238
238
  # and an operator at the same time.
239
239
  #
240
- # @param [ Hash ] Criteria including Key instances.
240
+ # @param [ Hash ] expr Criteria including Key instances.
241
241
  #
242
- # @return [ Hash ] Expanded criteria.
242
+ # @return [ Hash ] The expanded criteria.
243
243
  private def _mongoid_expand_keys(expr)
244
244
  unless expr.is_a?(Hash)
245
245
  raise ArgumentError, 'Argument must be a Hash'
@@ -219,32 +219,44 @@ module Mongoid
219
219
  # Source: https://docs.mongodb.com/manual/reference/operator/query/box/
220
220
  #
221
221
  # @example Add a geo intersect criterion for a line.
222
- # query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
222
+ # query.geo_spatial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
223
223
  #
224
224
  # @example Add a geo intersect criterion for a point.
225
- # query.geo_spacial(:location.intersects_point => [[ 1, 10 ]])
225
+ # query.geo_spatial(:location.intersects_point => [[ 1, 10 ]])
226
226
  #
227
227
  # @example Add a geo intersect criterion for a polygon.
228
- # query.geo_spacial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
228
+ # query.geo_spatial(:location.intersects_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
229
229
  #
230
230
  # @example Add a geo within criterion for a polygon.
231
- # query.geo_spacial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
231
+ # query.geo_spatial(:location.within_polygon => [[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]])
232
232
  #
233
233
  # @example Add a geo within criterion for a box.
234
- # query.geo_spacial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
234
+ # query.geo_spatial(:location.within_box => [[ 1, 10 ], [ 2, 10 ])
235
235
  #
236
236
  # @param [ Hash ] criterion The criterion.
237
237
  #
238
238
  # @return [ Selectable ] The cloned selectable.
239
+ def geo_spatial(criterion)
240
+ if criterion.nil?
241
+ raise Errors::CriteriaArgumentRequired, :geo_spatial
242
+ end
243
+
244
+ __merge__(criterion)
245
+ end
246
+
247
+ # Alias for +geo_spatial+.
239
248
  #
240
- # @since 2.0.0
249
+ # @deprecated
241
250
  def geo_spacial(criterion)
251
+ # Duplicate method body so that we can raise this exception with
252
+ # geo_spacial as the indicated operator rather than geo_spatial.
242
253
  if criterion.nil?
243
254
  raise Errors::CriteriaArgumentRequired, :geo_spacial
244
255
  end
245
256
 
246
257
  __merge__(criterion)
247
258
  end
259
+
248
260
  key :intersects_line, :override, "$geoIntersects", "$geometry" do |value|
249
261
  { "type" => LINE_STRING, "coordinates" => value }
250
262
  end
@@ -872,6 +884,9 @@ module Mongoid
872
884
  end
873
885
 
874
886
  clone.tap do |query|
887
+ unless Hash === criterion
888
+ raise Errors::InvalidQuery, "Expression must be a Hash: #{Errors::InvalidQuery.truncate_expr(criterion)}"
889
+ end
875
890
  criterion.each do |field, value|
876
891
  field_s = field.to_s
877
892
  if field_s[0] == ?$
@@ -84,16 +84,16 @@ module Mongoid
84
84
  # Evolves a multi-list selection, like an $and or $or criterion, and
85
85
  # performs the necessary serialization.
86
86
  #
87
- # @api private
88
- #
89
87
  # @example Evolve the multi-selection.
90
88
  # selector.evolve_multi([{ field: "value" }])
91
89
  #
92
- # @param [ Array<Hash> ] value The multi-selection.
90
+ # @param [ Array<Hash> ] specs The multi-selection.
93
91
  #
94
92
  # @return [ Array<Hash> ] The serialized values.
95
93
  #
96
94
  # @since 1.0.0
95
+ #
96
+ # @api private
97
97
  def evolve_multi(specs)
98
98
  unless specs.is_a?(Array)
99
99
  raise ArgumentError, "specs is not an array: #{specs.inspect}"
@@ -123,10 +123,6 @@ module Mongoid
123
123
  # {'foo' => {'$lt' => 5}}. This step should be done after all
124
124
  # value-based processing is complete.
125
125
  if key.is_a?(Key)
126
- if serializer && evolved_value != value
127
- raise NotImplementedError, "This method is not prepared to handle key being a Key and serializer being not nil"
128
- end
129
-
130
126
  evolved_value = key.transform_value(evolved_value)
131
127
  end
132
128
 
@@ -74,7 +74,7 @@ module Mongoid
74
74
  #
75
75
  # This method takes the operator and the operator value expression
76
76
  # separately for callers' convenience. It can be considered to
77
- # handle storing the hash `{operator => op_expr}`.
77
+ # handle storing the hash +{operator => op_expr}+.
78
78
  #
79
79
  # If the selector consists of a single condition which is the specified
80
80
  # operator (on the top level), the new condition given in op_expr is
@@ -115,7 +115,7 @@ module Mongoid
115
115
  end
116
116
 
117
117
  unless op_expr.is_a?(Array)
118
- raise ArgumentError, "Operator value expression must be an array: #{op_expr}"
118
+ raise Errors::InvalidQuery, "#{operator} argument must be an array: #{Errors::InvalidQuery.truncate_expr(op_expr)}"
119
119
  end
120
120
 
121
121
  if selector.length == 1 && selector.keys.first == operator
@@ -141,7 +141,7 @@ module Mongoid
141
141
  #
142
142
  # This method takes the operator and the operator value expression
143
143
  # separately for callers' convenience. It can be considered to
144
- # handle storing the hash `{operator => op_expr}`.
144
+ # handle storing the hash +{operator => op_expr}+.
145
145
  #
146
146
  # The operator value can be of any type.
147
147
  #
@@ -229,12 +229,13 @@ module Mongoid
229
229
  became = klass.new(clone_document)
230
230
  became._id = _id
231
231
  became.instance_variable_set(:@changed_attributes, changed_attributes)
232
- became.instance_variable_set(:@errors, ActiveModel::Errors.new(became))
233
- became.errors.instance_variable_set(:@messages, errors.instance_variable_get(:@messages))
232
+ new_errors = ActiveModel::Errors.new(became)
233
+ new_errors.copy!(errors)
234
+ became.instance_variable_set(:@errors, new_errors)
234
235
  became.instance_variable_set(:@new_record, new_record?)
235
236
  became.instance_variable_set(:@destroyed, destroyed?)
236
- became.changed_attributes["_type"] = self.class.to_s
237
- became._type = klass.to_s
237
+ became.changed_attributes[klass.discriminator_key] = self.class.discriminator_value
238
+ became[klass.discriminator_key] = klass.discriminator_value
238
239
 
239
240
  # mark embedded docs as persisted
240
241
  embedded_relations.each_pair do |name, meta|
@@ -353,7 +354,19 @@ module Mongoid
353
354
  #
354
355
  # @since 1.0.0
355
356
  def _types
356
- @_type ||= (descendants + [ self ]).uniq.map(&:to_s)
357
+ @_type ||= (descendants + [ self ]).uniq.map(&:discriminator_value)
358
+ end
359
+
360
+ # Clear the @_type cache. This is generally called when changing the discriminator
361
+ # key/value on a class.
362
+ #
363
+ # @example Get the types.
364
+ # document._mongoid_clear_types
365
+ #
366
+ # @api private
367
+ def _mongoid_clear_types
368
+ @_type = nil
369
+ superclass._mongoid_clear_types if hereditary?
357
370
  end
358
371
 
359
372
  # Set the i18n scope to overwrite ActiveModel.
@@ -20,6 +20,13 @@ require "mongoid/errors/invalid_index"
20
20
  require "mongoid/errors/invalid_options"
21
21
  require "mongoid/errors/invalid_path"
22
22
  require "mongoid/errors/invalid_persistence_option"
23
+ require "mongoid/errors/invalid_query"
24
+ # Must be after invalid_query.
25
+ require "mongoid/errors/invalid_discriminator_key_target"
26
+ require "mongoid/errors/invalid_elem_match_operator"
27
+ require "mongoid/errors/invalid_estimated_count_criteria"
28
+ require "mongoid/errors/invalid_expression_operator"
29
+ require "mongoid/errors/invalid_field_operator"
23
30
  require "mongoid/errors/invalid_relation"
24
31
  require "mongoid/errors/invalid_relation_option"
25
32
  require "mongoid/errors/invalid_scope"
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ # Creates the exception raised when trying to set or get the
8
+ # discriminator key on a child class.
9
+ #
10
+ # @param [ String ] class_name The class name.
11
+ # @param [ String ] operator The class' superclass.
12
+ #
13
+ # @api private
14
+ class InvalidDiscriminatorKeyTarget < MongoidError
15
+ def initialize(class_name, superclass)
16
+ super(
17
+ compose_message(
18
+ "invalid_discriminator_key_target",
19
+ { class_name: class_name, superclass: superclass }
20
+ )
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mongoid
5
+ module Errors
6
+
7
+ # Raised when invalid field-level operator is passed to the $elemMatch
8
+ # embedded matcher.
9
+ class InvalidElemMatchOperator < InvalidQuery
10
+
11
+ # @api private
12
+ VALID_OPERATORS = %w(
13
+ and all eq exists gt gte in lt lte ne nin nor not or regex size
14
+ ).freeze
15
+
16
+ # Creates the exception.
17
+ #
18
+ # @param [ String ] operator The operator that was used.
19
+ #
20
+ # @api private
21
+ def initialize(operator)
22
+ @operator = operator
23
+ super(compose_message("invalid_elem_match_operator",
24
+ operator: operator,
25
+ valid_operators: VALID_OPERATORS.map { |op| "'$#{op}'" }.join(', '),
26
+ ))
27
+ end
28
+
29
+ # @return [ String ] The operator that was used.
30
+ attr_reader :operator
31
+ end
32
+ end
33
+ end