mongoid 3.1.7 → 4.0.2

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 (567) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +470 -9
  3. data/README.md +10 -7
  4. data/lib/config/locales/en.yml +34 -20
  5. data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
  6. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/root.rb +0 -13
  9. data/lib/mongoid/atomic.rb +3 -14
  10. data/lib/mongoid/attributes/dynamic.rb +154 -0
  11. data/lib/mongoid/attributes/nested.rb +82 -0
  12. data/lib/mongoid/attributes/processing.rb +13 -66
  13. data/lib/mongoid/attributes.rb +63 -99
  14. data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
  15. data/lib/mongoid/composable.rb +105 -0
  16. data/lib/mongoid/config/options.rb +1 -1
  17. data/lib/mongoid/config.rb +3 -9
  18. data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
  19. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
  20. data/lib/mongoid/contextual/atomic.rb +53 -53
  21. data/lib/mongoid/contextual/geo_near.rb +1 -1
  22. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  23. data/lib/mongoid/contextual/memory.rb +23 -11
  24. data/lib/mongoid/contextual/mongo.rb +75 -57
  25. data/lib/mongoid/contextual/none.rb +90 -0
  26. data/lib/mongoid/contextual/text_search.rb +178 -0
  27. data/lib/mongoid/contextual.rb +2 -0
  28. data/lib/mongoid/copyable.rb +2 -3
  29. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  30. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  31. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  32. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  33. data/lib/mongoid/criteria/permission.rb +70 -0
  34. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  35. data/lib/mongoid/criteria.rb +39 -34
  36. data/lib/mongoid/document.rb +39 -24
  37. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  38. data/lib/mongoid/errors/document_not_found.rb +2 -1
  39. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  40. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  41. data/lib/mongoid/errors/invalid_value.rb +16 -0
  42. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  43. data/lib/mongoid/errors/readonly_document.rb +24 -0
  44. data/lib/mongoid/errors.rb +4 -1
  45. data/lib/mongoid/extensions/array.rb +3 -3
  46. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  47. data/lib/mongoid/extensions/boolean.rb +15 -17
  48. data/lib/mongoid/extensions/date.rb +1 -1
  49. data/lib/mongoid/extensions/date_time.rb +3 -3
  50. data/lib/mongoid/extensions/float.rb +2 -1
  51. data/lib/mongoid/extensions/hash.rb +3 -3
  52. data/lib/mongoid/extensions/integer.rb +1 -1
  53. data/lib/mongoid/extensions/object.rb +7 -7
  54. data/lib/mongoid/extensions/object_id.rb +5 -5
  55. data/lib/mongoid/extensions/range.rb +9 -3
  56. data/lib/mongoid/extensions/regexp.rb +1 -1
  57. data/lib/mongoid/extensions/set.rb +1 -1
  58. data/lib/mongoid/extensions/string.rb +6 -18
  59. data/lib/mongoid/extensions/symbol.rb +1 -1
  60. data/lib/mongoid/extensions/time.rb +3 -3
  61. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  62. data/lib/mongoid/extensions.rb +15 -7
  63. data/lib/mongoid/factory.rb +8 -6
  64. data/lib/mongoid/fields/foreign_key.rb +3 -3
  65. data/lib/mongoid/fields/localized.rb +1 -1
  66. data/lib/mongoid/fields/standard.rb +5 -17
  67. data/lib/mongoid/fields/validators/macro.rb +15 -5
  68. data/lib/mongoid/fields.rb +41 -8
  69. data/lib/mongoid/{finders.rb → findable.rb} +35 -7
  70. data/lib/mongoid/indexable/specification.rb +104 -0
  71. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  72. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  73. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  74. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  75. data/lib/mongoid/log_subscriber.rb +55 -0
  76. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  77. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  78. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  82. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  83. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  85. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  86. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  87. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  88. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  89. data/lib/mongoid/matchable.rb +152 -0
  90. data/lib/mongoid/persistable/creatable.rb +189 -0
  91. data/lib/mongoid/persistable/deletable.rb +149 -0
  92. data/lib/mongoid/persistable/destroyable.rb +60 -0
  93. data/lib/mongoid/persistable/incrementable.rb +36 -0
  94. data/lib/mongoid/persistable/logical.rb +38 -0
  95. data/lib/mongoid/persistable/poppable.rb +39 -0
  96. data/lib/mongoid/persistable/pullable.rb +55 -0
  97. data/lib/mongoid/persistable/pushable.rb +62 -0
  98. data/lib/mongoid/persistable/renamable.rb +35 -0
  99. data/lib/mongoid/persistable/savable.rb +52 -0
  100. data/lib/mongoid/persistable/settable.rb +33 -0
  101. data/lib/mongoid/persistable/unsettable.rb +36 -0
  102. data/lib/mongoid/persistable/updatable.rb +153 -0
  103. data/lib/mongoid/persistable/upsertable.rb +55 -0
  104. data/lib/mongoid/persistable.rb +216 -0
  105. data/lib/mongoid/positional.rb +71 -0
  106. data/lib/mongoid/query_cache.rb +255 -0
  107. data/lib/mongoid/railtie.rb +34 -60
  108. data/lib/mongoid/railties/database.rake +9 -25
  109. data/lib/mongoid/relations/accessors.rb +15 -51
  110. data/lib/mongoid/relations/auto_save.rb +15 -36
  111. data/lib/mongoid/relations/binding.rb +2 -25
  112. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  113. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  114. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  115. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
  116. data/lib/mongoid/relations/builder.rb +1 -1
  117. data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
  118. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  119. data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
  120. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  121. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  122. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  123. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  124. data/lib/mongoid/relations/builders.rb +2 -2
  125. data/lib/mongoid/relations/cascading.rb +3 -5
  126. data/lib/mongoid/relations/constraint.rb +1 -1
  127. data/lib/mongoid/relations/conversions.rb +1 -1
  128. data/lib/mongoid/relations/counter_cache.rb +39 -15
  129. data/lib/mongoid/relations/eager/base.rb +149 -0
  130. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  131. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  132. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  133. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  134. data/lib/mongoid/relations/eager.rb +46 -0
  135. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  136. data/lib/mongoid/relations/embedded/in.rb +4 -4
  137. data/lib/mongoid/relations/embedded/many.rb +14 -32
  138. data/lib/mongoid/relations/embedded/one.rb +1 -1
  139. data/lib/mongoid/relations/macros.rb +3 -4
  140. data/lib/mongoid/relations/many.rb +51 -31
  141. data/lib/mongoid/relations/marshalable.rb +3 -3
  142. data/lib/mongoid/relations/metadata.rb +14 -79
  143. data/lib/mongoid/relations/nested_builder.rb +2 -2
  144. data/lib/mongoid/relations/one.rb +1 -1
  145. data/lib/mongoid/relations/options.rb +1 -0
  146. data/lib/mongoid/relations/polymorphic.rb +0 -1
  147. data/lib/mongoid/relations/proxy.rb +21 -41
  148. data/lib/mongoid/relations/referenced/in.rb +4 -20
  149. data/lib/mongoid/relations/referenced/many.rb +22 -35
  150. data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
  151. data/lib/mongoid/relations/referenced/one.rb +6 -25
  152. data/lib/mongoid/relations/synchronization.rb +4 -4
  153. data/lib/mongoid/relations/targets/enumerable.rb +10 -10
  154. data/lib/mongoid/relations/touchable.rb +34 -1
  155. data/lib/mongoid/relations.rb +11 -25
  156. data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
  157. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  158. data/lib/mongoid/selectable.rb +59 -0
  159. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  160. data/lib/mongoid/sessions/factory.rb +2 -0
  161. data/lib/mongoid/sessions/options.rb +185 -0
  162. data/lib/mongoid/sessions/storage_options.rb +140 -0
  163. data/lib/mongoid/sessions/thread_options.rb +19 -0
  164. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  165. data/lib/mongoid/sessions.rb +37 -345
  166. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  167. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  168. data/lib/mongoid/support/query_counter.rb +23 -0
  169. data/lib/mongoid/tasks/database.rake +31 -0
  170. data/lib/mongoid/tasks/database.rb +107 -0
  171. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  172. data/lib/mongoid/threaded.rb +26 -172
  173. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  174. data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
  175. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  176. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  178. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  179. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  180. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  181. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  182. data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
  183. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  184. data/lib/mongoid/version.rb +1 -1
  185. data/lib/mongoid.rb +10 -76
  186. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
  187. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  188. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  189. data/lib/rails/generators/mongoid_generator.rb +3 -40
  190. data/lib/rails/mongoid.rb +0 -122
  191. data/lib/support/ruby_version.rb +1 -1
  192. data/spec/app/models/account.rb +2 -6
  193. data/spec/app/models/acolyte.rb +2 -1
  194. data/spec/app/models/actor.rb +0 -1
  195. data/spec/app/models/address.rb +8 -3
  196. data/spec/app/models/animal.rb +1 -1
  197. data/spec/app/models/appointment.rb +3 -3
  198. data/spec/app/models/article.rb +1 -4
  199. data/spec/app/models/audio.rb +5 -0
  200. data/spec/app/models/author.rb +0 -2
  201. data/spec/app/models/band.rb +3 -2
  202. data/spec/app/models/bar.rb +1 -0
  203. data/spec/app/models/book.rb +1 -0
  204. data/spec/app/models/building.rb +0 -2
  205. data/spec/app/models/building_address.rb +0 -2
  206. data/spec/app/models/bus.rb +1 -1
  207. data/spec/app/models/canvas.rb +1 -1
  208. data/spec/app/models/contextable_item.rb +5 -0
  209. data/spec/app/models/contractor.rb +0 -2
  210. data/spec/app/models/country_code.rb +1 -1
  211. data/spec/app/models/definition.rb +2 -2
  212. data/spec/app/models/dog.rb +1 -1
  213. data/spec/app/models/dragon.rb +4 -0
  214. data/spec/app/models/drug.rb +1 -3
  215. data/spec/app/models/dungeon.rb +4 -0
  216. data/spec/app/models/edit.rb +5 -0
  217. data/spec/app/models/even.rb +7 -0
  218. data/spec/app/models/event.rb +1 -1
  219. data/spec/app/models/filesystem.rb +1 -0
  220. data/spec/app/models/fish.rb +0 -1
  221. data/spec/app/models/fruits.rb +6 -0
  222. data/spec/app/models/game.rb +0 -2
  223. data/spec/app/models/house.rb +1 -3
  224. data/spec/app/models/id_key.rb +6 -0
  225. data/spec/app/models/item.rb +1 -5
  226. data/spec/app/models/jar.rb +1 -1
  227. data/spec/app/models/label.rb +4 -4
  228. data/spec/app/models/line_item.rb +1 -1
  229. data/spec/app/models/login.rb +1 -1
  230. data/spec/app/models/message.rb +8 -0
  231. data/spec/app/models/movie.rb +1 -0
  232. data/spec/app/models/name.rb +3 -3
  233. data/spec/app/models/note.rb +3 -1
  234. data/spec/app/models/odd.rb +7 -0
  235. data/spec/app/models/oscar.rb +1 -1
  236. data/spec/app/models/parent_doc.rb +1 -1
  237. data/spec/app/models/person.rb +16 -10
  238. data/spec/app/models/phone.rb +1 -3
  239. data/spec/app/models/player.rb +3 -3
  240. data/spec/app/models/post.rb +5 -3
  241. data/spec/app/models/preference.rb +1 -1
  242. data/spec/app/models/quiz.rb +0 -3
  243. data/spec/app/models/record.rb +10 -5
  244. data/spec/app/models/registry.rb +1 -1
  245. data/spec/app/models/server.rb +1 -1
  246. data/spec/app/models/service.rb +3 -3
  247. data/spec/app/models/sound.rb +5 -0
  248. data/spec/app/models/symptom.rb +1 -1
  249. data/spec/app/models/template.rb +1 -1
  250. data/spec/app/models/title.rb +0 -1
  251. data/spec/app/models/track.rb +5 -5
  252. data/spec/app/models/tree.rb +3 -3
  253. data/spec/app/models/video.rb +1 -5
  254. data/spec/app/models/wiki_page.rb +2 -5
  255. data/spec/app/models/word.rb +3 -0
  256. data/spec/app/models/word_origin.rb +1 -1
  257. data/spec/config/mongoid.yml +7 -8
  258. data/spec/helpers.rb +18 -0
  259. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  260. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  261. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  262. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  263. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  264. data/spec/mongoid/atomic_spec.rb +19 -19
  265. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
  266. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  267. data/spec/mongoid/attributes_spec.rb +334 -434
  268. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  269. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  270. data/spec/mongoid/config/environment_spec.rb +3 -3
  271. data/spec/mongoid/config/options_spec.rb +6 -6
  272. data/spec/mongoid/config_spec.rb +24 -48
  273. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  274. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  275. data/spec/mongoid/contextual/atomic_spec.rb +59 -55
  276. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  277. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  278. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  279. data/spec/mongoid/contextual/memory_spec.rb +156 -94
  280. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  281. data/spec/mongoid/contextual/none_spec.rb +127 -0
  282. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  283. data/spec/mongoid/copyable_spec.rb +56 -68
  284. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  285. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  286. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  287. data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
  288. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  289. data/spec/mongoid/criteria_spec.rb +713 -2419
  290. data/spec/mongoid/document_spec.rb +171 -121
  291. data/spec/mongoid/equality_spec.rb +22 -22
  292. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  293. data/spec/mongoid/errors/callback_spec.rb +3 -3
  294. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  295. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  296. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  297. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  303. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  306. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  307. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  308. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  309. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  310. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  311. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  312. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  313. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  314. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  315. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  318. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  319. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  320. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  321. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  322. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  323. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  324. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  325. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  326. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  327. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  328. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  329. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  330. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  331. data/spec/mongoid/errors/validations_spec.rb +7 -7
  332. data/spec/mongoid/extensions/array_spec.rb +61 -61
  333. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  334. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  335. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  336. data/spec/mongoid/extensions/date_spec.rb +13 -13
  337. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  338. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  339. data/spec/mongoid/extensions/float_spec.rb +29 -15
  340. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  341. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  342. data/spec/mongoid/extensions/module_spec.rb +2 -2
  343. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  344. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  345. data/spec/mongoid/extensions/object_spec.rb +26 -26
  346. data/spec/mongoid/extensions/range_spec.rb +61 -12
  347. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  348. data/spec/mongoid/extensions/set_spec.rb +4 -4
  349. data/spec/mongoid/extensions/string_spec.rb +35 -46
  350. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  351. data/spec/mongoid/extensions/time_spec.rb +49 -49
  352. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  353. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  354. data/spec/mongoid/extensions_spec.rb +29 -0
  355. data/spec/mongoid/factory_spec.rb +15 -15
  356. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  357. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  358. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  359. data/spec/mongoid/fields/localized_spec.rb +38 -23
  360. data/spec/mongoid/fields/standard_spec.rb +12 -12
  361. data/spec/mongoid/fields_spec.rb +263 -217
  362. data/spec/mongoid/findable_spec.rb +509 -0
  363. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  364. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  365. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  366. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  367. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  368. data/spec/mongoid/loggable_spec.rb +1 -1
  369. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  370. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  371. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  372. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  373. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  374. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  375. data/spec/mongoid/matchable/in_spec.rb +49 -0
  376. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  377. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  378. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  379. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  380. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  381. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  382. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  383. data/spec/mongoid/persistable/creatable_spec.rb +553 -0
  384. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  385. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  386. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  387. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  388. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  389. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  390. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  391. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  392. data/spec/mongoid/persistable/savable_spec.rb +498 -0
  393. data/spec/mongoid/persistable/settable_spec.rb +162 -0
  394. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  395. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  396. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  397. data/spec/mongoid/persistable_spec.rb +206 -0
  398. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
  399. data/spec/mongoid/query_cache_spec.rb +263 -0
  400. data/spec/mongoid/railties/document_spec.rb +2 -2
  401. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  402. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  403. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  404. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  405. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  406. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  407. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  408. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  409. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  410. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  411. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  412. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  413. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  414. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  415. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  416. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  417. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  418. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  419. data/spec/mongoid/relations/builders_spec.rb +21 -21
  420. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  421. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  422. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  423. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  424. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  425. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  426. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  427. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  428. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  429. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  430. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  431. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  432. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  433. data/spec/mongoid/relations/eager_spec.rb +228 -0
  434. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  435. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  436. data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
  437. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  438. data/spec/mongoid/relations/macros_spec.rb +108 -102
  439. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  440. data/spec/mongoid/relations/options_spec.rb +1 -1
  441. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  442. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  443. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  444. data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
  445. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
  446. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  447. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  448. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  449. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  450. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  451. data/spec/mongoid/relations_spec.rb +16 -15
  452. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
  453. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  454. data/spec/mongoid/selectable_spec.rb +134 -0
  455. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  456. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  457. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  458. data/spec/mongoid/sessions/options_spec.rb +108 -0
  459. data/spec/mongoid/sessions_spec.rb +319 -178
  460. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  461. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  462. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  463. data/spec/mongoid/tasks/database_spec.rb +160 -0
  464. data/spec/mongoid/threaded_spec.rb +17 -70
  465. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  466. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  467. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  468. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  469. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  470. data/spec/mongoid/timestamps_spec.rb +9 -13
  471. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  472. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  473. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  474. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  475. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  476. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  477. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  478. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  479. data/spec/mongoid_spec.rb +8 -8
  480. data/spec/rails/mongoid_spec.rb +19 -350
  481. data/spec/spec_helper.rb +26 -15
  482. metadata +262 -247
  483. data/lib/mongoid/atomic/positionable.rb +0 -73
  484. data/lib/mongoid/components.rb +0 -92
  485. data/lib/mongoid/config/inflections.rb +0 -6
  486. data/lib/mongoid/contextual/eager.rb +0 -158
  487. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  488. data/lib/mongoid/identity_map.rb +0 -163
  489. data/lib/mongoid/json.rb +0 -16
  490. data/lib/mongoid/matchers/strategies.rb +0 -97
  491. data/lib/mongoid/matchers.rb +0 -32
  492. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  493. data/lib/mongoid/nested_attributes.rb +0 -78
  494. data/lib/mongoid/observer.rb +0 -192
  495. data/lib/mongoid/paranoia.rb +0 -136
  496. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  497. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  498. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  499. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  500. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  501. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  502. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  503. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  504. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  505. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  506. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  507. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  508. data/lib/mongoid/persistence/atomic.rb +0 -231
  509. data/lib/mongoid/persistence/deletion.rb +0 -31
  510. data/lib/mongoid/persistence/insertion.rb +0 -38
  511. data/lib/mongoid/persistence/modification.rb +0 -35
  512. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  513. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  514. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  515. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  516. data/lib/mongoid/persistence/operations/update.rb +0 -59
  517. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  518. data/lib/mongoid/persistence/operations.rb +0 -214
  519. data/lib/mongoid/persistence/upsertion.rb +0 -31
  520. data/lib/mongoid/persistence.rb +0 -357
  521. data/lib/mongoid/unit_of_work.rb +0 -61
  522. data/lib/mongoid/versioning.rb +0 -217
  523. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  524. data/lib/rack/mongoid.rb +0 -2
  525. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  526. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  527. data/spec/app/models/actor_observer.rb +0 -15
  528. data/spec/app/models/callback_recorder.rb +0 -25
  529. data/spec/app/models/paranoid_phone.rb +0 -25
  530. data/spec/app/models/paranoid_post.rb +0 -36
  531. data/spec/app/models/phone_observer.rb +0 -6
  532. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  533. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  534. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  535. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  536. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  537. data/spec/mongoid/finders_spec.rb +0 -321
  538. data/spec/mongoid/identity_map_spec.rb +0 -564
  539. data/spec/mongoid/json_spec.rb +0 -33
  540. data/spec/mongoid/matchers/in_spec.rb +0 -25
  541. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  542. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  543. data/spec/mongoid/observer_spec.rb +0 -290
  544. data/spec/mongoid/paranoia_spec.rb +0 -759
  545. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  546. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  547. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  548. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  549. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  550. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  551. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  552. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  553. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  554. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  555. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  556. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  557. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  558. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  559. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  560. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  561. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  562. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  563. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  564. data/spec/mongoid/persistence_spec.rb +0 -2279
  565. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  566. data/spec/mongoid/versioning_spec.rb +0 -540
  567. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -0,0 +1,178 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Contextual
4
+
5
+ # Wraps behaviour around a lazy text search command.
6
+ #
7
+ # @since 4.0.0
8
+ class TextSearch
9
+ include Enumerable
10
+ include Command
11
+
12
+ delegate :[], to: :results
13
+ delegate :==, :empty?, to: :entries
14
+
15
+ # Iterate over the results of the text search command.
16
+ #
17
+ # @example Iterate over the results.
18
+ # text_search.each do |doc|
19
+ # #...
20
+ # end
21
+ #
22
+ # @return [ Enumerator ] The enumerator.
23
+ #
24
+ # @since 4.0.0
25
+ def each
26
+ if block_given?
27
+ documents.each do |doc|
28
+ yield doc
29
+ end
30
+ else
31
+ to_enum
32
+ end
33
+ end
34
+
35
+ # Instantiate a new text search lazy proxy.
36
+ #
37
+ # @example Instantiate the text search.
38
+ # TextSearch.new(collection, criteria, "test")
39
+ #
40
+ # @param [ Moped::Collection ] collection The collection to execute on.
41
+ # @param [ Criteria ] criteria The criteria to filter results.
42
+ # @param [ String ] search_string The search string.
43
+ #
44
+ # @since 4.0.0
45
+ def initialize(collection, criteria, search_string)
46
+ @collection, @criteria = collection, criteria
47
+ command[:text] = collection.name.to_s
48
+ command[:search] = search_string
49
+ apply_criteria_options
50
+ end
51
+
52
+ # Inspect the text search object.
53
+ #
54
+ # @example Inspect the text search.
55
+ # text_search.inspect
56
+ #
57
+ # @return [ String ] The inspection.
58
+ #
59
+ # @since 4.0.0
60
+ def inspect
61
+ %Q{#<Mongoid::Contextual::TextSearch
62
+ selector: #{criteria.selector.inspect}
63
+ class: #{criteria.klass}
64
+ search: #{command[:search]}
65
+ filter: #{command[:filter] || "N/A"}
66
+ project: #{command[:project] || "N/A"}
67
+ limit: #{command[:limit] || "N/A"}
68
+ language: #{command[:language] || "default"}>
69
+ }
70
+ end
71
+
72
+ # Execute the text search command, and return the raw results (in hash
73
+ # form).
74
+ #
75
+ # @example Execute the command.
76
+ # text_search.execute
77
+ #
78
+ # @return [ Hash ] The raw results.
79
+ #
80
+ # @since 4.0.0
81
+ def execute
82
+ results
83
+ end
84
+
85
+ # Set the language of the text search.
86
+ #
87
+ # @example Set the text search language.
88
+ # text_search.language("deutsch")
89
+ #
90
+ # @param [ String ] value The name of the language.
91
+ #
92
+ # @return [ TextSearch ] The modified text search.
93
+ #
94
+ # @since 4.0.0
95
+ def language(value)
96
+ command[:language] = value
97
+ self
98
+ end
99
+
100
+ # Limits the fields returned by the text search for each document. By
101
+ # default, _id is always included.
102
+ #
103
+ # @example Limit the returned fields.
104
+ # text_search.project(name: 1, title: 1)
105
+ #
106
+ # @param [ Hash ] value The fields to project.
107
+ #
108
+ # @return [ TextSearch ] The modified text search.
109
+ #
110
+ # @since 4.0.0
111
+ def project(value)
112
+ command[:project] = value
113
+ self
114
+ end
115
+
116
+ # Get the raw statistics returned from the text search.
117
+ #
118
+ # @example Get the stats.
119
+ # text_search.stats
120
+ #
121
+ # @return [ Hash ] The raw statistics.
122
+ #
123
+ # @since 4.0.0
124
+ def stats
125
+ results["stats"]
126
+ end
127
+
128
+ private
129
+
130
+ # Apply the options from the criteria to the text search command.
131
+ #
132
+ # @api private
133
+ #
134
+ # @example Apply the criteria options, filter and limit only.
135
+ # text_search.apply_criteria_options
136
+ #
137
+ # @return [ nil ] Nothing.
138
+ #
139
+ # @since 4.0.0
140
+ def apply_criteria_options
141
+ command[:filter] = criteria.selector
142
+ if limit = criteria.options[:limit]
143
+ command[:limit] = limit
144
+ end
145
+ end
146
+
147
+ # Get the results of the text search as documents.
148
+ #
149
+ # @api private
150
+ #
151
+ # @example Get the results as documents.
152
+ # text_search.documents
153
+ #
154
+ # @return [ Array<Document> ] The documents.
155
+ #
156
+ # @since 4.0.0
157
+ def documents
158
+ results["results"].map do |attributes|
159
+ Factory.from_db(criteria.klass, attributes["obj"], command[:project])
160
+ end
161
+ end
162
+
163
+ # Get the raw results.
164
+ #
165
+ # @api private
166
+ #
167
+ # @example Get the raw results.
168
+ # text_search.results
169
+ #
170
+ # @return [ Hash ] The raw results.
171
+ #
172
+ # @since 4.0.0
173
+ def results
174
+ @results ||= session.command(command)
175
+ end
176
+ end
177
+ end
178
+ end
@@ -2,6 +2,7 @@
2
2
  require "mongoid/contextual/queryable"
3
3
  require "mongoid/contextual/mongo"
4
4
  require "mongoid/contextual/memory"
5
+ require "mongoid/contextual/none"
5
6
 
6
7
  module Mongoid
7
8
  module Contextual
@@ -48,6 +49,7 @@ module Mongoid
48
49
  #
49
50
  # @since 3.0.0
50
51
  def create_context
52
+ return None.new(self) if empty_and_chainable?
51
53
  embedded ? Memory.new(self) : Mongo.new(self)
52
54
  end
53
55
  end
@@ -6,7 +6,7 @@ module Mongoid
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  # Clone or dup the current +Document+. This will return all attributes with
9
- # the exception of the document's id and versions, and will reset all the
9
+ # the exception of the document's id, and will reset all the
10
10
  # instance variables.
11
11
  #
12
12
  # This clone also includes embedded documents.
@@ -22,7 +22,7 @@ module Mongoid
22
22
  # _id and id field in the document would cause problems with Mongoid
23
23
  # elsewhere.
24
24
  attrs = clone_document.except("_id", "id")
25
- self.class.new(attrs, without_protection: true)
25
+ self.class.new(attrs)
26
26
  end
27
27
  alias :dup :clone
28
28
 
@@ -40,7 +40,6 @@ module Mongoid
40
40
  # @since 3.0.22
41
41
  def clone_document
42
42
  attrs = as_document.__deep_copy__
43
- attrs["version"] = 1 if attrs.delete("versions")
44
43
  process_localized_attributes(attrs)
45
44
  attrs
46
45
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Criterion
3
+ class Criteria
4
4
  module Findable
5
5
 
6
6
  # Execute the criteria or raise an error if no documents found.
@@ -16,7 +16,7 @@ module Mongoid
16
16
  #
17
17
  # @since 2.0.0
18
18
  def execute_or_raise(ids, multi)
19
- result = multiple_from_map_or_db(ids)
19
+ result = multiple_from_db(ids)
20
20
  check_for_missing_documents!(result, ids)
21
21
  multi ? result : result.first
22
22
  end
@@ -24,12 +24,12 @@ module Mongoid
24
24
  # Find the matchind document(s) in the criteria for the provided ids.
25
25
  #
26
26
  # @example Find by an id.
27
- # criteria.find(Moped::BSON::ObjectId.new)
27
+ # criteria.find(BSON::ObjectId.new)
28
28
  #
29
29
  # @example Find by multiple ids.
30
- # criteria.find([ Moped::BSON::ObjectId.new, Moped::BSON::ObjectId.new ])
30
+ # criteria.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
31
31
  #
32
- # @param [ Array<Moped::BSON::ObjectId> ] args The ids to search for.
32
+ # @param [ Array<BSON::ObjectId> ] args The ids to search for.
33
33
  #
34
34
  # @return [ Array<Document>, Document ] The matching document(s).
35
35
  #
@@ -60,23 +60,6 @@ module Mongoid
60
60
  end
61
61
  end
62
62
 
63
- # Get the document from the identity map, and if not found hit the
64
- # database.
65
- #
66
- # @example Get the document from the map or criteria.
67
- # criteria.from_map_or_db
68
- #
69
- # @return [ Document ] The found document.
70
- #
71
- # @since 2.2.1
72
- def from_map_or_db
73
- id = extract_id
74
- id = klass.fields["_id"].mongoize(id) if id
75
- doc = IdentityMap.get(klass, id || selector_with_type_selection)
76
- return nil if doc == {}
77
- doc && doc.matches?(selector) ? doc : first
78
- end
79
-
80
63
  # Get the documents from the identity map, and if not found hit the
81
64
  # database.
82
65
  #
@@ -86,11 +69,10 @@ module Mongoid
86
69
  # @param [ ids ] The searched ids.
87
70
  #
88
71
  # @return [ Array<Document> ] The found documents.
89
- def multiple_from_map_or_db(ids)
72
+ def multiple_from_db(ids)
90
73
  return entries if embedded?
91
74
  ids = mongoize_ids(ids)
92
- result = from_identity_map(ids)
93
- ids.empty? ? result : result + from_database(ids)
75
+ ids.empty? ? [] : from_database(ids)
94
76
  end
95
77
 
96
78
  private
@@ -125,28 +107,6 @@ module Mongoid
125
107
  (ids.size > 1 ? any_in(id: ids) : where(id: ids.first)).entries
126
108
  end
127
109
 
128
- # Get documents from the identity map only.
129
- #
130
- # @api private
131
- #
132
- # @example Get documents from the identity map.
133
- # criteria.from_identity_map(ids)
134
- #
135
- # @param [ Array<Object> ] ids The ids to fetch with.
136
- #
137
- # @return [ Array<Document> ] The matching documents.
138
- #
139
- # @since 3.0.0
140
- def from_identity_map(ids)
141
- result = []
142
- selection = selector_with_type_selection
143
- ids.reject! do |id|
144
- doc = IdentityMap.get(klass, id)
145
- doc && doc.matches?(selection) ? result.push(doc) : false
146
- end
147
- result
148
- end
149
-
150
110
  # Convert all the ids to their proper types.
151
111
  #
152
112
  # @api private
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Criterion
4
- module Inspection
3
+ class Criteria
4
+ module Inspectable
5
5
 
6
6
  # Get a pretty string representation of the criteria, including the
7
7
  # selector, options, matching count and documents for inspection.
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Criterion
3
+ class Criteria
4
4
  module Marshalable
5
5
 
6
6
  # Provides the data needed to Marshal.dump a criteria.
@@ -21,6 +21,8 @@ module Mongoid
21
21
  # @example Load the criteria.
22
22
  # Marshal.load(criteria)
23
23
  #
24
+ # @param [ Array ] data The raw data.
25
+ #
24
26
  # @since 3.0.15
25
27
  def marshal_load(data)
26
28
  @scoping_options, raw_selector, raw_options = data.pop(3)
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Criterion
3
+ class Criteria
4
4
  module Modifiable
5
5
 
6
6
  # Build a document given the selector and return it.
@@ -68,6 +68,22 @@ module Mongoid
68
68
  find_or(:create, attrs, &block)
69
69
  end
70
70
 
71
+ # Find the first +Document+ given the conditions, or creates a new document
72
+ # with the conditions that were supplied. If validation fails an
73
+ # exception will be raised.
74
+ #
75
+ # @example Find or create the document.
76
+ # Person.find_or_create_by!(:attribute => "value")
77
+ #
78
+ # @param [ Hash ] attrs The attributes to check.
79
+ #
80
+ # @raise [ Errors::Validations ] on validation error.
81
+ #
82
+ # @return [ Document ] A matching or newly created document.
83
+ def find_or_create_by!(attrs = {}, &block)
84
+ find_or(:create!, attrs, &block)
85
+ end
86
+
71
87
  # Find the first +Document+ given the conditions, or initializes a new document
72
88
  # with the conditions that were supplied.
73
89
  #
@@ -144,13 +160,17 @@ module Mongoid
144
160
  #
145
161
  # @since 3.0.0
146
162
  def create_document(method, attrs = nil, &block)
147
- klass.__send__(method,
148
- selector.reduce(attrs || {}) do |hash, (key, value)|
149
- unless key.to_s =~ /\$/ || value.is_a?(Hash)
150
- hash[key] = value
151
- end
152
- hash
153
- end, &block)
163
+ attributes = selector.reduce(attrs || {}) do |hash, (key, value)|
164
+ unless key.to_s =~ /\$/ || value.is_a?(Hash)
165
+ hash[key] = value
166
+ end
167
+ hash
168
+ end
169
+ if embedded?
170
+ attributes[:_parent] = parent_document
171
+ attributes[:__metadata] = metadata
172
+ end
173
+ klass.__send__(method, attributes, &block)
154
174
  end
155
175
 
156
176
  # Find the first object or create/initialize it.
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ class Criteria
4
+ module Permission
5
+
6
+ [:all,
7
+ :all_in,
8
+ :and,
9
+ :all_of,
10
+ :between,
11
+ :elem_match,
12
+ :exists,
13
+ :gt,
14
+ :gte,
15
+ :in,
16
+ :any_in,
17
+ :lt,
18
+ :lte,
19
+ :max_distance,
20
+ :mod,
21
+ :ne,
22
+ :excludes,
23
+ :near,
24
+ :near_sphere,
25
+ :nin,
26
+ :not_in,
27
+ :nor,
28
+ :negating?,
29
+ :not,
30
+ :or,
31
+ :any_of,
32
+ :with_size,
33
+ :with_type,
34
+ :where,
35
+ :within_box,
36
+ :within_circle,
37
+ :within_polygon,
38
+ :within_spherical_circle
39
+ ].each do |method|
40
+ define_method(method) do |*criteria|
41
+ raise Errors::CriteriaNotPermitted.new(klass, method, criteria) unless should_permit?(criteria)
42
+ super(*criteria)
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ # Ensure that the criteria are permitted.
49
+ #
50
+ # @example Ignoring ActionController::Parameters
51
+ # should_permit?({_id: ActionController::Parameters.new("$size" => 1)})
52
+ #
53
+ # @api private
54
+ #
55
+ # @param [ Object ] criteria
56
+ # @return [ Boolean ] if should permit
57
+ def should_permit?(criteria)
58
+ if criteria.respond_to?(:permitted?)
59
+ return criteria.permitted?
60
+ elsif criteria.respond_to?(:each)
61
+ criteria.each do |criterion|
62
+ return false unless should_permit?(criterion)
63
+ end
64
+ end
65
+
66
+ true
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid
3
- module Criterion
4
- module Scoping
3
+ class Criteria
4
+ module Scopable
5
5
 
6
6
  # Applies the default scope to the criteria.
7
7
  #
@@ -1,9 +1,10 @@
1
1
  # encoding: utf-8
2
- require "mongoid/criterion/inspection"
3
- require "mongoid/criterion/findable"
4
- require "mongoid/criterion/marshalable"
5
- require "mongoid/criterion/modifiable"
6
- require "mongoid/criterion/scoping"
2
+ require "mongoid/criteria/findable"
3
+ require "mongoid/criteria/inspectable"
4
+ require "mongoid/criteria/marshalable"
5
+ require "mongoid/criteria/modifiable"
6
+ require "mongoid/criteria/scopable"
7
+ require "mongoid/sessions/options"
7
8
 
8
9
  module Mongoid
9
10
 
@@ -17,11 +18,12 @@ module Mongoid
17
18
  include Enumerable
18
19
  include Contextual
19
20
  include Origin::Queryable
20
- include Criterion::Inspection
21
- include Criterion::Findable
22
- include Criterion::Marshalable
23
- include Criterion::Modifiable
24
- include Criterion::Scoping
21
+ include Findable
22
+ include Inspectable
23
+ include Marshalable
24
+ include Modifiable
25
+ include Scopable
26
+ include Sessions::Options
25
27
 
26
28
  # Static array used to check with method missing - we only need to ever
27
29
  # instantiate once.
@@ -29,7 +31,7 @@ module Mongoid
29
31
  # @since 4.0.0
30
32
  CHECK = []
31
33
 
32
- attr_accessor :embedded, :klass
34
+ attr_accessor :embedded, :klass, :parent_document, :metadata
33
35
 
34
36
  # Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
35
37
  # of this +Criteria+ or the criteria itself.
@@ -197,9 +199,6 @@ module Mongoid
197
199
  # into the identity map who's ids match based on the extra query for the
198
200
  # ids.
199
201
  #
200
- # @note This will only work if Mongoid's identity map is enabled. To do
201
- # so set identity_map_enabled: true in your mongoid.yml
202
- #
203
202
  # @note This will work for embedded relations that reference another
204
203
  # collection via belongs_to as well.
205
204
  #
@@ -298,6 +297,31 @@ module Mongoid
298
297
  self
299
298
  end
300
299
 
300
+ # Returns a criteria that will always contain zero results and never hits
301
+ # the database.
302
+ #
303
+ # @example Return a none criteria.
304
+ # criteria.none
305
+ #
306
+ # @return [ Criteria ] The none criteria.
307
+ #
308
+ # @since 4.0.0
309
+ def none
310
+ @none = true and self
311
+ end
312
+
313
+ # Is the criteria an empty but chainable criteria?
314
+ #
315
+ # @example Is the criteria a none criteria?
316
+ # criteria.empty_and_chainable?
317
+ #
318
+ # @return [ true, false ] If the criteria is a none.
319
+ #
320
+ # @since 4.0.0
321
+ def empty_and_chainable?
322
+ !!@none
323
+ end
324
+
301
325
  # Overriden to include _type in the fields.
302
326
  #
303
327
  # @example Limit the fields returned from the database.
@@ -396,25 +420,6 @@ module Mongoid
396
420
  super
397
421
  end
398
422
 
399
- # Tell the next persistance operation to query from a specific collection,
400
- # database or session.
401
- #
402
- # @example Send the criteria to another collection.
403
- # Band.where(name: "Depeche Mode").with(collection: "artists")
404
- #
405
- # @param [ Hash ] options The storage options.
406
- #
407
- # @option options [ String, Symbol ] :collection The collection name.
408
- # @option options [ String, Symbol ] :database The database name.
409
- # @option options [ String, Symbol ] :session The session name.
410
- #
411
- # @return [ Criteria ] The criteria.
412
- #
413
- # @since 3.0.0
414
- def with(options)
415
- Threaded.set_persistence_options(klass, options)
416
- self
417
- end
418
423
 
419
424
  # Get a version of this criteria without the options.
420
425
  #
@@ -445,7 +450,7 @@ module Mongoid
445
450
  #
446
451
  # @since 3.1.0
447
452
  def for_js(javascript, scope = {})
448
- js_query(Moped::BSON::Code.new(javascript, scope))
453
+ js_query(BSON::CodeWithScope.new(javascript, scope))
449
454
  end
450
455
 
451
456
  private