mongoid_rails4 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 (659) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3213 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +448 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +284 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +40 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  70. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  71. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  72. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  73. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  74. data/lib/mongoid/errors/no_default_session.rb +23 -0
  75. data/lib/mongoid/errors/no_environment.rb +19 -0
  76. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  77. data/lib/mongoid/errors/no_metadata.rb +21 -0
  78. data/lib/mongoid/errors/no_parent.rb +24 -0
  79. data/lib/mongoid/errors/no_session_config.rb +22 -0
  80. data/lib/mongoid/errors/no_session_database.rb +27 -0
  81. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  82. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  83. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  84. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  85. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  86. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  87. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  88. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  89. data/lib/mongoid/errors/validations.rb +29 -0
  90. data/lib/mongoid/evolvable.rb +19 -0
  91. data/lib/mongoid/extensions.rb +35 -0
  92. data/lib/mongoid/extensions/array.rb +180 -0
  93. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  94. data/lib/mongoid/extensions/boolean.rb +21 -0
  95. data/lib/mongoid/extensions/date.rb +77 -0
  96. data/lib/mongoid/extensions/date_time.rb +73 -0
  97. data/lib/mongoid/extensions/false_class.rb +38 -0
  98. data/lib/mongoid/extensions/float.rb +56 -0
  99. data/lib/mongoid/extensions/hash.rb +209 -0
  100. data/lib/mongoid/extensions/integer.rb +67 -0
  101. data/lib/mongoid/extensions/module.rb +28 -0
  102. data/lib/mongoid/extensions/nil_class.rb +33 -0
  103. data/lib/mongoid/extensions/object.rb +274 -0
  104. data/lib/mongoid/extensions/object_id.rb +54 -0
  105. data/lib/mongoid/extensions/range.rb +79 -0
  106. data/lib/mongoid/extensions/regexp.rb +27 -0
  107. data/lib/mongoid/extensions/set.rb +55 -0
  108. data/lib/mongoid/extensions/string.rb +199 -0
  109. data/lib/mongoid/extensions/symbol.rb +54 -0
  110. data/lib/mongoid/extensions/time.rb +88 -0
  111. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  112. data/lib/mongoid/extensions/true_class.rb +38 -0
  113. data/lib/mongoid/factory.rb +46 -0
  114. data/lib/mongoid/fields.rb +542 -0
  115. data/lib/mongoid/fields/foreign_key.rb +174 -0
  116. data/lib/mongoid/fields/localized.rb +73 -0
  117. data/lib/mongoid/fields/standard.rb +273 -0
  118. data/lib/mongoid/fields/validators.rb +2 -0
  119. data/lib/mongoid/fields/validators/macro.rb +92 -0
  120. data/lib/mongoid/findable.rb +133 -0
  121. data/lib/mongoid/identity_map.rb +163 -0
  122. data/lib/mongoid/indexable.rb +147 -0
  123. data/lib/mongoid/indexable/specification.rb +115 -0
  124. data/lib/mongoid/indexable/validators/options.rb +103 -0
  125. data/lib/mongoid/inspectable.rb +59 -0
  126. data/lib/mongoid/interceptable.rb +265 -0
  127. data/lib/mongoid/loggable.rb +69 -0
  128. data/lib/mongoid/matchable.rb +152 -0
  129. data/lib/mongoid/matchable/all.rb +27 -0
  130. data/lib/mongoid/matchable/and.rb +30 -0
  131. data/lib/mongoid/matchable/default.rb +72 -0
  132. data/lib/mongoid/matchable/exists.rb +23 -0
  133. data/lib/mongoid/matchable/gt.rb +21 -0
  134. data/lib/mongoid/matchable/gte.rb +21 -0
  135. data/lib/mongoid/matchable/in.rb +24 -0
  136. data/lib/mongoid/matchable/lt.rb +21 -0
  137. data/lib/mongoid/matchable/lte.rb +21 -0
  138. data/lib/mongoid/matchable/ne.rb +21 -0
  139. data/lib/mongoid/matchable/nin.rb +21 -0
  140. data/lib/mongoid/matchable/or.rb +33 -0
  141. data/lib/mongoid/matchable/size.rb +21 -0
  142. data/lib/mongoid/persistable.rb +207 -0
  143. data/lib/mongoid/persistable/creatable.rb +189 -0
  144. data/lib/mongoid/persistable/deletable.rb +149 -0
  145. data/lib/mongoid/persistable/destroyable.rb +55 -0
  146. data/lib/mongoid/persistable/incrementable.rb +36 -0
  147. data/lib/mongoid/persistable/logical.rb +38 -0
  148. data/lib/mongoid/persistable/poppable.rb +39 -0
  149. data/lib/mongoid/persistable/pullable.rb +55 -0
  150. data/lib/mongoid/persistable/pushable.rb +62 -0
  151. data/lib/mongoid/persistable/renamable.rb +35 -0
  152. data/lib/mongoid/persistable/savable.rb +52 -0
  153. data/lib/mongoid/persistable/settable.rb +33 -0
  154. data/lib/mongoid/persistable/unsettable.rb +36 -0
  155. data/lib/mongoid/persistable/updatable.rb +151 -0
  156. data/lib/mongoid/persistable/upsertable.rb +55 -0
  157. data/lib/mongoid/positional.rb +71 -0
  158. data/lib/mongoid/railtie.rb +156 -0
  159. data/lib/mongoid/railties/database.rake +97 -0
  160. data/lib/mongoid/railties/document.rb +12 -0
  161. data/lib/mongoid/relations.rb +162 -0
  162. data/lib/mongoid/relations/accessors.rb +299 -0
  163. data/lib/mongoid/relations/auto_save.rb +106 -0
  164. data/lib/mongoid/relations/binding.rb +218 -0
  165. data/lib/mongoid/relations/bindings.rb +9 -0
  166. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  167. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  168. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  169. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  170. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  171. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  172. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  173. data/lib/mongoid/relations/builder.rb +57 -0
  174. data/lib/mongoid/relations/builders.rb +104 -0
  175. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  176. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  177. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  180. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  181. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  183. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  184. data/lib/mongoid/relations/cascading.rb +56 -0
  185. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  186. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  187. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  188. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  189. data/lib/mongoid/relations/constraint.rb +49 -0
  190. data/lib/mongoid/relations/conversions.rb +34 -0
  191. data/lib/mongoid/relations/counter_cache.rb +105 -0
  192. data/lib/mongoid/relations/cyclic.rb +107 -0
  193. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  194. data/lib/mongoid/relations/embedded/in.rb +231 -0
  195. data/lib/mongoid/relations/embedded/many.rb +639 -0
  196. data/lib/mongoid/relations/embedded/one.rb +223 -0
  197. data/lib/mongoid/relations/macros.rb +356 -0
  198. data/lib/mongoid/relations/many.rb +208 -0
  199. data/lib/mongoid/relations/marshalable.rb +32 -0
  200. data/lib/mongoid/relations/metadata.rb +1174 -0
  201. data/lib/mongoid/relations/nested_builder.rb +74 -0
  202. data/lib/mongoid/relations/one.rb +48 -0
  203. data/lib/mongoid/relations/options.rb +48 -0
  204. data/lib/mongoid/relations/polymorphic.rb +39 -0
  205. data/lib/mongoid/relations/proxy.rb +270 -0
  206. data/lib/mongoid/relations/referenced/in.rb +297 -0
  207. data/lib/mongoid/relations/referenced/many.rb +787 -0
  208. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  209. data/lib/mongoid/relations/referenced/one.rb +290 -0
  210. data/lib/mongoid/relations/reflections.rb +62 -0
  211. data/lib/mongoid/relations/synchronization.rb +169 -0
  212. data/lib/mongoid/relations/targets.rb +2 -0
  213. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  214. data/lib/mongoid/relations/touchable.rb +94 -0
  215. data/lib/mongoid/reloadable.rb +95 -0
  216. data/lib/mongoid/scopable.rb +379 -0
  217. data/lib/mongoid/selectable.rb +59 -0
  218. data/lib/mongoid/serializable.rb +170 -0
  219. data/lib/mongoid/sessions.rb +330 -0
  220. data/lib/mongoid/sessions/factory.rb +129 -0
  221. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  222. data/lib/mongoid/sessions/options.rb +141 -0
  223. data/lib/mongoid/sessions/validators.rb +2 -0
  224. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  225. data/lib/mongoid/shardable.rb +65 -0
  226. data/lib/mongoid/state.rb +97 -0
  227. data/lib/mongoid/threaded.rb +383 -0
  228. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  229. data/lib/mongoid/timestamps.rb +15 -0
  230. data/lib/mongoid/timestamps/created.rb +30 -0
  231. data/lib/mongoid/timestamps/created/short.rb +19 -0
  232. data/lib/mongoid/timestamps/short.rb +10 -0
  233. data/lib/mongoid/timestamps/updated.rb +39 -0
  234. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  235. data/lib/mongoid/traversable.rb +192 -0
  236. data/lib/mongoid/unit_of_work.rb +61 -0
  237. data/lib/mongoid/validatable.rb +180 -0
  238. data/lib/mongoid/validatable/associated.rb +48 -0
  239. data/lib/mongoid/validatable/format.rb +20 -0
  240. data/lib/mongoid/validatable/length.rb +20 -0
  241. data/lib/mongoid/validatable/localizable.rb +30 -0
  242. data/lib/mongoid/validatable/macros.rb +94 -0
  243. data/lib/mongoid/validatable/presence.rb +86 -0
  244. data/lib/mongoid/validatable/queryable.rb +30 -0
  245. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  246. data/lib/mongoid/version.rb +4 -0
  247. data/lib/rack/mongoid.rb +2 -0
  248. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  249. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  250. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  251. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  252. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  253. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  254. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  255. data/lib/rails/generators/mongoid_generator.rb +65 -0
  256. data/lib/rails/mongoid.rb +180 -0
  257. data/lib/support/ruby_version.rb +26 -0
  258. data/spec/app/models/account.rb +28 -0
  259. data/spec/app/models/acolyte.rb +17 -0
  260. data/spec/app/models/actor.rb +18 -0
  261. data/spec/app/models/actress.rb +2 -0
  262. data/spec/app/models/address.rb +77 -0
  263. data/spec/app/models/address_component.rb +5 -0
  264. data/spec/app/models/address_number.rb +6 -0
  265. data/spec/app/models/agency.rb +5 -0
  266. data/spec/app/models/agent.rb +12 -0
  267. data/spec/app/models/album.rb +14 -0
  268. data/spec/app/models/alert.rb +5 -0
  269. data/spec/app/models/animal.rb +25 -0
  270. data/spec/app/models/answer.rb +4 -0
  271. data/spec/app/models/appointment.rb +7 -0
  272. data/spec/app/models/article.rb +10 -0
  273. data/spec/app/models/artist.rb +66 -0
  274. data/spec/app/models/artwork.rb +4 -0
  275. data/spec/app/models/audio.rb +5 -0
  276. data/spec/app/models/augmentation.rb +11 -0
  277. data/spec/app/models/author.rb +4 -0
  278. data/spec/app/models/band.rb +26 -0
  279. data/spec/app/models/bar.rb +10 -0
  280. data/spec/app/models/basic.rb +6 -0
  281. data/spec/app/models/bed.rb +1 -0
  282. data/spec/app/models/big_palette.rb +2 -0
  283. data/spec/app/models/birthday.rb +13 -0
  284. data/spec/app/models/book.rb +13 -0
  285. data/spec/app/models/breed.rb +4 -0
  286. data/spec/app/models/browser.rb +6 -0
  287. data/spec/app/models/building.rb +5 -0
  288. data/spec/app/models/building_address.rb +5 -0
  289. data/spec/app/models/bus.rb +7 -0
  290. data/spec/app/models/business.rb +5 -0
  291. data/spec/app/models/callback_recorder.rb +25 -0
  292. data/spec/app/models/callback_test.rb +9 -0
  293. data/spec/app/models/canvas.rb +25 -0
  294. data/spec/app/models/car.rb +1 -0
  295. data/spec/app/models/cat.rb +8 -0
  296. data/spec/app/models/category.rb +8 -0
  297. data/spec/app/models/child.rb +4 -0
  298. data/spec/app/models/child_doc.rb +22 -0
  299. data/spec/app/models/church.rb +4 -0
  300. data/spec/app/models/circle.rb +3 -0
  301. data/spec/app/models/circuit.rb +4 -0
  302. data/spec/app/models/circus.rb +7 -0
  303. data/spec/app/models/code.rb +5 -0
  304. data/spec/app/models/comment.rb +16 -0
  305. data/spec/app/models/contractor.rb +5 -0
  306. data/spec/app/models/cookie.rb +6 -0
  307. data/spec/app/models/country_code.rb +8 -0
  308. data/spec/app/models/definition.rb +7 -0
  309. data/spec/app/models/description.rb +11 -0
  310. data/spec/app/models/dictionary.rb +10 -0
  311. data/spec/app/models/division.rb +10 -0
  312. data/spec/app/models/doctor.rb +12 -0
  313. data/spec/app/models/dog.rb +7 -0
  314. data/spec/app/models/dokument.rb +5 -0
  315. data/spec/app/models/dragon.rb +4 -0
  316. data/spec/app/models/driver.rb +7 -0
  317. data/spec/app/models/drug.rb +6 -0
  318. data/spec/app/models/dungeon.rb +4 -0
  319. data/spec/app/models/email.rb +6 -0
  320. data/spec/app/models/employer.rb +5 -0
  321. data/spec/app/models/entry.rb +6 -0
  322. data/spec/app/models/eraser.rb +1 -0
  323. data/spec/app/models/event.rb +22 -0
  324. data/spec/app/models/exhibition.rb +4 -0
  325. data/spec/app/models/exhibitor.rb +5 -0
  326. data/spec/app/models/eye.rb +9 -0
  327. data/spec/app/models/eye_bowl.rb +9 -0
  328. data/spec/app/models/face.rb +8 -0
  329. data/spec/app/models/favorite.rb +6 -0
  330. data/spec/app/models/filesystem.rb +5 -0
  331. data/spec/app/models/fire_hydrant.rb +6 -0
  332. data/spec/app/models/firefox.rb +4 -0
  333. data/spec/app/models/fish.rb +7 -0
  334. data/spec/app/models/folder.rb +7 -0
  335. data/spec/app/models/folder_item.rb +9 -0
  336. data/spec/app/models/fruits.rb +28 -0
  337. data/spec/app/models/game.rb +19 -0
  338. data/spec/app/models/ghost.rb +7 -0
  339. data/spec/app/models/home.rb +4 -0
  340. data/spec/app/models/house.rb +6 -0
  341. data/spec/app/models/html_writer.rb +3 -0
  342. data/spec/app/models/image.rb +22 -0
  343. data/spec/app/models/implant.rb +16 -0
  344. data/spec/app/models/item.rb +8 -0
  345. data/spec/app/models/jar.rb +7 -0
  346. data/spec/app/models/label.rb +40 -0
  347. data/spec/app/models/language.rb +5 -0
  348. data/spec/app/models/lat_lng.rb +15 -0
  349. data/spec/app/models/league.rb +11 -0
  350. data/spec/app/models/learner.rb +2 -0
  351. data/spec/app/models/line_item.rb +6 -0
  352. data/spec/app/models/location.rb +8 -0
  353. data/spec/app/models/login.rb +8 -0
  354. data/spec/app/models/manufacturer.rb +7 -0
  355. data/spec/app/models/meat.rb +4 -0
  356. data/spec/app/models/membership.rb +4 -0
  357. data/spec/app/models/mixed_drink.rb +4 -0
  358. data/spec/app/models/movie.rb +13 -0
  359. data/spec/app/models/my_hash.rb +2 -0
  360. data/spec/app/models/name.rb +23 -0
  361. data/spec/app/models/node.rb +5 -0
  362. data/spec/app/models/note.rb +12 -0
  363. data/spec/app/models/ordered_post.rb +6 -0
  364. data/spec/app/models/ordered_preference.rb +6 -0
  365. data/spec/app/models/oscar.rb +15 -0
  366. data/spec/app/models/override.rb +16 -0
  367. data/spec/app/models/ownable.rb +6 -0
  368. data/spec/app/models/owner.rb +6 -0
  369. data/spec/app/models/pack.rb +3 -0
  370. data/spec/app/models/page.rb +5 -0
  371. data/spec/app/models/page_question.rb +4 -0
  372. data/spec/app/models/palette.rb +7 -0
  373. data/spec/app/models/parent.rb +5 -0
  374. data/spec/app/models/parent_doc.rb +6 -0
  375. data/spec/app/models/passport.rb +5 -0
  376. data/spec/app/models/patient.rb +9 -0
  377. data/spec/app/models/pdf_writer.rb +3 -0
  378. data/spec/app/models/pencil.rb +1 -0
  379. data/spec/app/models/person.rb +205 -0
  380. data/spec/app/models/pet.rb +23 -0
  381. data/spec/app/models/pet_owner.rb +6 -0
  382. data/spec/app/models/phone.rb +11 -0
  383. data/spec/app/models/pizza.rb +7 -0
  384. data/spec/app/models/player.rb +35 -0
  385. data/spec/app/models/post.rb +44 -0
  386. data/spec/app/models/powerup.rb +11 -0
  387. data/spec/app/models/preference.rb +9 -0
  388. data/spec/app/models/princess.rb +8 -0
  389. data/spec/app/models/product.rb +15 -0
  390. data/spec/app/models/profile.rb +5 -0
  391. data/spec/app/models/pronunciation.rb +5 -0
  392. data/spec/app/models/purchase.rb +4 -0
  393. data/spec/app/models/question.rb +8 -0
  394. data/spec/app/models/quiz.rb +7 -0
  395. data/spec/app/models/rating.rb +8 -0
  396. data/spec/app/models/record.rb +46 -0
  397. data/spec/app/models/registry.rb +4 -0
  398. data/spec/app/models/role.rb +7 -0
  399. data/spec/app/models/root_category.rb +4 -0
  400. data/spec/app/models/sandwich.rb +4 -0
  401. data/spec/app/models/scheduler.rb +7 -0
  402. data/spec/app/models/seo.rb +7 -0
  403. data/spec/app/models/series.rb +4 -0
  404. data/spec/app/models/server.rb +13 -0
  405. data/spec/app/models/service.rb +22 -0
  406. data/spec/app/models/shape.rb +12 -0
  407. data/spec/app/models/shelf.rb +5 -0
  408. data/spec/app/models/shipping_container.rb +5 -0
  409. data/spec/app/models/shipping_pack.rb +3 -0
  410. data/spec/app/models/shop.rb +6 -0
  411. data/spec/app/models/short_agent.rb +4 -0
  412. data/spec/app/models/short_quiz.rb +5 -0
  413. data/spec/app/models/slave.rb +6 -0
  414. data/spec/app/models/song.rb +8 -0
  415. data/spec/app/models/sound.rb +5 -0
  416. data/spec/app/models/square.rb +4 -0
  417. data/spec/app/models/strategy.rb +3 -0
  418. data/spec/app/models/sub_item.rb +3 -0
  419. data/spec/app/models/subscription.rb +4 -0
  420. data/spec/app/models/survey.rb +5 -0
  421. data/spec/app/models/symptom.rb +6 -0
  422. data/spec/app/models/tag.rb +8 -0
  423. data/spec/app/models/target.rb +5 -0
  424. data/spec/app/models/template.rb +5 -0
  425. data/spec/app/models/thing.rb +9 -0
  426. data/spec/app/models/title.rb +3 -0
  427. data/spec/app/models/tool.rb +8 -0
  428. data/spec/app/models/topping.rb +5 -0
  429. data/spec/app/models/track.rb +38 -0
  430. data/spec/app/models/translation.rb +5 -0
  431. data/spec/app/models/tree.rb +9 -0
  432. data/spec/app/models/truck.rb +3 -0
  433. data/spec/app/models/user.rb +21 -0
  434. data/spec/app/models/user_account.rb +10 -0
  435. data/spec/app/models/validation_callback.rb +10 -0
  436. data/spec/app/models/vehicle.rb +11 -0
  437. data/spec/app/models/version.rb +5 -0
  438. data/spec/app/models/vet_visit.rb +5 -0
  439. data/spec/app/models/video.rb +13 -0
  440. data/spec/app/models/weapon.rb +11 -0
  441. data/spec/app/models/wiki_page.rb +14 -0
  442. data/spec/app/models/word.rb +15 -0
  443. data/spec/app/models/word_origin.rb +11 -0
  444. data/spec/app/models/writer.rb +11 -0
  445. data/spec/config/mongoid.yml +38 -0
  446. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  447. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  448. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  449. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  450. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  451. data/spec/mongoid/atomic_spec.rb +365 -0
  452. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  453. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  454. data/spec/mongoid/attributes_spec.rb +1412 -0
  455. data/spec/mongoid/changeable_spec.rb +1507 -0
  456. data/spec/mongoid/composable_spec.rb +24 -0
  457. data/spec/mongoid/config/environment_spec.rb +83 -0
  458. data/spec/mongoid/config/options_spec.rb +56 -0
  459. data/spec/mongoid/config_spec.rb +318 -0
  460. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  461. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  462. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  463. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  464. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  465. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  466. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  467. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  468. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  469. data/spec/mongoid/copyable_spec.rb +393 -0
  470. data/spec/mongoid/criteria/findable_spec.rb +1189 -0
  471. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  472. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  473. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  474. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  475. data/spec/mongoid/criteria_spec.rb +3821 -0
  476. data/spec/mongoid/document_spec.rb +1205 -0
  477. data/spec/mongoid/equality_spec.rb +241 -0
  478. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  479. data/spec/mongoid/errors/callback_spec.rb +29 -0
  480. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  481. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  482. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  483. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  484. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  485. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  487. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  488. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  489. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  490. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  492. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  493. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  494. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  495. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  496. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  497. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  499. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  500. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  501. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  504. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  505. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  509. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  510. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  511. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  512. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  513. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  514. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  515. data/spec/mongoid/errors/validations_spec.rb +45 -0
  516. data/spec/mongoid/extensions/array_spec.rb +638 -0
  517. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  518. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  519. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  520. data/spec/mongoid/extensions/date_spec.rb +235 -0
  521. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  522. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  523. data/spec/mongoid/extensions/float_spec.rb +133 -0
  524. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  525. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  526. data/spec/mongoid/extensions/module_spec.rb +42 -0
  527. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  528. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  529. data/spec/mongoid/extensions/object_spec.rb +292 -0
  530. data/spec/mongoid/extensions/range_spec.rb +105 -0
  531. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  532. data/spec/mongoid/extensions/set_spec.rb +33 -0
  533. data/spec/mongoid/extensions/string_spec.rb +357 -0
  534. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  535. data/spec/mongoid/extensions/time_spec.rb +467 -0
  536. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  537. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  538. data/spec/mongoid/extensions_spec.rb +15 -0
  539. data/spec/mongoid/factory_spec.rb +185 -0
  540. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  541. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  543. data/spec/mongoid/fields/localized_spec.rb +386 -0
  544. data/spec/mongoid/fields/standard_spec.rb +166 -0
  545. data/spec/mongoid/fields_spec.rb +1229 -0
  546. data/spec/mongoid/findable_spec.rb +342 -0
  547. data/spec/mongoid/identity_map_spec.rb +564 -0
  548. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  549. data/spec/mongoid/indexable_spec.rb +504 -0
  550. data/spec/mongoid/inspectable_spec.rb +49 -0
  551. data/spec/mongoid/interceptable_spec.rb +1564 -0
  552. data/spec/mongoid/loggable_spec.rb +21 -0
  553. data/spec/mongoid/matchable/all_spec.rb +31 -0
  554. data/spec/mongoid/matchable/and_spec.rb +162 -0
  555. data/spec/mongoid/matchable/default_spec.rb +130 -0
  556. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  557. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  558. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  559. data/spec/mongoid/matchable/in_spec.rb +25 -0
  560. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  561. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  562. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  563. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  564. data/spec/mongoid/matchable/or_spec.rb +106 -0
  565. data/spec/mongoid/matchable/size_spec.rb +25 -0
  566. data/spec/mongoid/matchable_spec.rb +532 -0
  567. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  568. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  569. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  570. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  571. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  572. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  573. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  574. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  575. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  576. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  577. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  578. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  579. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  580. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  581. data/spec/mongoid/persistable_spec.rb +206 -0
  582. data/spec/mongoid/positional_spec.rb +227 -0
  583. data/spec/mongoid/railties/document_spec.rb +24 -0
  584. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  585. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  586. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  587. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  588. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  589. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  590. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  592. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  593. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  594. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  595. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  596. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  598. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  599. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  600. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  601. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  602. data/spec/mongoid/relations/builders_spec.rb +226 -0
  603. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  604. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  605. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  606. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  607. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  608. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  609. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  610. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  611. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  612. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  613. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  614. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  615. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  616. data/spec/mongoid/relations/macros_spec.rb +613 -0
  617. data/spec/mongoid/relations/metadata_spec.rb +1917 -0
  618. data/spec/mongoid/relations/options_spec.rb +35 -0
  619. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  620. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  621. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  622. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  623. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  624. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  625. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  626. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  627. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  628. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  629. data/spec/mongoid/relations_spec.rb +188 -0
  630. data/spec/mongoid/reloadable_spec.rb +305 -0
  631. data/spec/mongoid/scopable_spec.rb +926 -0
  632. data/spec/mongoid/selectable_spec.rb +134 -0
  633. data/spec/mongoid/serializable_spec.rb +862 -0
  634. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  635. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  636. data/spec/mongoid/sessions/options_spec.rb +71 -0
  637. data/spec/mongoid/sessions_spec.rb +1078 -0
  638. data/spec/mongoid/shardable_spec.rb +61 -0
  639. data/spec/mongoid/state_spec.rb +102 -0
  640. data/spec/mongoid/threaded_spec.rb +258 -0
  641. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  642. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  643. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  644. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  645. data/spec/mongoid/timestamps_spec.rb +112 -0
  646. data/spec/mongoid/traversable_spec.rb +244 -0
  647. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  648. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  649. data/spec/mongoid/validatable/format_spec.rb +83 -0
  650. data/spec/mongoid/validatable/length_spec.rb +119 -0
  651. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  652. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  653. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  654. data/spec/mongoid/validatable_spec.rb +309 -0
  655. data/spec/mongoid_spec.rb +74 -0
  656. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  657. data/spec/rails/mongoid_spec.rb +462 -0
  658. data/spec/spec_helper.rb +103 -0
  659. metadata +1159 -0
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Contextual
4
+ module Queryable
5
+
6
+ # @attribute [r] collection The collection to query against.
7
+ # @attribute [r] criteria The criteria for the context.
8
+ # @attribute [r] klass The klass for the criteria.
9
+ attr_reader :collection, :criteria, :klass
10
+
11
+ # Is the enumerable of matching documents empty?
12
+ #
13
+ # @example Is the context empty?
14
+ # context.blank?
15
+ #
16
+ # @return [ true, false ] If the context is empty.
17
+ #
18
+ # @since 3.0.0
19
+ def blank?
20
+ !exists?
21
+ end
22
+ alias :empty? :blank?
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,180 @@
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
+ selecting(:project) do
28
+ documents.each do |doc|
29
+ yield doc
30
+ end
31
+ end
32
+ else
33
+ to_enum
34
+ end
35
+ end
36
+
37
+ # Instantiate a new text search lazy proxy.
38
+ #
39
+ # @example Instantiate the text search.
40
+ # TextSearch.new(collection, criteria, "test")
41
+ #
42
+ # @param [ Moped::Collection ] collection The collection to execute on.
43
+ # @param [ Criteria ] criteria The criteria to filter results.
44
+ # @param [ String ] search_string The search string.
45
+ #
46
+ # @since 4.0.0
47
+ def initialize(collection, criteria, search_string)
48
+ @collection, @criteria = collection, criteria
49
+ command[:text] = collection.name.to_s
50
+ command[:search] = search_string
51
+ apply_criteria_options
52
+ end
53
+
54
+ # Inspect the text search object.
55
+ #
56
+ # @example Inspect the text search.
57
+ # text_search.inspect
58
+ #
59
+ # @return [ String ] The inspection.
60
+ #
61
+ # @since 4.0.0
62
+ def inspect
63
+ %Q{#<Mongoid::Contextual::TextSearch
64
+ selector: #{criteria.selector.inspect}
65
+ class: #{criteria.klass}
66
+ search: #{command[:search]}
67
+ filter: #{command[:filter] || "N/A"}
68
+ project: #{command[:project] || "N/A"}
69
+ limit: #{command[:limit] || "N/A"}
70
+ language: #{command[:language] || "default"}>
71
+ }
72
+ end
73
+
74
+ # Execute the text search command, and return the raw results (in hash
75
+ # form).
76
+ #
77
+ # @example Execute the command.
78
+ # text_search.execute
79
+ #
80
+ # @return [ Hash ] The raw results.
81
+ #
82
+ # @since 4.0.0
83
+ def execute
84
+ results
85
+ end
86
+
87
+ # Set the language of the text search.
88
+ #
89
+ # @example Set the text search language.
90
+ # text_search.language("deutsch")
91
+ #
92
+ # @param [ String ] value The name of the language.
93
+ #
94
+ # @return [ TextSearch ] The modified text search.
95
+ #
96
+ # @since 4.0.0
97
+ def language(value)
98
+ command[:language] = value
99
+ self
100
+ end
101
+
102
+ # Limits the fields returned by the text search for each document. By
103
+ # default, _id is always included.
104
+ #
105
+ # @example Limit the returned fields.
106
+ # text_search.project(name: 1, title: 1)
107
+ #
108
+ # @param [ Hash ] value The fields to project.
109
+ #
110
+ # @return [ TextSearch ] The modified text search.
111
+ #
112
+ # @since 4.0.0
113
+ def project(value)
114
+ command[:project] = value
115
+ self
116
+ end
117
+
118
+ # Get the raw statistics returned from the text search.
119
+ #
120
+ # @example Get the stats.
121
+ # text_search.stats
122
+ #
123
+ # @return [ Hash ] The raw statistics.
124
+ #
125
+ # @since 4.0.0
126
+ def stats
127
+ results["stats"]
128
+ end
129
+
130
+ private
131
+
132
+ # Apply the options from the criteria to the text search command.
133
+ #
134
+ # @api private
135
+ #
136
+ # @example Apply the criteria options, filter and limit only.
137
+ # text_search.apply_criteria_options
138
+ #
139
+ # @return [ nil ] Nothing.
140
+ #
141
+ # @since 4.0.0
142
+ def apply_criteria_options
143
+ command[:filter] = criteria.selector
144
+ if limit = criteria.options[:limit]
145
+ command[:limit] = limit
146
+ end
147
+ end
148
+
149
+ # Get the results of the text search as documents.
150
+ #
151
+ # @api private
152
+ #
153
+ # @example Get the results as documents.
154
+ # text_search.documents
155
+ #
156
+ # @return [ Array<Document> ] The documents.
157
+ #
158
+ # @since 4.0.0
159
+ def documents
160
+ results["results"].map do |attributes|
161
+ Factory.from_db(criteria.klass, attributes["obj"], criteria.object_id)
162
+ end
163
+ end
164
+
165
+ # Get the raw results.
166
+ #
167
+ # @api private
168
+ #
169
+ # @example Get the raw results.
170
+ # text_search.results
171
+ #
172
+ # @return [ Hash ] The raw results.
173
+ #
174
+ # @since 4.0.0
175
+ def results
176
+ @results ||= session.command(command)
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+
4
+ # This module contains the behaviour of Mongoid's clone/dup of documents.
5
+ module Copyable
6
+ extend ActiveSupport::Concern
7
+
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
10
+ # instance variables.
11
+ #
12
+ # This clone also includes embedded documents.
13
+ #
14
+ # @example Clone the document.
15
+ # document.clone
16
+ #
17
+ # @param [ Document ] other The document getting cloned.
18
+ #
19
+ # @return [ Document ] The new document.
20
+ def clone
21
+ # @note This next line is here to address #2704, even though having an
22
+ # _id and id field in the document would cause problems with Mongoid
23
+ # elsewhere.
24
+ attrs = clone_document.except("_id", "id")
25
+ self.class.new(attrs)
26
+ end
27
+ alias :dup :clone
28
+
29
+ private
30
+
31
+ # Clone the document attributes
32
+ #
33
+ # @api private
34
+ #
35
+ # @example clone document
36
+ # model.clone_document
37
+ #
38
+ # @param [ Hash ] dcoument The document with hash format
39
+ #
40
+ # @since 3.0.22
41
+ def clone_document
42
+ attrs = as_document.__deep_copy__
43
+ attrs["version"] = 1 if attrs.delete("versions")
44
+ process_localized_attributes(attrs)
45
+ attrs
46
+ end
47
+
48
+ # When cloning, if the document has localized fields we need to ensure they
49
+ # are properly processed in the clone.
50
+ #
51
+ # @api private
52
+ #
53
+ # @example Process localized attributes.
54
+ # model.process_localized_attributes(attributes)
55
+ #
56
+ # @param [ Hash ] attrs The attributes.
57
+ #
58
+ # @since 3.0.20
59
+ def process_localized_attributes(attrs)
60
+ localized_fields.keys.each do |name|
61
+ if value = attrs.delete(name)
62
+ attrs["#{name}_translations"] = value
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,562 @@
1
+ # encoding: utf-8
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"
8
+
9
+ module Mongoid
10
+
11
+ # The +Criteria+ class is the core object needed in Mongoid to retrieve
12
+ # objects from the database. It is a DSL that essentially sets up the
13
+ # selector and options arguments that get passed on to a Mongo::Collection
14
+ # in the Ruby driver. Each method on the +Criteria+ returns self to they
15
+ # can be chained in order to create a readable criterion to be executed
16
+ # against the database.
17
+ class Criteria
18
+ include Enumerable
19
+ include Contextual
20
+ include Origin::Queryable
21
+ include Findable
22
+ include Inspectable
23
+ include Marshalable
24
+ include Modifiable
25
+ include Scopable
26
+ include Sessions::Options
27
+
28
+ # Static array used to check with method missing - we only need to ever
29
+ # instantiate once.
30
+ #
31
+ # @since 4.0.0
32
+ CHECK = []
33
+
34
+ attr_accessor :embedded, :klass
35
+
36
+ # Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
37
+ # of this +Criteria+ or the criteria itself.
38
+ #
39
+ # @note This will force a database load when called if an enumerable is passed.
40
+ #
41
+ # @param [ Object ] other The other +Enumerable+ or +Criteria+ to compare to.
42
+ #
43
+ # @return [ true, false ] If the objects are equal.
44
+ #
45
+ # @since 1.0.0
46
+ def ==(other)
47
+ return super if other.respond_to?(:selector)
48
+ entries == other
49
+ end
50
+
51
+ # Needed to properly get a criteria back as json
52
+ #
53
+ # @example Get the criteria as json.
54
+ # Person.where(:title => "Sir").as_json
55
+ #
56
+ # @param [ Hash ] options Options to pass through to the serializer.
57
+ #
58
+ # @return [ String ] The JSON string.
59
+ def as_json(options = nil)
60
+ entries.as_json(options)
61
+ end
62
+
63
+ # Tells the criteria that the cursor that gets returned needs to be
64
+ # cached. This is so multiple iterations don't hit the database multiple
65
+ # times, however this is not advisable when working with large data sets
66
+ # as the entire results will get stored in memory.
67
+ #
68
+ # @example Flag the criteria as cached.
69
+ # criteria.cache
70
+ #
71
+ # @return [ Criteria ] The cloned criteria.
72
+ def cache
73
+ crit = clone
74
+ crit.options.merge!(cache: true)
75
+ crit
76
+ end
77
+
78
+ # Will return true if the cache option has been set.
79
+ #
80
+ # @example Is the criteria cached?
81
+ # criteria.cached?
82
+ #
83
+ # @return [ true, false ] If the criteria is flagged as cached.
84
+ def cached?
85
+ options[:cache] == true
86
+ end
87
+
88
+ # Get the documents from the embedded criteria.
89
+ #
90
+ # @example Get the documents.
91
+ # criteria.documents
92
+ #
93
+ # @return [ Array<Document> ] The documents.
94
+ #
95
+ # @since 3.0.0
96
+ def documents
97
+ @documents ||= []
98
+ end
99
+
100
+ # Set the embedded documents on the criteria.
101
+ #
102
+ # @example Set the documents.
103
+ #
104
+ # @param [ Array<Document> ] docs The embedded documents.
105
+ #
106
+ # @return [ Array<Document> ] The embedded documents.
107
+ #
108
+ # @since 3.0.0
109
+ def documents=(docs)
110
+ @documents = docs
111
+ end
112
+
113
+ # Is the criteria for embedded documents?
114
+ #
115
+ # @example Is the criteria for embedded documents?
116
+ # criteria.embedded?
117
+ #
118
+ # @return [ true, false ] If the criteria is embedded.
119
+ #
120
+ # @since 3.0.0
121
+ def embedded?
122
+ !!@embedded
123
+ end
124
+
125
+ # Extract a single id from the provided criteria. Could be in an $and
126
+ # query or a straight _id query.
127
+ #
128
+ # @example Extract the id.
129
+ # criteria.extract_id
130
+ #
131
+ # @return [ Object ] The id.
132
+ #
133
+ # @since 2.3.0
134
+ def extract_id
135
+ selector.extract_id
136
+ end
137
+
138
+ # Adds a criterion to the +Criteria+ that specifies additional options
139
+ # to be passed to the Ruby driver, in the exact format for the driver.
140
+ #
141
+ # @example Add extra params to the criteria.
142
+ # criteria.extras(:limit => 20, :skip => 40)
143
+ #
144
+ # @param [ Hash ] extras The extra driver options.
145
+ #
146
+ # @return [ Criteria ] The cloned criteria.
147
+ #
148
+ # @since 2.0.0
149
+ def extras(extras)
150
+ crit = clone
151
+ crit.options.merge!(extras)
152
+ crit
153
+ end
154
+
155
+ # Get the list of included fields.
156
+ #
157
+ # @example Get the field list.
158
+ # criteria.field_list
159
+ #
160
+ # @return [ Array<String> ] The fields.
161
+ #
162
+ # @since 2.0.0
163
+ def field_list
164
+ if options[:fields]
165
+ options[:fields].keys.reject{ |key| key == "_type" }
166
+ else
167
+ []
168
+ end
169
+ end
170
+
171
+ # When freezing a criteria we need to initialize the context first
172
+ # otherwise the setting of the context on attempted iteration will raise a
173
+ # runtime error.
174
+ #
175
+ # @example Freeze the criteria.
176
+ # criteria.freeze
177
+ #
178
+ # @return [ Criteria ] The frozen criteria.
179
+ #
180
+ # @since 2.0.0
181
+ def freeze
182
+ context and inclusions and super
183
+ end
184
+
185
+ # Initialize the new criteria.
186
+ #
187
+ # @example Init the new criteria.
188
+ # Criteria.new(Band)
189
+ #
190
+ # @param [ Class ] klass The model class.
191
+ #
192
+ # @since 1.0.0
193
+ def initialize(klass)
194
+ @klass = klass
195
+ klass ? super(klass.aliased_fields, klass.fields) : super({}, {})
196
+ end
197
+
198
+ # Eager loads all the provided relations. Will load all the documents
199
+ # into the identity map who's ids match based on the extra query for the
200
+ # ids.
201
+ #
202
+ # @note This will only work if Mongoid's identity map is enabled. To do
203
+ # so set identity_map_enabled: true in your mongoid.yml
204
+ #
205
+ # @note This will work for embedded relations that reference another
206
+ # collection via belongs_to as well.
207
+ #
208
+ # @note Eager loading brings all the documents into memory, so there is a
209
+ # sweet spot on the performance gains. Internal benchmarks show that
210
+ # eager loading becomes slower around 100k documents, but this will
211
+ # naturally depend on the specific application.
212
+ #
213
+ # @example Eager load the provided relations.
214
+ # Person.includes(:posts, :game)
215
+ #
216
+ # @param [ Array<Symbol> ] relations The names of the relations to eager
217
+ # load.
218
+ #
219
+ # @return [ Criteria ] The cloned criteria.
220
+ #
221
+ # @since 2.2.0
222
+ def includes(*relations)
223
+ relations.flatten.each do |name|
224
+ metadata = klass.reflect_on_association(name)
225
+ raise Errors::InvalidIncludes.new(klass, relations) unless metadata
226
+ inclusions.push(metadata) unless inclusions.include?(metadata)
227
+ end
228
+ clone
229
+ end
230
+
231
+ # Get a list of criteria that are to be executed for eager loading.
232
+ #
233
+ # @example Get the eager loading inclusions.
234
+ # Person.includes(:game).inclusions
235
+ #
236
+ # @return [ Array<Metadata> ] The inclusions.
237
+ #
238
+ # @since 2.2.0
239
+ def inclusions
240
+ @inclusions ||= []
241
+ end
242
+
243
+ # Set the inclusions for the criteria.
244
+ #
245
+ # @example Set the inclusions.
246
+ # criteria.inclusions = [ meta ]
247
+ #
248
+ # @param [ Array<Metadata> ] The inclusions.
249
+ #
250
+ # @return [ Array<Metadata> ] The new inclusions.
251
+ #
252
+ # @since 3.0.0
253
+ def inclusions=(value)
254
+ @inclusions = value
255
+ end
256
+
257
+ # Merges another object with this +Criteria+ and returns a new criteria.
258
+ # The other object may be a +Criteria+ or a +Hash+. This is used to
259
+ # combine multiple scopes together, where a chained scope situation
260
+ # may be desired.
261
+ #
262
+ # @example Merge the criteria with another criteria.
263
+ # criteri.merge(other_criteria)
264
+ #
265
+ # @example Merge the criteria with a hash. The hash must contain a klass
266
+ # key and the key/value pairs correspond to method names/args.
267
+
268
+ # criteria.merge({
269
+ # klass: Band,
270
+ # where: { name: "Depeche Mode" },
271
+ # order_by: { name: 1 }
272
+ # })
273
+ #
274
+ # @param [ Criteria ] other The other criterion to merge with.
275
+ #
276
+ # @return [ Criteria ] A cloned self.
277
+ def merge(other)
278
+ crit = clone
279
+ crit.merge!(other)
280
+ crit
281
+ end
282
+
283
+ # Merge the other criteria into this one.
284
+ #
285
+ # @example Merge another criteria into this criteria.
286
+ # criteria.merge(Person.where(name: "bob"))
287
+ #
288
+ # @param [ Criteria ] other The criteria to merge in.
289
+ #
290
+ # @return [ Criteria ] The merged criteria.
291
+ #
292
+ # @since 3.0.0
293
+ def merge!(other)
294
+ criteria = other.to_criteria
295
+ selector.merge!(criteria.selector)
296
+ options.merge!(criteria.options)
297
+ self.documents = criteria.documents.dup unless criteria.documents.empty?
298
+ self.scoping_options = criteria.scoping_options
299
+ self.inclusions = (inclusions + criteria.inclusions.dup).uniq
300
+ self
301
+ end
302
+
303
+ # Overriden to include _type in the fields.
304
+ #
305
+ # @example Limit the fields returned from the database.
306
+ # Band.only(:name)
307
+ #
308
+ # @param [ Array<Symbol> ] args The names of the fields.
309
+ #
310
+ # @return [ Criteria ] The cloned criteria.
311
+ #
312
+ # @since 1.0.0
313
+ def only(*args)
314
+ return clone if args.flatten.empty?
315
+ args = args.flatten
316
+ if klass.hereditary?
317
+ super(*args.push(:_type))
318
+ else
319
+ super(*args)
320
+ end
321
+ end
322
+
323
+ # Returns true if criteria responds to the given method.
324
+ #
325
+ # @example Does the criteria respond to the method?
326
+ # crtiteria.respond_to?(:each)
327
+ #
328
+ # @param [ Symbol ] name The name of the class method on the +Document+.
329
+ # @param [ true, false ] include_private Whether to include privates.
330
+ #
331
+ # @return [ true, false ] If the criteria responds to the method.
332
+ def respond_to?(name, include_private = false)
333
+ super || klass.respond_to?(name) || CHECK.respond_to?(name, include_private)
334
+ end
335
+
336
+ alias :to_ary :to_a
337
+
338
+ # Convenience for objects that want to be merged into a criteria.
339
+ #
340
+ # @example Convert to a criteria.
341
+ # criteria.to_criteria
342
+ #
343
+ # @return [ Criteria ] self.
344
+ #
345
+ # @since 3.0.0
346
+ def to_criteria
347
+ self
348
+ end
349
+
350
+ # Convert the criteria to a proc.
351
+ #
352
+ # @example Convert the criteria to a proc.
353
+ # criteria.to_proc
354
+ #
355
+ # @return [ Proc ] The wrapped criteria.
356
+ #
357
+ # @since 3.0.0
358
+ def to_proc
359
+ ->{ self }
360
+ end
361
+
362
+ # Adds a criterion to the +Criteria+ that specifies a type or an Array of
363
+ # types that must be matched.
364
+ #
365
+ # @example Match only specific models.
366
+ # criteria.type('Browser')
367
+ # criteria.type(['Firefox', 'Browser'])
368
+ #
369
+ # @param [ Array<String> ] types The types to match against.
370
+ #
371
+ # @return [ Criteria ] The cloned criteria.
372
+ def type(types)
373
+ any_in(_type: Array(types))
374
+ end
375
+
376
+ # This is the general entry point for most MongoDB queries. This either
377
+ # creates a standard field: value selection, and expanded selection with
378
+ # the use of hash methods, or a $where selection if a string is provided.
379
+ #
380
+ # @example Add a standard selection.
381
+ # criteria.where(name: "syd")
382
+ #
383
+ # @example Add a javascript selection.
384
+ # criteria.where("this.name == 'syd'")
385
+ #
386
+ # @param [ String, Hash ] criterion The javascript or standard selection.
387
+ #
388
+ # @raise [ UnsupportedJavascript ] If provided a string and the criteria
389
+ # is embedded.
390
+ #
391
+ # @return [ Criteria ] The cloned selectable.
392
+ #
393
+ # @since 1.0.0
394
+ def where(expression)
395
+ if expression.is_a?(::String) && embedded?
396
+ raise Errors::UnsupportedJavascript.new(klass, expression)
397
+ end
398
+ super
399
+ end
400
+
401
+
402
+ # Get a version of this criteria without the options.
403
+ #
404
+ # @example Get the criteria without options.
405
+ # criteria.without_options
406
+ #
407
+ # @return [ Criteria ] The cloned criteria.
408
+ #
409
+ # @since 3.0.4
410
+ def without_options
411
+ crit = clone
412
+ crit.options.clear
413
+ crit
414
+ end
415
+
416
+ # Find documents by the provided javascript and scope. Uses a $where but is
417
+ # different from +Criteria#where+ in that it will pass a code object to the
418
+ # query instead of a pure string. Safe against Javascript injection
419
+ # attacks.
420
+ #
421
+ # @example Find by javascript.
422
+ # Band.for_js("this.name = param", param: "Tool")
423
+ #
424
+ # @param [ String ] javascript The javascript to execute in the $where.
425
+ # @param [ Hash ] scope The scope for the code.
426
+ #
427
+ # @return [ Criteria ] The criteria.
428
+ #
429
+ # @since 3.1.0
430
+ def for_js(javascript, scope = {})
431
+ js_query(Moped::BSON::Code.new(javascript, scope))
432
+ end
433
+
434
+ private
435
+
436
+ # Are documents in the query missing, and are we configured to raise an
437
+ # error?
438
+ #
439
+ # @api private
440
+ #
441
+ # @example Check for missing documents.
442
+ # criteria.check_for_missing_documents!([], [ 1 ])
443
+ #
444
+ # @param [ Array<Document> ] result The result.
445
+ # @param [ Array<Object> ] ids The ids.
446
+ #
447
+ # @raise [ Errors::DocumentNotFound ] If none are found and raising an
448
+ # error.
449
+ #
450
+ # @since 3.0.0
451
+ def check_for_missing_documents!(result, ids)
452
+ if (result.size < ids.size) && Mongoid.raise_not_found_error
453
+ raise Errors::DocumentNotFound.new(klass, ids, ids - result.map(&:_id))
454
+ end
455
+ end
456
+
457
+ # Clone or dup the current +Criteria+. This will return a new criteria with
458
+ # the selector, options, klass, embedded options, etc intact.
459
+ #
460
+ # @api private
461
+ #
462
+ # @example Clone a criteria.
463
+ # criteria.clone
464
+ #
465
+ # @example Dup a criteria.
466
+ # criteria.dup
467
+ #
468
+ # @param [ Criteria ] other The criteria getting cloned.
469
+ #
470
+ # @return [ nil ] nil.
471
+ #
472
+ # @since 1.0.0
473
+ def initialize_copy(other)
474
+ @inclusions = other.inclusions.dup
475
+ @scoping_options = other.scoping_options
476
+ @documents = other.documents.dup
477
+ @context = nil
478
+ super
479
+ end
480
+
481
+ # Used for chaining +Criteria+ scopes together in the for of class methods
482
+ # on the +Document+ the criteria is for.
483
+ #
484
+ # @example Handle method missing.
485
+ # criteria.method_missing(:name)
486
+ #
487
+ # @param [ Symbol ] name The method name.
488
+ # @param [ Array ] args The arguments.
489
+ #
490
+ # @return [ Object ] The result of the method call.
491
+ #
492
+ # @since 1.0.0
493
+ def method_missing(name, *args, &block)
494
+ if klass.respond_to?(name)
495
+ klass.send(:with_scope, self) do
496
+ klass.send(name, *args, &block)
497
+ end
498
+ elsif CHECK.respond_to?(name)
499
+ return entries.send(name, *args, &block)
500
+ else
501
+ super
502
+ end
503
+ end
504
+
505
+ # For models where inheritance is at play we need to add the type
506
+ # selection.
507
+ #
508
+ # @example Add the type selection.
509
+ # criteria.merge_type_selection
510
+ #
511
+ # @return [ true, false ] If type selection was added.
512
+ #
513
+ # @since 3.0.3
514
+ def merge_type_selection
515
+ selector.merge!(type_selection) if type_selectable?
516
+ end
517
+
518
+ # Is the criteria type selectable?
519
+ #
520
+ # @api private
521
+ #
522
+ # @example If the criteria type selectable?
523
+ # criteria.type_selectable?
524
+ #
525
+ # @return [ true, false ] If type selection should be added.
526
+ #
527
+ # @since 3.0.3
528
+ def type_selectable?
529
+ klass.hereditary? &&
530
+ !selector.keys.include?("_type") &&
531
+ !selector.keys.include?(:_type)
532
+ end
533
+
534
+ # Get the selector for type selection.
535
+ #
536
+ # @api private
537
+ #
538
+ # @example Get a type selection hash.
539
+ # criteria.type_selection
540
+ #
541
+ # @return [ Hash ] The type selection.
542
+ #
543
+ # @since 3.0.3
544
+ def type_selection
545
+ { _type: { "$in" => klass._types }}
546
+ end
547
+
548
+ # Get a new selector with type selection in it.
549
+ #
550
+ # @api private
551
+ #
552
+ # @example Get a selector with type selection.
553
+ # criteria.selector_with_type_selection
554
+ #
555
+ # @return [ Hash ] The selector.
556
+ #
557
+ # @since 3.0.3
558
+ def selector_with_type_selection
559
+ type_selectable? ? selector.merge(type_selection) : selector
560
+ end
561
+ end
562
+ end