mongoid 3.1.6 → 4.0.0

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 (562) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +432 -8
  3. data/README.md +5 -6
  4. data/lib/config/locales/en.yml +32 -18
  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 +1 -12
  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 -101
  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/mongo.rb +7 -9
  19. data/lib/mongoid/contextual/atomic.rb +53 -53
  20. data/lib/mongoid/contextual/geo_near.rb +1 -1
  21. data/lib/mongoid/contextual/map_reduce.rb +4 -2
  22. data/lib/mongoid/contextual/memory.rb +18 -6
  23. data/lib/mongoid/contextual/mongo.rb +64 -56
  24. data/lib/mongoid/contextual/none.rb +90 -0
  25. data/lib/mongoid/contextual/text_search.rb +178 -0
  26. data/lib/mongoid/contextual.rb +2 -0
  27. data/lib/mongoid/copyable.rb +2 -3
  28. data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
  29. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  30. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  31. data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
  32. data/lib/mongoid/criteria/permission.rb +70 -0
  33. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  34. data/lib/mongoid/criteria.rb +39 -34
  35. data/lib/mongoid/document.rb +32 -17
  36. data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
  37. data/lib/mongoid/errors/document_not_found.rb +2 -1
  38. data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
  39. data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
  40. data/lib/mongoid/errors/invalid_value.rb +16 -0
  41. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  42. data/lib/mongoid/errors/readonly_document.rb +24 -0
  43. data/lib/mongoid/errors.rb +4 -1
  44. data/lib/mongoid/extensions/array.rb +3 -3
  45. data/lib/mongoid/extensions/big_decimal.rb +1 -1
  46. data/lib/mongoid/extensions/boolean.rb +15 -17
  47. data/lib/mongoid/extensions/date.rb +1 -1
  48. data/lib/mongoid/extensions/date_time.rb +3 -3
  49. data/lib/mongoid/extensions/float.rb +2 -1
  50. data/lib/mongoid/extensions/hash.rb +3 -3
  51. data/lib/mongoid/extensions/integer.rb +1 -1
  52. data/lib/mongoid/extensions/object.rb +7 -7
  53. data/lib/mongoid/extensions/object_id.rb +5 -5
  54. data/lib/mongoid/extensions/range.rb +9 -3
  55. data/lib/mongoid/extensions/regexp.rb +1 -1
  56. data/lib/mongoid/extensions/set.rb +1 -1
  57. data/lib/mongoid/extensions/string.rb +6 -18
  58. data/lib/mongoid/extensions/symbol.rb +1 -1
  59. data/lib/mongoid/extensions/time.rb +3 -3
  60. data/lib/mongoid/extensions/time_with_zone.rb +1 -1
  61. data/lib/mongoid/extensions.rb +2 -7
  62. data/lib/mongoid/factory.rb +8 -6
  63. data/lib/mongoid/fields/foreign_key.rb +3 -3
  64. data/lib/mongoid/fields/localized.rb +1 -1
  65. data/lib/mongoid/fields/standard.rb +5 -17
  66. data/lib/mongoid/fields/validators/macro.rb +15 -5
  67. data/lib/mongoid/fields.rb +41 -8
  68. data/lib/mongoid/{finders.rb → findable.rb} +8 -2
  69. data/lib/mongoid/indexable/specification.rb +104 -0
  70. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  71. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  72. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  73. data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
  74. data/lib/mongoid/log_subscriber.rb +55 -0
  75. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  76. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  77. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  78. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  79. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  80. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  81. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  82. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  83. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  84. data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
  85. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  86. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  87. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  88. data/lib/mongoid/matchable.rb +152 -0
  89. data/lib/mongoid/persistable/creatable.rb +188 -0
  90. data/lib/mongoid/persistable/deletable.rb +149 -0
  91. data/lib/mongoid/persistable/destroyable.rb +60 -0
  92. data/lib/mongoid/persistable/incrementable.rb +36 -0
  93. data/lib/mongoid/persistable/logical.rb +38 -0
  94. data/lib/mongoid/persistable/poppable.rb +39 -0
  95. data/lib/mongoid/persistable/pullable.rb +55 -0
  96. data/lib/mongoid/persistable/pushable.rb +62 -0
  97. data/lib/mongoid/persistable/renamable.rb +35 -0
  98. data/lib/mongoid/persistable/savable.rb +52 -0
  99. data/lib/mongoid/persistable/settable.rb +33 -0
  100. data/lib/mongoid/persistable/unsettable.rb +36 -0
  101. data/lib/mongoid/persistable/updatable.rb +152 -0
  102. data/lib/mongoid/persistable/upsertable.rb +55 -0
  103. data/lib/mongoid/persistable.rb +216 -0
  104. data/lib/mongoid/positional.rb +71 -0
  105. data/lib/mongoid/query_cache.rb +247 -0
  106. data/lib/mongoid/railtie.rb +32 -45
  107. data/lib/mongoid/railties/database.rake +9 -25
  108. data/lib/mongoid/relations/accessors.rb +13 -49
  109. data/lib/mongoid/relations/auto_save.rb +15 -36
  110. data/lib/mongoid/relations/binding.rb +1 -24
  111. data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
  112. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  113. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
  115. data/lib/mongoid/relations/builder.rb +1 -1
  116. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  117. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
  118. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  119. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  120. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  121. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  122. data/lib/mongoid/relations/builders.rb +2 -2
  123. data/lib/mongoid/relations/cascading.rb +3 -5
  124. data/lib/mongoid/relations/constraint.rb +1 -1
  125. data/lib/mongoid/relations/conversions.rb +1 -1
  126. data/lib/mongoid/relations/counter_cache.rb +39 -15
  127. data/lib/mongoid/relations/eager/base.rb +149 -0
  128. data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
  129. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
  130. data/lib/mongoid/relations/eager/has_many.rb +38 -0
  131. data/lib/mongoid/relations/eager/has_one.rb +30 -0
  132. data/lib/mongoid/relations/eager.rb +46 -0
  133. data/lib/mongoid/relations/embedded/batchable.rb +4 -5
  134. data/lib/mongoid/relations/embedded/in.rb +4 -4
  135. data/lib/mongoid/relations/embedded/many.rb +14 -32
  136. data/lib/mongoid/relations/embedded/one.rb +1 -1
  137. data/lib/mongoid/relations/macros.rb +3 -4
  138. data/lib/mongoid/relations/many.rb +30 -31
  139. data/lib/mongoid/relations/marshalable.rb +3 -3
  140. data/lib/mongoid/relations/metadata.rb +14 -79
  141. data/lib/mongoid/relations/nested_builder.rb +2 -2
  142. data/lib/mongoid/relations/options.rb +1 -0
  143. data/lib/mongoid/relations/polymorphic.rb +0 -1
  144. data/lib/mongoid/relations/proxy.rb +21 -41
  145. data/lib/mongoid/relations/referenced/in.rb +4 -20
  146. data/lib/mongoid/relations/referenced/many.rb +19 -32
  147. data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
  148. data/lib/mongoid/relations/referenced/one.rb +6 -25
  149. data/lib/mongoid/relations/synchronization.rb +3 -3
  150. data/lib/mongoid/relations/touchable.rb +34 -1
  151. data/lib/mongoid/relations.rb +11 -25
  152. data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
  153. data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
  154. data/lib/mongoid/selectable.rb +59 -0
  155. data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
  156. data/lib/mongoid/sessions/factory.rb +2 -0
  157. data/lib/mongoid/sessions/options.rb +180 -0
  158. data/lib/mongoid/sessions/storage_options.rb +140 -0
  159. data/lib/mongoid/sessions/thread_options.rb +19 -0
  160. data/lib/mongoid/sessions/validators/storage.rb +16 -3
  161. data/lib/mongoid/sessions.rb +37 -345
  162. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  163. data/lib/mongoid/{state.rb → stateful.rb} +13 -1
  164. data/lib/mongoid/support/query_counter.rb +23 -0
  165. data/lib/mongoid/tasks/database.rake +31 -0
  166. data/lib/mongoid/tasks/database.rb +107 -0
  167. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  168. data/lib/mongoid/threaded.rb +0 -157
  169. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  170. data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
  171. data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
  172. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  173. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  174. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  175. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  176. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  177. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  178. data/lib/mongoid/{validations → validatable}/uniqueness.rb +23 -19
  179. data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
  180. data/lib/mongoid/version.rb +1 -1
  181. data/lib/mongoid.rb +10 -76
  182. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
  183. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  184. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  185. data/lib/rails/generators/mongoid_generator.rb +3 -40
  186. data/lib/rails/mongoid.rb +0 -122
  187. data/lib/support/ruby_version.rb +1 -1
  188. data/spec/app/models/account.rb +2 -6
  189. data/spec/app/models/acolyte.rb +2 -1
  190. data/spec/app/models/actor.rb +0 -1
  191. data/spec/app/models/address.rb +8 -3
  192. data/spec/app/models/animal.rb +1 -1
  193. data/spec/app/models/appointment.rb +3 -3
  194. data/spec/app/models/article.rb +1 -4
  195. data/spec/app/models/audio.rb +5 -0
  196. data/spec/app/models/author.rb +0 -2
  197. data/spec/app/models/band.rb +3 -2
  198. data/spec/app/models/bar.rb +1 -0
  199. data/spec/app/models/book.rb +1 -0
  200. data/spec/app/models/building.rb +0 -2
  201. data/spec/app/models/building_address.rb +0 -2
  202. data/spec/app/models/bus.rb +1 -1
  203. data/spec/app/models/canvas.rb +1 -1
  204. data/spec/app/models/contractor.rb +0 -2
  205. data/spec/app/models/country_code.rb +1 -1
  206. data/spec/app/models/definition.rb +2 -2
  207. data/spec/app/models/dog.rb +1 -1
  208. data/spec/app/models/draft.rb +9 -0
  209. data/spec/app/models/dragon.rb +4 -0
  210. data/spec/app/models/drug.rb +1 -3
  211. data/spec/app/models/dungeon.rb +4 -0
  212. data/spec/app/models/edit.rb +5 -0
  213. data/spec/app/models/even.rb +7 -0
  214. data/spec/app/models/event.rb +1 -1
  215. data/spec/app/models/filesystem.rb +1 -0
  216. data/spec/app/models/fish.rb +0 -1
  217. data/spec/app/models/fruits.rb +6 -0
  218. data/spec/app/models/game.rb +0 -2
  219. data/spec/app/models/house.rb +1 -3
  220. data/spec/app/models/item.rb +1 -5
  221. data/spec/app/models/jar.rb +1 -1
  222. data/spec/app/models/label.rb +4 -4
  223. data/spec/app/models/line_item.rb +1 -1
  224. data/spec/app/models/login.rb +1 -1
  225. data/spec/app/models/message.rb +8 -0
  226. data/spec/app/models/movie.rb +1 -0
  227. data/spec/app/models/name.rb +3 -3
  228. data/spec/app/models/note.rb +3 -1
  229. data/spec/app/models/odd.rb +7 -0
  230. data/spec/app/models/oscar.rb +1 -1
  231. data/spec/app/models/parent_doc.rb +1 -1
  232. data/spec/app/models/person.rb +16 -10
  233. data/spec/app/models/phone.rb +1 -3
  234. data/spec/app/models/player.rb +3 -3
  235. data/spec/app/models/post.rb +5 -3
  236. data/spec/app/models/preference.rb +1 -1
  237. data/spec/app/models/quiz.rb +0 -3
  238. data/spec/app/models/record.rb +10 -5
  239. data/spec/app/models/registry.rb +1 -1
  240. data/spec/app/models/server.rb +1 -1
  241. data/spec/app/models/service.rb +3 -3
  242. data/spec/app/models/sound.rb +5 -0
  243. data/spec/app/models/symptom.rb +1 -1
  244. data/spec/app/models/template.rb +1 -1
  245. data/spec/app/models/title.rb +0 -1
  246. data/spec/app/models/track.rb +5 -5
  247. data/spec/app/models/tree.rb +3 -3
  248. data/spec/app/models/video.rb +1 -5
  249. data/spec/app/models/wiki_page.rb +2 -5
  250. data/spec/app/models/word.rb +3 -0
  251. data/spec/app/models/word_origin.rb +1 -1
  252. data/spec/config/mongoid.yml +7 -8
  253. data/spec/helpers.rb +18 -0
  254. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  255. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  256. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  257. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  258. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  259. data/spec/mongoid/atomic_spec.rb +19 -19
  260. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
  261. data/spec/mongoid/attributes/readonly_spec.rb +58 -18
  262. data/spec/mongoid/attributes_spec.rb +315 -436
  263. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
  264. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  265. data/spec/mongoid/config/environment_spec.rb +3 -3
  266. data/spec/mongoid/config/options_spec.rb +6 -6
  267. data/spec/mongoid/config_spec.rb +24 -48
  268. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  269. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
  270. data/spec/mongoid/contextual/atomic_spec.rb +68 -58
  271. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  272. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  273. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  274. data/spec/mongoid/contextual/memory_spec.rb +151 -94
  275. data/spec/mongoid/contextual/mongo_spec.rb +238 -150
  276. data/spec/mongoid/contextual/none_spec.rb +127 -0
  277. data/spec/mongoid/contextual/text_search_spec.rb +209 -0
  278. data/spec/mongoid/copyable_spec.rb +56 -68
  279. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  280. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  281. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  282. data/spec/mongoid/criteria/modifiable_spec.rb +1255 -0
  283. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
  284. data/spec/mongoid/criteria_spec.rb +578 -2295
  285. data/spec/mongoid/document_spec.rb +166 -120
  286. data/spec/mongoid/equality_spec.rb +22 -22
  287. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  288. data/spec/mongoid/errors/callback_spec.rb +3 -3
  289. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  290. data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
  291. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  292. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  293. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  294. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  295. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  296. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  297. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  298. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  299. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  300. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  301. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  302. data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
  303. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  304. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  305. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  306. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  307. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  308. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  309. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
  310. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  311. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  312. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  313. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  314. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  315. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  316. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  317. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  318. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  319. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  320. data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
  321. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  322. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  323. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  324. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  325. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  326. data/spec/mongoid/errors/validations_spec.rb +7 -7
  327. data/spec/mongoid/extensions/array_spec.rb +61 -61
  328. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  329. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  330. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  331. data/spec/mongoid/extensions/date_spec.rb +13 -13
  332. data/spec/mongoid/extensions/date_time_spec.rb +8 -8
  333. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  334. data/spec/mongoid/extensions/float_spec.rb +29 -15
  335. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  336. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  337. data/spec/mongoid/extensions/module_spec.rb +2 -2
  338. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  339. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  340. data/spec/mongoid/extensions/object_spec.rb +26 -26
  341. data/spec/mongoid/extensions/range_spec.rb +61 -12
  342. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  343. data/spec/mongoid/extensions/set_spec.rb +4 -4
  344. data/spec/mongoid/extensions/string_spec.rb +35 -46
  345. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  346. data/spec/mongoid/extensions/time_spec.rb +49 -49
  347. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  348. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  349. data/spec/mongoid/extensions_spec.rb +15 -0
  350. data/spec/mongoid/factory_spec.rb +15 -15
  351. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  352. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  353. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  354. data/spec/mongoid/fields/localized_spec.rb +38 -23
  355. data/spec/mongoid/fields/standard_spec.rb +12 -12
  356. data/spec/mongoid/fields_spec.rb +263 -217
  357. data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -27
  358. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  359. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  360. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  361. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
  362. data/spec/mongoid/log_subscriber_spec.rb +75 -0
  363. data/spec/mongoid/loggable_spec.rb +1 -1
  364. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  365. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  366. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  367. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  368. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  369. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  370. data/spec/mongoid/matchable/in_spec.rb +49 -0
  371. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  372. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  373. data/spec/mongoid/matchable/ne_spec.rb +46 -0
  374. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  375. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  376. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  377. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  378. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  379. data/spec/mongoid/persistable/deletable_spec.rb +218 -0
  380. data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
  381. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  382. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  383. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  384. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  385. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  386. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  387. data/spec/mongoid/persistable/savable_spec.rb +461 -0
  388. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  389. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  390. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  391. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  392. data/spec/mongoid/persistable_spec.rb +206 -0
  393. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
  394. data/spec/mongoid/query_cache_spec.rb +231 -0
  395. data/spec/mongoid/railties/document_spec.rb +2 -2
  396. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  397. data/spec/mongoid/relations/auto_save_spec.rb +37 -17
  398. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
  399. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
  400. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
  401. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
  402. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
  403. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
  404. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
  405. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  406. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  407. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  408. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  409. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  410. data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
  411. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  412. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  413. data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
  414. data/spec/mongoid/relations/builders_spec.rb +21 -21
  415. data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
  416. data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
  417. data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
  418. data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
  419. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  420. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  421. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  422. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  423. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  424. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  425. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
  426. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  427. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  428. data/spec/mongoid/relations/eager_spec.rb +228 -0
  429. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  430. data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
  431. data/spec/mongoid/relations/embedded/many_spec.rb +393 -372
  432. data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
  433. data/spec/mongoid/relations/macros_spec.rb +108 -102
  434. data/spec/mongoid/relations/metadata_spec.rb +180 -255
  435. data/spec/mongoid/relations/options_spec.rb +1 -1
  436. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  437. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  438. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  439. data/spec/mongoid/relations/referenced/many_spec.rb +434 -527
  440. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -424
  441. data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
  442. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  443. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  444. data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
  445. data/spec/mongoid/relations/touchable_spec.rb +333 -0
  446. data/spec/mongoid/relations_spec.rb +16 -15
  447. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
  448. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
  449. data/spec/mongoid/selectable_spec.rb +134 -0
  450. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
  451. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  452. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  453. data/spec/mongoid/sessions/options_spec.rb +107 -0
  454. data/spec/mongoid/sessions_spec.rb +289 -178
  455. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  456. data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
  457. data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
  458. data/spec/mongoid/tasks/database_spec.rb +160 -0
  459. data/spec/mongoid/threaded_spec.rb +17 -70
  460. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  461. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  462. data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
  463. data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
  464. data/spec/mongoid/timestamps/updated_spec.rb +9 -13
  465. data/spec/mongoid/timestamps_spec.rb +9 -13
  466. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  467. data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
  468. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  469. data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
  470. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  471. data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
  472. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
  473. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  474. data/spec/mongoid_spec.rb +8 -8
  475. data/spec/rails/mongoid_spec.rb +19 -335
  476. data/spec/spec_helper.rb +29 -13
  477. metadata +296 -283
  478. data/lib/mongoid/atomic/positionable.rb +0 -73
  479. data/lib/mongoid/components.rb +0 -92
  480. data/lib/mongoid/config/inflections.rb +0 -6
  481. data/lib/mongoid/contextual/eager.rb +0 -158
  482. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  483. data/lib/mongoid/identity_map.rb +0 -163
  484. data/lib/mongoid/json.rb +0 -16
  485. data/lib/mongoid/matchers/strategies.rb +0 -97
  486. data/lib/mongoid/matchers.rb +0 -32
  487. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  488. data/lib/mongoid/nested_attributes.rb +0 -78
  489. data/lib/mongoid/observer.rb +0 -192
  490. data/lib/mongoid/paranoia.rb +0 -136
  491. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  492. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  493. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  494. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  495. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  496. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  497. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  498. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  499. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  500. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  501. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  502. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  503. data/lib/mongoid/persistence/atomic.rb +0 -231
  504. data/lib/mongoid/persistence/deletion.rb +0 -31
  505. data/lib/mongoid/persistence/insertion.rb +0 -38
  506. data/lib/mongoid/persistence/modification.rb +0 -35
  507. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  508. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  509. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  510. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  511. data/lib/mongoid/persistence/operations/update.rb +0 -59
  512. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  513. data/lib/mongoid/persistence/operations.rb +0 -214
  514. data/lib/mongoid/persistence/upsertion.rb +0 -31
  515. data/lib/mongoid/persistence.rb +0 -357
  516. data/lib/mongoid/unit_of_work.rb +0 -61
  517. data/lib/mongoid/versioning.rb +0 -217
  518. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  519. data/lib/rack/mongoid.rb +0 -2
  520. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  521. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  522. data/spec/app/models/actor_observer.rb +0 -15
  523. data/spec/app/models/callback_recorder.rb +0 -25
  524. data/spec/app/models/paranoid_phone.rb +0 -25
  525. data/spec/app/models/paranoid_post.rb +0 -36
  526. data/spec/app/models/phone_observer.rb +0 -6
  527. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  528. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  529. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  530. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  531. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  532. data/spec/mongoid/identity_map_spec.rb +0 -564
  533. data/spec/mongoid/json_spec.rb +0 -33
  534. data/spec/mongoid/matchers/in_spec.rb +0 -25
  535. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  536. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  537. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  538. data/spec/mongoid/observer_spec.rb +0 -290
  539. data/spec/mongoid/paranoia_spec.rb +0 -759
  540. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  541. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  542. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  543. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  544. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  545. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  546. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  547. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  548. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  549. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  550. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  551. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  552. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  553. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  554. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  555. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  556. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  557. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  558. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  559. data/spec/mongoid/persistence_spec.rb +0 -2279
  560. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  561. data/spec/mongoid/versioning_spec.rb +0 -540
  562. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -2,10 +2,11 @@
2
2
  require "mongoid/contextual/atomic"
3
3
  require "mongoid/contextual/aggregable/mongo"
4
4
  require "mongoid/contextual/command"
5
- require "mongoid/contextual/eager"
6
5
  require "mongoid/contextual/find_and_modify"
7
6
  require "mongoid/contextual/geo_near"
8
7
  require "mongoid/contextual/map_reduce"
8
+ require "mongoid/contextual/text_search"
9
+ require "mongoid/relations/eager"
9
10
 
10
11
  module Mongoid
11
12
  module Contextual
@@ -13,7 +14,7 @@ module Mongoid
13
14
  include Enumerable
14
15
  include Aggregable::Mongo
15
16
  include Atomic
16
- include Eager
17
+ include Relations::Eager
17
18
  include Queryable
18
19
 
19
20
  # @attribute [r] query The Moped query.
@@ -56,7 +57,7 @@ module Mongoid
56
57
  return collection.find(criteria.and(_id: document.id).selector).count
57
58
  end
58
59
  return query.count(document) if document
59
- cached? ? @count ||= query.count : query.count
60
+ try_cache(:count) { query.count }
60
61
  end
61
62
 
62
63
  # Delete all documents in the database that match the selector.
@@ -118,13 +119,11 @@ module Mongoid
118
119
  # @since 3.0.0
119
120
  def each(&block)
120
121
  if block_given?
121
- selecting do
122
- documents_for_iteration.each do |doc|
123
- yield_document(doc, &block)
124
- end
125
- @cache_loaded = true
126
- eager_loadable? ? docs : self
122
+ documents_for_iteration.each do |doc|
123
+ yield_document(doc, &block)
127
124
  end
125
+ @cache_loaded = true
126
+ self
128
127
  else
129
128
  to_enum
130
129
  end
@@ -143,7 +142,12 @@ module Mongoid
143
142
  #
144
143
  # @since 3.0.0
145
144
  def exists?
146
- @exists ||= check_existence
145
+ return !documents.empty? if cached? && cache_loaded?
146
+ return @count > 0 if instance_variable_defined?(:@count)
147
+
148
+ try_cache(:exists) do
149
+ !!(query.dup.select(_id: 1).limit(1).first)
150
+ end
147
151
  end
148
152
 
149
153
  # Run an explain on the criteria.
@@ -189,9 +193,8 @@ module Mongoid
189
193
  #
190
194
  # @since 3.0.0
191
195
  def first
192
- if cached? && cache_loaded?
193
- documents.first
194
- else
196
+ return documents.first if cached? && cache_loaded?
197
+ try_cache(:first) do
195
198
  with_sorting do
196
199
  with_eager_loading(query.first)
197
200
  end
@@ -257,7 +260,7 @@ module Mongoid
257
260
  # @since 3.0.0
258
261
  def initialize(criteria)
259
262
  @criteria, @klass, @cache = criteria, criteria.klass, criteria.options[:cache]
260
- @collection = klass.collection
263
+ @collection = @klass.with(criteria.persistence_options || {}).collection
261
264
  criteria.send(:merge_type_selection)
262
265
  @query = collection.find(criteria.selector)
263
266
  apply_options
@@ -274,8 +277,10 @@ module Mongoid
274
277
  #
275
278
  # @since 3.0.0
276
279
  def last
277
- with_inverse_sorting do
278
- with_eager_loading(query.first)
280
+ try_cache(:last) do
281
+ with_inverse_sorting do
282
+ with_eager_loading(query.first)
283
+ end
279
284
  end
280
285
  end
281
286
 
@@ -330,14 +335,24 @@ module Mongoid
330
335
  # @note This method will return the raw db values - it performs no custom
331
336
  # serialization.
332
337
  #
333
- # @param [ String, Symbol ] field The field to pluck.
338
+ # @param [ String, Symbol, Array ] field Fields to pluck.
334
339
  #
335
- # @return [ Array<Object> ] The plucked values.
340
+ # @return [ Array<Object, Array> ] The plucked values.
336
341
  #
337
342
  # @since 3.1.0
338
- def pluck(field)
339
- normalized = klass.database_field_name(field)
340
- query.dup.select(normalized => 1).map{ |doc| doc[normalized] }.compact
343
+ def pluck(*fields)
344
+ normalized_select = fields.inject({}) do |hash, f|
345
+ hash[klass.database_field_name(f)] = 1
346
+ hash
347
+ end
348
+
349
+ query.dup.select(normalized_select).map do |doc|
350
+ if normalized_select.size == 1
351
+ doc[normalized_select.keys.first]
352
+ else
353
+ normalized_select.keys.map { |n| doc[n] }.compact
354
+ end
355
+ end.compact
341
356
  end
342
357
 
343
358
  # Skips the provided number of documents.
@@ -376,6 +391,20 @@ module Mongoid
376
391
  end
377
392
  end
378
393
 
394
+ # Execute a text command against the database.
395
+ #
396
+ # @example Find documents with the text "phase"
397
+ # context.text_search("phase")
398
+ #
399
+ # @param [ String ] query The text search query.
400
+ #
401
+ # @return [ TextSearch ] The TextSearch command.
402
+ #
403
+ # @since 4.0.0
404
+ def text_search(query)
405
+ TextSearch.new(collection, criteria, query)
406
+ end
407
+
379
408
  # Update the first matching document atomically.
380
409
  #
381
410
  # @example Update the first matching document.
@@ -393,7 +422,7 @@ module Mongoid
393
422
  # Update all the matching documents atomically.
394
423
  #
395
424
  # @example Update all the matching documents.
396
- # context.update({ "$set" => { name: "Smiths" }})
425
+ # context.update_all({ "$set" => { name: "Smiths" }})
397
426
  #
398
427
  # @param [ Hash ] attributes The new attributes for each document.
399
428
  #
@@ -406,21 +435,21 @@ module Mongoid
406
435
 
407
436
  private
408
437
 
409
- # Checks if any documents exist in the database.
410
- #
411
- # @api private
438
+ # yield the block given or return the cached value
412
439
  #
413
- # @example Check for document existsence.
414
- # context.check_existence
440
+ # @param [ String, Symbol ] key The instance variable name
415
441
  #
416
- # @return [ true, false ] If documents exist.
442
+ # @return the result of the block
417
443
  #
418
- # @since 3.1.0
419
- def check_existence
420
- if cached? && cache_loaded?
421
- !documents.empty?
444
+ # @since 3.1.4
445
+ def try_cache(key, &block)
446
+ unless cached?
447
+ yield
422
448
  else
423
- @count ? @count > 0 : !query.dup.select(_id: 1).limit(1).entries.first.nil?
449
+ unless ret = instance_variable_get("@#{key}")
450
+ instance_variable_set("@#{key}", ret = yield)
451
+ end
452
+ ret
424
453
  end
425
454
  end
426
455
 
@@ -593,7 +622,7 @@ module Mongoid
593
622
  if cached? && !documents.empty?
594
623
  documents
595
624
  elsif eager_loadable?
596
- docs = query.map{ |doc| Factory.from_db(klass, doc) }
625
+ docs = query.map{ |doc| Factory.from_db(klass, doc, criteria.options[:fields]) }
597
626
  eager_load(docs)
598
627
  docs
599
628
  else
@@ -601,27 +630,6 @@ module Mongoid
601
630
  end
602
631
  end
603
632
 
604
- # If we are limiting results, we need to set the field limitations on a
605
- # thread local to avoid overriding the default values.
606
- #
607
- # @example Execute with selection.
608
- # context.selecting do
609
- # collection.find
610
- # end
611
- #
612
- # @return [ Object ] The yielded value.
613
- #
614
- # @since 2.4.4
615
- def selecting
616
- begin
617
- fields = criteria.options[:fields]
618
- Threaded.set_selection(criteria.object_id, fields) unless fields.blank?
619
- yield
620
- ensure
621
- Threaded.delete_selection(criteria.object_id)
622
- end
623
- end
624
-
625
633
  # Yield to the document.
626
634
  #
627
635
  # @api private
@@ -636,7 +644,7 @@ module Mongoid
636
644
  # @since 3.0.0
637
645
  def yield_document(document, &block)
638
646
  doc = document.respond_to?(:_id) ?
639
- document : Factory.from_db(klass, document, criteria.object_id)
647
+ document : Factory.from_db(klass, document, criteria.options[:fields])
640
648
  yield(doc)
641
649
  documents.push(doc) if cacheable?
642
650
  end
@@ -0,0 +1,90 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Contextual
4
+ class None
5
+ include Enumerable
6
+ include Queryable
7
+
8
+ attr_reader :criteria, :klass
9
+
10
+ # Check if the context is equal to the other object.
11
+ #
12
+ # @example Check equality.
13
+ # context == []
14
+ #
15
+ # @param [ Array ] other The other array.
16
+ #
17
+ # @return [ true, false ] If the objects are equal.
18
+ #
19
+ # @since 4.0.0
20
+ def ==(other)
21
+ other.is_a?(None)
22
+ end
23
+
24
+ # Iterate over the null context. There are no documents to iterate over
25
+ # in this case.
26
+ #
27
+ # @example Iterate over the context.
28
+ # context.each do |doc|
29
+ # puts doc.name
30
+ # end
31
+ #
32
+ # @return [ Enumerator ] The enumerator.
33
+ #
34
+ # @since 4.0.0
35
+ def each
36
+ if block_given?
37
+ [].each { |doc| yield(doc) }
38
+ self
39
+ else
40
+ to_enum
41
+ end
42
+ end
43
+
44
+ # Do any documents exist for the context.
45
+ #
46
+ # @example Do any documents exist for the context.
47
+ # context.exists?
48
+ #
49
+ # @return [ true, false ] If the count is more than zero.
50
+ #
51
+ # @since 4.0.0
52
+ def exists?; false; end
53
+
54
+ # Create the new null context.
55
+ #
56
+ # @example Create the new context.
57
+ # Null.new(criteria)
58
+ #
59
+ # @param [ Criteria ] The criteria.
60
+ #
61
+ # @since 4.0.0
62
+ def initialize(criteria)
63
+ @criteria, @klass = criteria, criteria.klass
64
+ end
65
+
66
+ # Always returns nil.
67
+ #
68
+ # @example Get the last document.
69
+ # context.last
70
+ #
71
+ # @return [ nil ] Always nil.
72
+ #
73
+ # @since 4.0.0
74
+ def last; nil; end
75
+
76
+ # Always returns zero.
77
+ #
78
+ # @example Get the length of matching documents.
79
+ # context.length
80
+ #
81
+ # @return [ Integer ] Always zero.
82
+ #
83
+ # @since 4.0.0
84
+ def length
85
+ entries.length
86
+ end
87
+ alias :size :length
88
+ end
89
+ end
90
+ end
@@ -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)