mongoid 4.0.2 → 5.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -1
  3. data/README.md +14 -13
  4. data/lib/config/locales/en.yml +28 -28
  5. data/lib/mongoid.rb +28 -21
  6. data/lib/mongoid/atomic.rb +2 -4
  7. data/lib/mongoid/attributes.rb +7 -7
  8. data/lib/mongoid/attributes/processing.rb +4 -1
  9. data/lib/mongoid/attributes/readonly.rb +2 -2
  10. data/lib/mongoid/changeable.rb +4 -6
  11. data/lib/mongoid/clients.rb +142 -0
  12. data/lib/mongoid/clients/factory.rb +78 -0
  13. data/lib/mongoid/{sessions → clients}/options.rb +30 -19
  14. data/lib/mongoid/{sessions → clients}/storage_options.rb +27 -13
  15. data/lib/mongoid/{sessions → clients}/thread_options.rb +6 -3
  16. data/lib/mongoid/clients/validators.rb +2 -0
  17. data/lib/mongoid/{sessions → clients}/validators/storage.rb +5 -2
  18. data/lib/mongoid/composable.rb +3 -3
  19. data/lib/mongoid/config.rb +39 -41
  20. data/lib/mongoid/config/environment.rb +1 -1
  21. data/lib/mongoid/config/validators.rb +1 -1
  22. data/lib/mongoid/config/validators/{session.rb → client.rb} +31 -28
  23. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  24. data/lib/mongoid/contextual/atomic.rb +11 -11
  25. data/lib/mongoid/contextual/command.rb +9 -6
  26. data/lib/mongoid/contextual/geo_near.rb +17 -1
  27. data/lib/mongoid/contextual/map_reduce.rb +12 -11
  28. data/lib/mongoid/contextual/memory.rb +2 -5
  29. data/lib/mongoid/contextual/mongo.rb +92 -82
  30. data/lib/mongoid/contextual/none.rb +13 -0
  31. data/lib/mongoid/copyable.rb +6 -1
  32. data/lib/mongoid/criteria.rb +36 -3
  33. data/lib/mongoid/document.rb +3 -4
  34. data/lib/mongoid/errors.rb +6 -6
  35. data/lib/mongoid/errors/{mixed_session_configuration.rb → mixed_client_configuration.rb} +5 -5
  36. data/lib/mongoid/errors/no_client_config.rb +22 -0
  37. data/lib/mongoid/errors/{no_session_database.rb → no_client_database.rb} +4 -4
  38. data/lib/mongoid/errors/{no_session_hosts.rb → no_client_hosts.rb} +4 -4
  39. data/lib/mongoid/errors/{no_sessions_config.rb → no_clients_config.rb} +4 -4
  40. data/lib/mongoid/errors/no_default_client.rb +23 -0
  41. data/lib/mongoid/extensions/hash.rb +5 -1
  42. data/lib/mongoid/extensions/object.rb +3 -2
  43. data/lib/mongoid/extensions/set.rb +5 -5
  44. data/lib/mongoid/factory.rb +4 -2
  45. data/lib/mongoid/fields.rb +7 -2
  46. data/lib/mongoid/findable.rb +4 -1
  47. data/lib/mongoid/indexable.rb +15 -9
  48. data/lib/mongoid/persistable.rb +1 -2
  49. data/lib/mongoid/persistable/creatable.rb +2 -2
  50. data/lib/mongoid/persistable/deletable.rb +3 -3
  51. data/lib/mongoid/persistable/incrementable.rb +1 -1
  52. data/lib/mongoid/persistable/logical.rb +1 -1
  53. data/lib/mongoid/persistable/poppable.rb +1 -1
  54. data/lib/mongoid/persistable/pullable.rb +2 -2
  55. data/lib/mongoid/persistable/pushable.rb +2 -2
  56. data/lib/mongoid/persistable/renamable.rb +1 -1
  57. data/lib/mongoid/persistable/settable.rb +1 -1
  58. data/lib/mongoid/persistable/unsettable.rb +1 -1
  59. data/lib/mongoid/persistable/updatable.rb +2 -2
  60. data/lib/mongoid/persistable/upsertable.rb +1 -1
  61. data/lib/mongoid/query_cache.rb +98 -104
  62. data/lib/mongoid/railtie.rb +1 -21
  63. data/lib/mongoid/railties/database.rake +1 -1
  64. data/lib/mongoid/relations/builders.rb +3 -1
  65. data/lib/mongoid/relations/counter_cache.rb +1 -1
  66. data/lib/mongoid/relations/embedded/batchable.rb +3 -10
  67. data/lib/mongoid/relations/embedded/many.rb +4 -2
  68. data/lib/mongoid/relations/many.rb +1 -0
  69. data/lib/mongoid/relations/proxy.rb +6 -6
  70. data/lib/mongoid/relations/referenced/many.rb +2 -1
  71. data/lib/mongoid/relations/targets/enumerable.rb +11 -11
  72. data/lib/mongoid/relations/touchable.rb +1 -1
  73. data/lib/mongoid/reloadable.rb +2 -2
  74. data/lib/mongoid/scopable.rb +6 -17
  75. data/lib/mongoid/selectable.rb +1 -36
  76. data/lib/mongoid/serializable.rb +2 -2
  77. data/lib/mongoid/stateful.rb +0 -1
  78. data/lib/mongoid/tasks/database.rake +2 -2
  79. data/lib/mongoid/tasks/database.rb +23 -16
  80. data/lib/mongoid/threaded.rb +54 -33
  81. data/lib/mongoid/threaded/lifecycle.rb +21 -16
  82. data/lib/mongoid/traversable.rb +16 -1
  83. data/lib/mongoid/validatable.rb +1 -1
  84. data/lib/mongoid/validatable/queryable.rb +1 -1
  85. data/lib/mongoid/validatable/uniqueness.rb +3 -20
  86. data/lib/mongoid/version.rb +1 -1
  87. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +91 -57
  88. data/lib/rails/mongoid.rb +2 -2
  89. data/spec/app/models/audio.rb +1 -1
  90. data/spec/app/models/band.rb +1 -0
  91. data/spec/app/models/company.rb +5 -0
  92. data/spec/app/models/label.rb +7 -0
  93. data/spec/app/models/pub.rb +6 -0
  94. data/spec/app/models/staff.rb +7 -0
  95. data/spec/app/models/store_as_dup_test1.rb +5 -0
  96. data/spec/app/models/store_as_dup_test2.rb +5 -0
  97. data/spec/config/mongoid.yml +7 -25
  98. data/spec/mongoid/atomic/paths_spec.rb +3 -11
  99. data/spec/mongoid/attributes/nested_spec.rb +16 -16
  100. data/spec/mongoid/attributes/readonly_spec.rb +80 -18
  101. data/spec/mongoid/attributes_spec.rb +3 -3
  102. data/spec/mongoid/changeable_spec.rb +70 -0
  103. data/spec/mongoid/clients/factory_spec.rb +284 -0
  104. data/spec/mongoid/{sessions → clients}/options_spec.rb +4 -6
  105. data/spec/mongoid/clients_spec.rb +739 -0
  106. data/spec/mongoid/config/environment_spec.rb +14 -11
  107. data/spec/mongoid/config_spec.rb +33 -48
  108. data/spec/mongoid/contextual/atomic_spec.rb +1 -17
  109. data/spec/mongoid/contextual/geo_near_spec.rb +35 -0
  110. data/spec/mongoid/contextual/mongo_spec.rb +26 -83
  111. data/spec/mongoid/contextual/none_spec.rb +15 -0
  112. data/spec/mongoid/copyable_spec.rb +35 -1
  113. data/spec/mongoid/criteria/findable_spec.rb +197 -0
  114. data/spec/mongoid/criteria/modifiable_spec.rb +7 -29
  115. data/spec/mongoid/criteria_spec.rb +74 -91
  116. data/spec/mongoid/document_spec.rb +1 -1
  117. data/spec/mongoid/errors/{mixed_session_configuration_spec.rb → mixed_client_configuration_spec.rb} +1 -1
  118. data/spec/mongoid/errors/{no_session_config_spec.rb → no_client_config_spec.rb} +4 -4
  119. data/spec/mongoid/errors/{no_session_database_spec.rb → no_client_database_spec.rb} +4 -4
  120. data/spec/mongoid/errors/{no_session_hosts_spec.rb → no_client_hosts_spec.rb} +3 -3
  121. data/spec/mongoid/errors/{no_sessions_config_spec.rb → no_clients_config_spec.rb} +2 -2
  122. data/spec/mongoid/fields/localized_spec.rb +1 -0
  123. data/spec/mongoid/fields_spec.rb +1 -0
  124. data/spec/mongoid/findable_spec.rb +2 -23
  125. data/spec/mongoid/indexable_spec.rb +12 -8
  126. data/spec/mongoid/interceptable_spec.rb +15 -0
  127. data/spec/mongoid/persistable/settable_spec.rb +16 -0
  128. data/spec/mongoid/persistable/updatable_spec.rb +3 -2
  129. data/spec/mongoid/persistable_spec.rb +4 -4
  130. data/spec/mongoid/query_cache_spec.rb +13 -8
  131. data/spec/mongoid/relations/auto_save_spec.rb +1 -1
  132. data/spec/mongoid/relations/counter_cache_spec.rb +34 -0
  133. data/spec/mongoid/relations/eager/belongs_to_spec.rb +9 -0
  134. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +3 -3
  135. data/spec/mongoid/relations/embedded/many_spec.rb +123 -1
  136. data/spec/mongoid/relations/embedded/one_spec.rb +3 -3
  137. data/spec/mongoid/relations/proxy_spec.rb +28 -0
  138. data/spec/mongoid/relations/referenced/in_spec.rb +1 -1
  139. data/spec/mongoid/relations/referenced/many_spec.rb +47 -23
  140. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +1 -1
  141. data/spec/mongoid/relations/referenced/one_spec.rb +1 -1
  142. data/spec/mongoid/relations/targets/enumerable_spec.rb +9 -2
  143. data/spec/mongoid/reloadable_spec.rb +6 -6
  144. data/spec/mongoid/scopable_spec.rb +41 -28
  145. data/spec/mongoid/selectable_spec.rb +6 -16
  146. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  147. data/spec/mongoid/tasks/database_spec.rb +2 -2
  148. data/spec/mongoid/threaded_spec.rb +0 -7
  149. data/spec/mongoid/traversable_spec.rb +2 -2
  150. data/spec/mongoid/validatable/uniqueness_spec.rb +30 -1
  151. data/spec/mongoid_spec.rb +13 -15
  152. data/spec/rails/mongoid_spec.rb +13 -4
  153. data/spec/spec_helper.rb +44 -27
  154. data/spec/support/authorization.rb +12 -0
  155. data/spec/support/expectations.rb +14 -0
  156. metadata +52 -59
  157. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  158. data/lib/mongoid/contextual/text_search.rb +0 -178
  159. data/lib/mongoid/criteria/#findable.rb# +0 -141
  160. data/lib/mongoid/errors/no_default_session.rb +0 -23
  161. data/lib/mongoid/errors/no_session_config.rb +0 -22
  162. data/lib/mongoid/log_subscriber.rb +0 -55
  163. data/lib/mongoid/positional.rb +0 -71
  164. data/lib/mongoid/sessions.rb +0 -125
  165. data/lib/mongoid/sessions/factory.rb +0 -131
  166. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  167. data/lib/mongoid/sessions/validators.rb +0 -2
  168. data/lib/mongoid/support/query_counter.rb +0 -23
  169. data/spec/helpers.rb +0 -18
  170. data/spec/mongoid/#atomic_spec.rb# +0 -365
  171. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  172. data/spec/mongoid/contextual/text_search_spec.rb +0 -209
  173. data/spec/mongoid/log_subscriber_spec.rb +0 -75
  174. data/spec/mongoid/positional_spec.rb +0 -222
  175. data/spec/mongoid/sessions/factory_spec.rb +0 -333
  176. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  177. data/spec/mongoid/sessions_spec.rb +0 -1252
@@ -1,6 +1,4 @@
1
1
  # encoding: utf-8
2
- require "mongoid"
3
- require "mongoid/config"
4
2
  require "mongoid/railties/document"
5
3
  require "rails"
6
4
  require "rails/mongoid"
@@ -60,7 +58,7 @@ module Rails
60
58
  if config_file.file?
61
59
  begin
62
60
  ::Mongoid.load!(config_file)
63
- rescue ::Mongoid::Errors::NoSessionsConfig => e
61
+ rescue ::Mongoid::Errors::NoClientsConfig => e
64
62
  handle_configuration_error(e)
65
63
  rescue ::Mongoid::Errors::NoDefaultSession => e
66
64
  handle_configuration_error(e)
@@ -95,24 +93,6 @@ module Rails
95
93
  end
96
94
  end
97
95
 
98
- config.after_initialize do
99
- # Unicorn clears the START_CTX when a worker is forked, so if we have
100
- # data in START_CTX then we know we're being preloaded. Unicorn does
101
- # not provide application-level hooks for executing code after the
102
- # process has forked, so we reconnect lazily.
103
- if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
104
- ::Mongoid.default_session.disconnect if ::Mongoid.configured?
105
- end
106
-
107
- # Passenger provides the :starting_worker_process event for executing
108
- # code after it has forked, so we use that and reconnect immediately.
109
- if ::Mongoid::Config.running_with_passenger?
110
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
111
- ::Mongoid.default_session.disconnect if forked
112
- end
113
- end
114
- end
115
-
116
96
  # Rails runs all initializers first before getting into any generator
117
97
  # code, so we have no way in the intitializer to know if we are
118
98
  # generating a mongoid.yml. So instead of failing, we catch all the
@@ -67,7 +67,7 @@ namespace :db do
67
67
 
68
68
  namespace :mongoid do
69
69
  task :load_models do
70
- ::Rails.application.eager_load! if defined?(Rails)
70
+ ::Rails.application.eager_load! if defined?(::Rails)
71
71
  end
72
72
  end
73
73
  end
@@ -91,7 +91,9 @@ module Mongoid
91
91
  re_define_method("create_#{name}") do |*args|
92
92
  attributes, options = parse_args(*args)
93
93
  document = Factory.build(metadata.klass, attributes)
94
- doc = send("#{name}=", document)
94
+ doc = _assigning do
95
+ send("#{name}=", document)
96
+ end
95
97
  doc.save
96
98
  save if new_record? && metadata.stores_foreign_key?
97
99
  doc
@@ -116,7 +116,7 @@ module Mongoid
116
116
 
117
117
  before_destroy do
118
118
  if record = __send__(name)
119
- record[cache_column] = (record[cache_column] || 0) - 1
119
+ record[cache_column] = (record[cache_column] || 0) - 1 unless record.frozen?
120
120
 
121
121
  if record.persisted?
122
122
  record.class.decrement_counter(cache_column, record._id)
@@ -6,7 +6,6 @@ module Mongoid
6
6
  # Contains behaviour for executing operations in batch on embedded
7
7
  # documents.
8
8
  module Batchable
9
- include Positional
10
9
 
11
10
  # Insert new documents as a batch push ($pushAll). This ensures that
12
11
  # all callbacks are run at the appropriate time and only 1 request is
@@ -37,9 +36,7 @@ module Mongoid
37
36
  def batch_clear(docs)
38
37
  pre_process_batch_remove(docs, :delete)
39
38
  unless docs.empty?
40
- collection.find(selector).update(
41
- positionally(selector, "$unset" => { path => true })
42
- )
39
+ collection.find(selector).update_one("$unset" => { path => true })
43
40
  post_process_batch_remove(docs, :delete)
44
41
  end
45
42
  _unscoped.clear
@@ -57,9 +54,7 @@ module Mongoid
57
54
  def batch_remove(docs, method = :delete)
58
55
  removals = pre_process_batch_remove(docs, method)
59
56
  if !docs.empty?
60
- collection.find(selector).update(
61
- positionally(selector, "$pullAll" => { path => removals })
62
- )
57
+ collection.find(selector).update_one("$pullAll" => { path => removals })
63
58
  post_process_batch_remove(docs, method)
64
59
  end
65
60
  reindex
@@ -130,9 +125,7 @@ module Mongoid
130
125
  self.inserts_valid = true
131
126
  inserts = pre_process_batch_insert(docs)
132
127
  if insertable?
133
- collection.find(selector).update(
134
- positionally(selector, operation => { path => inserts })
135
- )
128
+ collection.find(selector).update_one(operation => { path => inserts })
136
129
  post_process_batch_insert(docs)
137
130
  end
138
131
  inserts
@@ -84,6 +84,7 @@ module Mongoid
84
84
  doc.apply_post_processed_defaults
85
85
  yield(doc) if block_given?
86
86
  doc.run_callbacks(:build) { doc }
87
+ base._reset_memoized_children!
87
88
  doc
88
89
  end
89
90
  alias :new :build
@@ -161,7 +162,7 @@ module Mongoid
161
162
  #
162
163
  # @example Delete the matching documents.
163
164
  # person.addresses.delete_if do |doc|
164
- # doc.state = "GA"
165
+ # doc.state == "GA"
165
166
  # end
166
167
  #
167
168
  # @return [ Many, Enumerator ] The relation or an enumerator if no
@@ -170,7 +171,8 @@ module Mongoid
170
171
  # @since 3.1.0
171
172
  def delete_if
172
173
  if block_given?
173
- target.each do |doc|
174
+ dup_target = target.dup
175
+ dup_target.each do |doc|
174
176
  delete(doc) if yield(doc)
175
177
  end
176
178
  self
@@ -5,6 +5,7 @@ module Mongoid
5
5
  # This is the superclass for all many to one and many to many relation
6
6
  # proxies.
7
7
  class Many < Proxy
8
+ include ::Enumerable
8
9
 
9
10
  delegate :avg, :max, :min, :sum, to: :criteria
10
11
  delegate :length, :size, to: :target
@@ -12,7 +12,7 @@ module Mongoid
12
12
  # We undefine most methods to get them sent through to the target.
13
13
  instance_methods.each do |method|
14
14
  undef_method(method) unless
15
- method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy|extend_proxies)/
15
+ method =~ /(^__|^send|^object_id|^respond_to|^tap|^public_send|extend_proxy|extend_proxies)/
16
16
  end
17
17
 
18
18
  include Threaded::Lifecycle
@@ -85,7 +85,7 @@ module Mongoid
85
85
  end
86
86
 
87
87
  # Tell the next persistance operation to store in a specific collection,
88
- # database or session.
88
+ # database or client.
89
89
  #
90
90
  # @example Save the current document to a different collection.
91
91
  # model.with(collection: "secondary").save
@@ -93,17 +93,17 @@ module Mongoid
93
93
  # @example Save the current document to a different database.
94
94
  # model.with(database: "secondary").save
95
95
  #
96
- # @example Save the current document to a different session.
97
- # model.with(session: "replica_set").save
96
+ # @example Save the current document to a different client.
97
+ # model.with(client: "replica_set").save
98
98
  #
99
99
  # @example Save with a combination of options.
100
- # model.with(session: "sharded", database: "secondary").save
100
+ # model.with(client: "sharded", database: "secondary").save
101
101
  #
102
102
  # @param [ Hash ] options The storage options.
103
103
  #
104
104
  # @option options [ String, Symbol ] :collection The collection name.
105
105
  # @option options [ String, Symbol ] :database The database name.
106
- # @option options [ String, Symbol ] :session The session name.
106
+ # @option options [ String, Symbol ] :client The client name.
107
107
  #
108
108
  # @return [ Document ] The current document.
109
109
  #
@@ -320,6 +320,7 @@ module Mongoid
320
320
  #
321
321
  # @since 2.0.0.rc.1
322
322
  def append(document)
323
+ # @todo: remove?
323
324
  document.with(@persistence_options) if @persistence_options
324
325
 
325
326
  execute_callback :before_add, document
@@ -428,7 +429,7 @@ module Mongoid
428
429
  # @since 3.0.0
429
430
  def persist_delayed(docs, inserts)
430
431
  unless docs.empty?
431
- collection.insert(inserts)
432
+ collection.insert_many(inserts)
432
433
  docs.each do |doc|
433
434
  doc.new_record = false
434
435
  doc.run_after_callbacks(:create, :save)
@@ -45,7 +45,7 @@ module Mongoid
45
45
  #
46
46
  # @since 3.1.4
47
47
  def ===(other)
48
- other.class == Class ? Array == other : self == other
48
+ other.class == Class ? (Array == other || Enumerable == other) : self == other
49
49
  end
50
50
 
51
51
  # Append a document to the enumerable.
@@ -175,7 +175,8 @@ module Mongoid
175
175
  end
176
176
  if _loaded?
177
177
  _loaded.each_pair do |id, doc|
178
- yield(doc)
178
+ document = _added.delete(doc._id) || doc
179
+ yield(document)
179
180
  end
180
181
  else
181
182
  unloaded_documents.each do |doc|
@@ -217,7 +218,10 @@ module Mongoid
217
218
  #
218
219
  # @since 2.1.0
219
220
  def first
220
- matching_document(:first)
221
+ _loaded.try(:values).try(:first) ||
222
+ _added[(ul = _unloaded.try(:first)).try(:id)] ||
223
+ ul ||
224
+ _added.values.try(:first)
221
225
  end
222
226
 
223
227
  # Initialize the new enumerable either with a criteria or an array.
@@ -298,7 +302,10 @@ module Mongoid
298
302
  #
299
303
  # @since 2.1.0
300
304
  def last
301
- matching_document(:last)
305
+ _added.values.try(:last) ||
306
+ _loaded.try(:values).try(:last) ||
307
+ _added[(ul = _unloaded.try(:last)).try(:id)] ||
308
+ ul
302
309
  end
303
310
 
304
311
  # Loads all the documents in the enumerable from the database.
@@ -457,13 +464,6 @@ module Mongoid
457
464
  entries.send(name, *args, &block)
458
465
  end
459
466
 
460
- def matching_document(location)
461
- _loaded.try(:values).try(location) ||
462
- _added[(ul = _unloaded.try(location)).try(:id)] ||
463
- ul ||
464
- _added.values.try(location)
465
- end
466
-
467
467
  def unloaded_documents
468
468
  _unloaded.selector.values.any?(&:blank_criteria?) ? [] : _unloaded
469
469
  end
@@ -31,7 +31,7 @@ module Mongoid
31
31
  touches = touch_atomic_updates(field)
32
32
  unless touches.empty?
33
33
  selector = atomic_selector
34
- _root.collection.where(selector).update(positionally(selector, touches))
34
+ _root.collection.find(selector).update_one(touches)
35
35
  end
36
36
  run_callbacks(:touch)
37
37
  true
@@ -57,7 +57,7 @@ module Mongoid
57
57
  #
58
58
  # @since 2.3.2
59
59
  def reload_root_document
60
- {}.merge(with(read: :primary).collection.find(_id: _id).one || {})
60
+ {}.merge(collection.find(_id: _id).read(mode: :primary).first || {})
61
61
  end
62
62
 
63
63
  # Reload the embedded document.
@@ -70,7 +70,7 @@ module Mongoid
70
70
  # @since 2.3.2
71
71
  def reload_embedded_document
72
72
  extract_embedded_attributes({}.merge(
73
- _root.with(read: :primary).collection.find(_id: _root._id).one
73
+ _root.collection.find(_id: _root._id).read(mode: :primary).first
74
74
  ))
75
75
  end
76
76
 
@@ -31,7 +31,7 @@ module Mongoid
31
31
  def apply_default_scoping
32
32
  if default_scoping
33
33
  default_scoping.call.selector.each do |field, value|
34
- attributes[field] = value unless value.respond_to?(:each_pair)
34
+ attributes[field] = value unless value.respond_to?(:each)
35
35
  end
36
36
  end
37
37
  end
@@ -115,7 +115,7 @@ module Mongoid
115
115
  #
116
116
  # @since 3.0.0
117
117
  def queryable
118
- scope_stack.last || Criteria.new(self)
118
+ Threaded.current_scope || Criteria.new(self)
119
119
  end
120
120
 
121
121
  # Create a scope that can be accessed from the class level or chained to
@@ -150,18 +150,6 @@ module Mongoid
150
150
  define_scope_method(normalized)
151
151
  end
152
152
 
153
- # Initializes and returns the current scope stack.
154
- #
155
- # @example Get the scope stack.
156
- # Person.scope_stack
157
- #
158
- # @return [ Array<Criteria> ] The scope stack.
159
- #
160
- # @since 1.0.0
161
- def scope_stack
162
- Threaded.scope_stack[object_id] ||= []
163
- end
164
-
165
153
  # Get a criteria for the document with normal scoping.
166
154
  #
167
155
  # @example Get the criteria.
@@ -234,11 +222,11 @@ module Mongoid
234
222
  #
235
223
  # @since 1.0.0
236
224
  def with_scope(criteria)
237
- scope_stack.push(criteria)
225
+ Threaded.current_scope = criteria
238
226
  begin
239
227
  yield criteria
240
228
  ensure
241
- scope_stack.pop
229
+ Threaded.current_scope = nil
242
230
  end
243
231
  end
244
232
 
@@ -325,7 +313,8 @@ module Mongoid
325
313
  singleton_class.class_eval do
326
314
  define_method name do |*args|
327
315
  scoping = _declared_scopes[name]
328
- scope, extension = scoping[:scope][*args], scoping[:extension]
316
+ scope = instance_exec(*args, &scoping[:scope])
317
+ extension = scoping[:extension]
329
318
  criteria = with_default_scope.merge(scope || queryable)
330
319
  criteria.extend(extension)
331
320
  criteria
@@ -18,42 +18,7 @@ module Mongoid
18
18
  #
19
19
  # @since 1.0.0
20
20
  def atomic_selector
21
- @atomic_selector ||=
22
- (embedded? ? embedded_atomic_selector : root_atomic_selector)
23
- end
24
-
25
- private
26
-
27
- # Get the atomic selector for an embedded document.
28
- #
29
- # @api private
30
- #
31
- # @example Get the embedded atomic selector.
32
- # document.embedded_atomic_selector
33
- #
34
- # @return [ Hash ] The embedded document selector.
35
- #
36
- # @since 4.0.0
37
- def embedded_atomic_selector
38
- if persisted? && _id_changed?
39
- _parent.atomic_selector
40
- else
41
- _parent.atomic_selector.merge("#{atomic_path}._id" => _id)
42
- end
43
- end
44
-
45
- # Get the atomic selector for a root document.
46
- #
47
- # @api private
48
- #
49
- # @example Get the root atomic selector.
50
- # document.root_atomic_selector
51
- #
52
- # @return [ Hash ] The root document selector.
53
- #
54
- # @since 4.0.0
55
- def root_atomic_selector
56
- { "_id" => _id }.merge!(shard_key_selector)
21
+ @atomic_selector ||= { "_id" => _root._id }.merge!(shard_key_selector)
57
22
  end
58
23
  end
59
24
  end
@@ -97,10 +97,10 @@ module Mongoid
97
97
  #
98
98
  # @since 3.0.0
99
99
  def serialize_attribute(attrs, name, names, options)
100
- if relations.has_key?(name)
100
+ if relations.key?(name)
101
101
  value = send(name)
102
102
  attrs[name] = value ? value.serializable_hash(options) : nil
103
- elsif names.include?(name) && !fields.has_key?(name)
103
+ elsif names.include?(name) && !fields.key?(name)
104
104
  attrs[name] = read_attribute(name)
105
105
  elsif !attribute_missing?(name)
106
106
  attrs[name] = send(name)
@@ -55,7 +55,6 @@ module Mongoid
55
55
  def destroyed?
56
56
  @destroyed ||= false
57
57
  end
58
- alias :deleted? :destroyed?
59
58
 
60
59
  # Determine if the document can be pushed.
61
60
  #
@@ -18,9 +18,9 @@ namespace :db do
18
18
  ::Mongoid::Tasks::Database.remove_indexes
19
19
  end
20
20
 
21
- desc "Drops the default session"
21
+ desc "Drops the default client database"
22
22
  task :drop => :environment do
23
- ::Mongoid::Sessions.default.drop
23
+ ::Mongoid::Clients.default.database.drop
24
24
  end
25
25
 
26
26
  desc "Drop all collections except the system collections"
@@ -42,18 +42,20 @@ module Mongoid
42
42
 
43
43
  models.each do |model|
44
44
  unless model.embedded?
45
- model.collection.indexes.each do |index|
46
- # ignore default index
47
- unless index['name'] == '_id_'
48
- key = index['key'].symbolize_keys
49
- spec = model.index_specification(key)
50
- unless spec
51
- # index not specified
52
- undefined_by_model[model] ||= []
53
- undefined_by_model[model] << index
45
+ begin
46
+ model.collection.indexes.each do |index|
47
+ # ignore default index
48
+ unless index['name'] == '_id_'
49
+ key = index['key'].symbolize_keys
50
+ spec = model.index_specification(key)
51
+ unless spec
52
+ # index not specified
53
+ undefined_by_model[model] ||= []
54
+ undefined_by_model[model] << index
55
+ end
54
56
  end
55
57
  end
56
- end
58
+ rescue Mongo::Error::OperationFailure; end
57
59
  end
58
60
  end
59
61
 
@@ -73,8 +75,12 @@ module Mongoid
73
75
  undefined_indexes(models).each do |model, indexes|
74
76
  indexes.each do |index|
75
77
  key = index['key'].symbolize_keys
76
- model.collection.indexes.drop(key)
77
- logger.info("MONGOID: Removing index: #{index['name']} on #{model}.")
78
+ collection = model.collection
79
+ collection.indexes.drop_one(key)
80
+ logger.info(
81
+ "MONGOID: Removed index '#{index['name']}' on collection " +
82
+ "'#{collection.name}' in database '#{collection.database.name}'."
83
+ )
78
84
  end
79
85
  end
80
86
  end
@@ -90,10 +96,11 @@ module Mongoid
90
96
  def remove_indexes(models = ::Mongoid.models)
91
97
  models.each do |model|
92
98
  next if model.embedded?
93
- indexes = model.collection.indexes.map{ |doc| doc["name"] }
94
- indexes.delete_one("_id_")
95
- model.remove_indexes
96
- logger.info("MONGOID: Removing indexes on: #{model} for: #{indexes.join(', ')}.")
99
+ begin
100
+ model.remove_indexes
101
+ rescue Mongo::Error::OperationFailure
102
+ next
103
+ end
97
104
  model
98
105
  end.compact
99
106
  end