mongoid 5.4.1 → 6.0.0.beta
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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/config/locales/en.yml +23 -16
- data/lib/mongoid.rb +4 -9
- data/lib/mongoid/atomic.rb +1 -1
- data/lib/mongoid/atomic/modifiers.rb +8 -12
- data/lib/mongoid/attributes.rb +9 -11
- data/lib/mongoid/attributes/dynamic.rb +5 -6
- data/lib/mongoid/attributes/nested.rb +1 -1
- data/lib/mongoid/attributes/processing.rb +4 -0
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +37 -1
- data/lib/mongoid/clients.rb +0 -63
- data/lib/mongoid/clients/factory.rb +0 -2
- data/lib/mongoid/clients/options.rb +54 -249
- data/lib/mongoid/clients/storage_options.rb +1 -69
- data/lib/mongoid/composable.rb +26 -2
- data/lib/mongoid/config.rb +1 -1
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -0
- data/lib/mongoid/contextual/atomic.rb +6 -9
- data/lib/mongoid/contextual/geo_near.rb +2 -3
- data/lib/mongoid/contextual/map_reduce.rb +97 -24
- data/lib/mongoid/contextual/memory.rb +7 -4
- data/lib/mongoid/contextual/mongo.rb +63 -54
- data/lib/mongoid/contextual/none.rb +2 -2
- data/lib/mongoid/copyable.rb +19 -19
- data/lib/mongoid/criteria.rb +5 -4
- data/lib/mongoid/criteria/findable.rb +2 -3
- data/lib/mongoid/criteria/includable.rb +63 -16
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +17 -1
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable.rb +86 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +45 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +271 -0
- data/lib/mongoid/criteria/queryable/optional.rb +411 -0
- data/lib/mongoid/criteria/queryable/options.rb +136 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +662 -0
- data/lib/mongoid/criteria/queryable/selector.rb +196 -0
- data/lib/mongoid/criteria/queryable/smash.rb +103 -0
- data/lib/mongoid/document.rb +9 -23
- data/lib/mongoid/errors.rb +2 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/delete_restriction.rb +2 -2
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/inverse_not_found.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions.rb +0 -5
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/hash.rb +2 -3
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/string.rb +4 -3
- data/lib/mongoid/extensions/time.rb +5 -2
- data/lib/mongoid/factory.rb +1 -0
- data/lib/mongoid/fields/foreign_key.rb +2 -2
- data/lib/mongoid/fields/localized.rb +3 -8
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +3 -3
- data/lib/mongoid/indexable.rb +17 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +1 -2
- data/lib/mongoid/interceptable.rb +6 -17
- data/lib/mongoid/loggable.rb +1 -1
- data/lib/mongoid/matchable.rb +3 -10
- data/lib/mongoid/matchable/gt.rb +2 -0
- data/lib/mongoid/matchable/gte.rb +2 -0
- data/lib/mongoid/matchable/lt.rb +2 -0
- data/lib/mongoid/matchable/lte.rb +2 -0
- data/lib/mongoid/persistable.rb +6 -5
- data/lib/mongoid/persistable/creatable.rb +2 -0
- data/lib/mongoid/persistable/deletable.rb +7 -3
- data/lib/mongoid/persistable/settable.rb +3 -16
- data/lib/mongoid/persistable/updatable.rb +10 -12
- data/lib/mongoid/persistence_context.rb +216 -0
- data/lib/mongoid/query_cache.rb +5 -30
- data/lib/mongoid/relations/accessors.rb +6 -2
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/embedded/in.rb +4 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +8 -1
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +4 -0
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +28 -18
- data/lib/mongoid/relations/eager.rb +19 -7
- data/lib/mongoid/relations/eager/base.rb +5 -5
- data/lib/mongoid/relations/embedded/batchable.rb +9 -33
- data/lib/mongoid/relations/embedded/in.rb +16 -2
- data/lib/mongoid/relations/embedded/many.rb +23 -8
- data/lib/mongoid/relations/embedded/one.rb +17 -2
- data/lib/mongoid/relations/macros.rb +9 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/nested_builder.rb +1 -1
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +2 -33
- data/lib/mongoid/relations/referenced/in.rb +23 -11
- data/lib/mongoid/relations/referenced/many.rb +24 -16
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +17 -1
- data/lib/mongoid/relations/reflections.rb +3 -5
- data/lib/mongoid/relations/touchable.rb +1 -1
- data/lib/mongoid/reloadable.rb +1 -1
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +2 -3
- data/lib/mongoid/tasks/database.rb +1 -2
- data/lib/mongoid/threaded.rb +4 -4
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +2 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -7
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +0 -1
- data/spec/app/models/church.rb +0 -2
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/person.rb +3 -1
- data/spec/app/models/post.rb +0 -1
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +1 -5
- data/spec/mongoid/atomic/modifiers_spec.rb +17 -17
- data/spec/mongoid/atomic_spec.rb +17 -17
- data/spec/mongoid/attributes/nested_spec.rb +14 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +63 -0
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +3 -11
- data/spec/mongoid/clients/options_spec.rb +378 -96
- data/spec/mongoid/clients_spec.rb +207 -170
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +41 -21
- data/spec/mongoid/contextual/atomic_spec.rb +77 -343
- data/spec/mongoid/contextual/map_reduce_spec.rb +119 -111
- data/spec/mongoid/contextual/memory_spec.rb +56 -316
- data/spec/mongoid/contextual/mongo_spec.rb +104 -378
- data/spec/mongoid/copyable_spec.rb +8 -15
- data/spec/mongoid/criteria/modifiable_spec.rb +239 -7
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin/regexp_raw_spec.rb → criteria/queryable/extensions/regexp_spec.rb} +21 -20
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1786 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4159 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +778 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria_spec.rb +45 -63
- data/spec/mongoid/document_spec.rb +21 -88
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +320 -18
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/string_spec.rb +21 -0
- data/spec/mongoid/extensions/time_spec.rb +4 -8
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/fields/localized_spec.rb +0 -91
- data/spec/mongoid/findable_spec.rb +46 -1
- data/spec/mongoid/indexable_spec.rb +6 -46
- data/spec/mongoid/interceptable_spec.rb +49 -10
- data/spec/mongoid/matchable/gt_spec.rb +11 -0
- data/spec/mongoid/matchable/gte_spec.rb +10 -0
- data/spec/mongoid/matchable/lt_spec.rb +11 -0
- data/spec/mongoid/matchable/lte_spec.rb +11 -0
- data/spec/mongoid/matchable_spec.rb +1 -51
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +1 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +6 -2
- data/spec/mongoid/persistable/savable_spec.rb +30 -30
- data/spec/mongoid/persistable/settable_spec.rb +0 -185
- data/spec/mongoid/persistable/updatable_spec.rb +166 -5
- data/spec/mongoid/persistence_context_spec.rb +654 -0
- data/spec/mongoid/positional_spec.rb +10 -10
- data/spec/mongoid/query_cache_spec.rb +89 -65
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -15
- data/spec/mongoid/relations/cyclic_spec.rb +0 -22
- data/spec/mongoid/relations/embedded/many_spec.rb +9 -41
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +395 -7
- data/spec/mongoid/relations/proxy_spec.rb +3 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +6 -29
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +6 -29
- data/spec/mongoid/relations/reflections_spec.rb +9 -9
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +0 -12
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +16 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/spec_helper.rb +10 -10
- metadata +536 -479
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -20
- data/lib/mongoid/extensions/decimal128.rb +0 -39
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/spec/app/models/post_genre.rb +0 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +0 -44
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
data/lib/mongoid/matchable/gt.rb
CHANGED
data/lib/mongoid/matchable/lt.rb
CHANGED
data/lib/mongoid/persistable.rb
CHANGED
@@ -69,6 +69,8 @@ module Mongoid
|
|
69
69
|
# @example Raise the validation error.
|
70
70
|
# Person.fail_due_to_validation!(person)
|
71
71
|
#
|
72
|
+
# @param [ Document ] document The document to fail.
|
73
|
+
#
|
72
74
|
# @raise [ Errors::Validations ] The validation error.
|
73
75
|
#
|
74
76
|
# @since 4.0.0
|
@@ -81,6 +83,7 @@ module Mongoid
|
|
81
83
|
# @example Raise the callback error.
|
82
84
|
# Person.fail_due_to_callback!(person, :create!)
|
83
85
|
#
|
86
|
+
# @param [ Document ] document The document to fail.
|
84
87
|
# @param [ Symbol ] method The method being called.
|
85
88
|
#
|
86
89
|
# @raise [ Errors::Callback ] The callback error.
|
@@ -162,12 +165,10 @@ module Mongoid
|
|
162
165
|
# @since 4.0.0
|
163
166
|
def process_atomic_operations(operations)
|
164
167
|
operations.each do |field, value|
|
165
|
-
|
166
|
-
|
168
|
+
as_writable_attribute!(field, value) do |access|
|
169
|
+
yield(access, value)
|
170
|
+
remove_change(access)
|
167
171
|
end
|
168
|
-
normalized = database_field_name(field)
|
169
|
-
yield(normalized, value)
|
170
|
-
remove_change(normalized)
|
171
172
|
end
|
172
173
|
end
|
173
174
|
|
@@ -165,6 +165,8 @@ module Mongoid
|
|
165
165
|
#
|
166
166
|
# @param [ Hash, Array ] attributes The attributes to create with, or an
|
167
167
|
# Array of multiple attributes for multiple documents.
|
168
|
+
# @param [ Hash ] options A mass-assignment protection options. Supports
|
169
|
+
# :as and :without_protection
|
168
170
|
#
|
169
171
|
# @return [ Document, Array<Document> ] The newly created document(s).
|
170
172
|
#
|
@@ -135,9 +135,13 @@ module Mongoid
|
|
135
135
|
# @return [ Integer ] The number of documents deleted.
|
136
136
|
#
|
137
137
|
# @since 1.0.0
|
138
|
-
def delete_all(conditions =
|
139
|
-
selector =
|
140
|
-
|
138
|
+
def delete_all(conditions = nil)
|
139
|
+
selector = conditions || {}
|
140
|
+
selector.merge!(_type: name) if hereditary?
|
141
|
+
coll = collection
|
142
|
+
deleted = coll.find(selector).count
|
143
|
+
coll.find(selector).delete_many
|
144
|
+
deleted
|
141
145
|
end
|
142
146
|
end
|
143
147
|
end
|
@@ -22,23 +22,10 @@ module Mongoid
|
|
22
22
|
def set(setters)
|
23
23
|
prepare_atomic_operation do |ops|
|
24
24
|
process_atomic_operations(setters) do |field, value|
|
25
|
-
|
26
|
-
|
27
|
-
field = field_and_value_hash.keys.first.to_s
|
28
|
-
|
29
|
-
if fields[field] && fields[field].type == Hash && attributes.key?(field)
|
30
|
-
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
|
31
|
-
value = attributes[field].merge(field_and_value_hash[field], &merger)
|
32
|
-
process_attribute(field.to_s, value)
|
33
|
-
else
|
34
|
-
process_attribute(field.to_s, field_and_value_hash[field])
|
35
|
-
end
|
36
|
-
|
37
|
-
unless relations.include?(field.to_s)
|
38
|
-
ops[atomic_attribute_name(field)] = attributes[field]
|
39
|
-
end
|
25
|
+
process_attribute(field.to_s, value)
|
26
|
+
ops[atomic_attribute_name(field)] = attributes[field]
|
40
27
|
end
|
41
|
-
{ "$set" => ops }
|
28
|
+
{ "$set" => ops }
|
42
29
|
end
|
43
30
|
end
|
44
31
|
end
|
@@ -24,17 +24,16 @@ module Mongoid
|
|
24
24
|
#
|
25
25
|
# @since 2.0.0
|
26
26
|
def update_attribute(name, value)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
as_writable_attribute!(name, value) do |access|
|
28
|
+
normalized = name.to_s
|
29
|
+
setter = "#{normalized}="
|
30
|
+
if respond_to?(setter)
|
31
|
+
send(setter, value)
|
32
|
+
else
|
33
|
+
write_attribute(access, value)
|
34
|
+
end
|
35
|
+
save(validate: false)
|
36
36
|
end
|
37
|
-
save(validate: false)
|
38
37
|
end
|
39
38
|
|
40
39
|
# Update the document attributes in the database.
|
@@ -135,11 +134,10 @@ module Mongoid
|
|
135
134
|
#
|
136
135
|
# @since 1.0.0
|
137
136
|
def update_document(options = {})
|
138
|
-
raise Errors::ReadonlyDocument.new(self.class) if readonly?
|
139
137
|
prepare_update(options) do
|
140
138
|
updates, conflicts = init_atomic_updates
|
141
139
|
unless updates.empty?
|
142
|
-
coll = _root
|
140
|
+
coll = collection(_root)
|
143
141
|
selector = atomic_selector
|
144
142
|
coll.find(selector).update_one(positionally(selector, updates))
|
145
143
|
conflicts.each_pair do |key, value|
|
@@ -0,0 +1,216 @@
|
|
1
|
+
module Mongoid
|
2
|
+
|
3
|
+
# Object encapsulating logic for setting/getting a collection and database name
|
4
|
+
# and a client with particular options to use when persisting models.
|
5
|
+
#
|
6
|
+
# @since 6.0.0
|
7
|
+
class PersistenceContext
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
# Delegate the cluster method to the client.
|
11
|
+
def_delegators :client, :cluster
|
12
|
+
|
13
|
+
# Delegate the storage options method to the object.
|
14
|
+
def_delegators :@object, :storage_options
|
15
|
+
|
16
|
+
# The options defining this persistence context.
|
17
|
+
#
|
18
|
+
# @return [ Hash ] The persistence context options.
|
19
|
+
#
|
20
|
+
# @since 6.0.0
|
21
|
+
attr_reader :options
|
22
|
+
|
23
|
+
# Extra options in addition to driver client options that determine the
|
24
|
+
# persistence context.
|
25
|
+
#
|
26
|
+
# @return [ Array<Symbol> ] The list of extra options besides client options
|
27
|
+
# that determine the persistence context.
|
28
|
+
#
|
29
|
+
# @since 6.0.0
|
30
|
+
EXTRA_OPTIONS = [ :client,
|
31
|
+
:collection
|
32
|
+
].freeze
|
33
|
+
|
34
|
+
# The full list of valid persistence context options.
|
35
|
+
#
|
36
|
+
# @return [ Array<Symbol> ] The full list of options defining the persistence
|
37
|
+
# context.
|
38
|
+
#
|
39
|
+
# @since 6.0.0
|
40
|
+
VALID_OPTIONS = ( Mongo::Client::VALID_OPTIONS + EXTRA_OPTIONS ).freeze
|
41
|
+
|
42
|
+
# Initialize the persistence context object.
|
43
|
+
#
|
44
|
+
# @example Create a new persistence context.
|
45
|
+
# PersistenceContext.new(model, collection: 'other')
|
46
|
+
#
|
47
|
+
# @param [ Object ] parent The class or model instance for which a persistence context
|
48
|
+
# should be created.
|
49
|
+
# @param [ Hash ] opts The persistence context options.
|
50
|
+
#
|
51
|
+
# @since 6.0.0
|
52
|
+
def initialize(object, opts = {})
|
53
|
+
@object = object
|
54
|
+
set_options!(opts)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Get the collection for this persistence context.
|
58
|
+
#
|
59
|
+
# @example Get the collection for this persistence context.
|
60
|
+
# context.collection
|
61
|
+
#
|
62
|
+
# @param [ Object ] parent The parent object whose collection name is used
|
63
|
+
# instead of this persistence context's collection name.
|
64
|
+
#
|
65
|
+
# @return [ Mongo::Collection ] The collection for this persistence
|
66
|
+
# context.
|
67
|
+
#
|
68
|
+
# @since 6.0.0
|
69
|
+
def collection(parent = nil)
|
70
|
+
name = parent ? parent.collection_name : collection_name
|
71
|
+
client[name.to_sym]
|
72
|
+
end
|
73
|
+
|
74
|
+
# Get the collection name for this persistence context.
|
75
|
+
#
|
76
|
+
# @example Get the collection name for this persistence context.
|
77
|
+
# context.collection_name
|
78
|
+
#
|
79
|
+
# @return [ String ] The collection name for this persistence
|
80
|
+
# context.
|
81
|
+
#
|
82
|
+
# @since 6.0.0
|
83
|
+
def collection_name
|
84
|
+
@collection_name ||= (__evaluate__(options[:collection] ||
|
85
|
+
storage_options[:collection]))
|
86
|
+
end
|
87
|
+
|
88
|
+
# Get the database name for this persistence context.
|
89
|
+
#
|
90
|
+
# @example Get the database name for this persistence context.
|
91
|
+
# context.database_name
|
92
|
+
#
|
93
|
+
# @return [ String ] The database name for this persistence
|
94
|
+
# context.
|
95
|
+
#
|
96
|
+
# @since 6.0.0
|
97
|
+
def database_name
|
98
|
+
__evaluate__(database_name_option) || client.database.name
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get the client for this persistence context.
|
102
|
+
#
|
103
|
+
# @example Get the client for this persistence context.
|
104
|
+
# context.client
|
105
|
+
#
|
106
|
+
# @return [ Mongo::Client ] The client for this persistence
|
107
|
+
# context.
|
108
|
+
#
|
109
|
+
# @since 6.0.0
|
110
|
+
def client
|
111
|
+
@client ||= (client = Clients.with_name(client_name)
|
112
|
+
client = client.use(database_name) if database_name_option
|
113
|
+
client.with(client_options))
|
114
|
+
end
|
115
|
+
|
116
|
+
# Determine if this persistence context is equal to another.
|
117
|
+
#
|
118
|
+
# @example Compare two persistence contexts.
|
119
|
+
# context == other_context
|
120
|
+
#
|
121
|
+
# @param [ Object ] other The object to be compared with this one.
|
122
|
+
#
|
123
|
+
# @return [ true, false ] Whether the two persistence contexts are equal.
|
124
|
+
#
|
125
|
+
# @since 6.0.0
|
126
|
+
def ==(other)
|
127
|
+
return false unless other.is_a?(PersistenceContext)
|
128
|
+
options == other.options
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def client_name
|
134
|
+
@client_name ||= options[:client] ||
|
135
|
+
Threaded.client_override ||
|
136
|
+
storage_options && __evaluate__(storage_options[:client])
|
137
|
+
end
|
138
|
+
|
139
|
+
def set_options!(opts)
|
140
|
+
@options ||= opts.each.reduce({}) do |_options, (key, value)|
|
141
|
+
unless VALID_OPTIONS.include?(key.to_sym)
|
142
|
+
raise Errors::InvalidPersistenceOption.new(key.to_sym, VALID_OPTIONS)
|
143
|
+
end
|
144
|
+
value ? _options.merge!(key => value) : _options
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def __evaluate__(name)
|
149
|
+
return nil unless name
|
150
|
+
name.respond_to?(:call) ? name.call.to_sym : name.to_sym
|
151
|
+
end
|
152
|
+
|
153
|
+
def client_options
|
154
|
+
@client_options ||= options.select do |k, v|
|
155
|
+
Mongo::Client::VALID_OPTIONS.include?(k.to_sym)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def database_name_option
|
160
|
+
@database_name_option ||= options[:database] ||
|
161
|
+
Threaded.database_override ||
|
162
|
+
storage_options && storage_options[:database]
|
163
|
+
end
|
164
|
+
|
165
|
+
class << self
|
166
|
+
|
167
|
+
# Set the persistence context for a particular class or model instance.
|
168
|
+
#
|
169
|
+
# @example Set the persistence context for a class or model instance.
|
170
|
+
# PersistenceContext.set(model)
|
171
|
+
#
|
172
|
+
# @param [ Object ] object The class or model instance.
|
173
|
+
# @param [ Hash, Mongoid::PersistenceContext ] options_or_context The persistence
|
174
|
+
# options or a persistence context object.
|
175
|
+
#
|
176
|
+
# @return [ Mongoid::PersistenceContext ] The persistence context for the object.
|
177
|
+
#
|
178
|
+
# @since 6.0.0
|
179
|
+
def set(object, options_or_context)
|
180
|
+
context = PersistenceContext.new(object, options_or_context.is_a?(PersistenceContext) ?
|
181
|
+
options_or_context.options : options_or_context)
|
182
|
+
Thread.current["[mongoid][#{object.object_id}]:context"] = context
|
183
|
+
end
|
184
|
+
|
185
|
+
# Get the persistence context for a particular class or model instance.
|
186
|
+
#
|
187
|
+
# @example Get the persistence context for a class or model instance.
|
188
|
+
# PersistenceContext.get(model)
|
189
|
+
#
|
190
|
+
# @param [ Object ] object The class or model instance.
|
191
|
+
#
|
192
|
+
# @return [ Mongoid::PersistenceContext ] The persistence context for the object.
|
193
|
+
#
|
194
|
+
# @since 6.0.0
|
195
|
+
def get(object)
|
196
|
+
Thread.current["[mongoid][#{object.object_id}]:context"]
|
197
|
+
end
|
198
|
+
|
199
|
+
# Get the persistence context for a particular class or model instance.
|
200
|
+
#
|
201
|
+
# @example Get the persistence context for a class or model instance.
|
202
|
+
# PersistenceContext.get(model)
|
203
|
+
#
|
204
|
+
# @param [ Class, Object ] object The class or model instance.
|
205
|
+
# @param [ Mongo::Cluster ] cluster The original cluster before this context was used.
|
206
|
+
#
|
207
|
+
# @since 6.0.0
|
208
|
+
def clear(object, cluster = nil)
|
209
|
+
if context = get(object)
|
210
|
+
context.client.close unless (context.cluster.equal?(cluster) || cluster.nil?)
|
211
|
+
end
|
212
|
+
Thread.current["[mongoid][#{object.object_id}]:context"] = nil
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
data/lib/mongoid/query_cache.rb
CHANGED
@@ -70,20 +70,6 @@ module Mongoid
|
|
70
70
|
ensure
|
71
71
|
QueryCache.enabled = enabled
|
72
72
|
end
|
73
|
-
|
74
|
-
# Execute the block with the query cache disabled.
|
75
|
-
#
|
76
|
-
# @example Execute without the cache.
|
77
|
-
# QueryCache.uncached { collection.find }
|
78
|
-
#
|
79
|
-
# @return [ Object ] The result of the block.
|
80
|
-
def uncached
|
81
|
-
enabled = QueryCache.enabled?
|
82
|
-
QueryCache.enabled = false
|
83
|
-
yield
|
84
|
-
ensure
|
85
|
-
QueryCache.enabled = enabled
|
86
|
-
end
|
87
73
|
end
|
88
74
|
|
89
75
|
# The middleware to be added to a rack application in order to activate the
|
@@ -183,7 +169,8 @@ module Mongoid
|
|
183
169
|
end
|
184
170
|
CODE
|
185
171
|
|
186
|
-
|
172
|
+
alias_method "#{method_name}_without_clear_cache", method_name
|
173
|
+
alias_method method_name, "#{method_name}_with_clear_cache"
|
187
174
|
end
|
188
175
|
end
|
189
176
|
end
|
@@ -221,7 +208,7 @@ module Mongoid
|
|
221
208
|
super
|
222
209
|
else
|
223
210
|
unless cursor = cached_cursor
|
224
|
-
server =
|
211
|
+
server = read.select_server(cluster)
|
225
212
|
cursor = CachedCursor.new(view, send_initial_query(server), server)
|
226
213
|
QueryCache.cache_table[cache_key] = cursor
|
227
214
|
end
|
@@ -234,13 +221,9 @@ module Mongoid
|
|
234
221
|
|
235
222
|
private
|
236
223
|
|
237
|
-
def read_or_server_selector
|
238
|
-
respond_to?(:server_selector, true) ? server_selector : read
|
239
|
-
end
|
240
|
-
|
241
224
|
def cached_cursor
|
242
225
|
if limit
|
243
|
-
key = [ collection.namespace, selector, nil, skip, sort, projection
|
226
|
+
key = [ collection.namespace, selector, nil, skip, sort, projection ]
|
244
227
|
cursor = QueryCache.cache_table[key]
|
245
228
|
if cursor
|
246
229
|
limited_docs = cursor.to_a[0...limit.abs]
|
@@ -251,7 +234,7 @@ module Mongoid
|
|
251
234
|
end
|
252
235
|
|
253
236
|
def cache_key
|
254
|
-
[ collection.namespace, selector, limit, skip, sort, projection
|
237
|
+
[ collection.namespace, selector, limit, skip, sort, projection ]
|
255
238
|
end
|
256
239
|
|
257
240
|
def system_collection?
|
@@ -270,16 +253,8 @@ module Mongoid
|
|
270
253
|
alias_query_cache_clear :insert_one, :insert_many
|
271
254
|
end
|
272
255
|
end
|
273
|
-
|
274
|
-
# Bypass the query cache when reloading a document.
|
275
|
-
module Document
|
276
|
-
def reload
|
277
|
-
QueryCache.uncached { super }
|
278
|
-
end
|
279
|
-
end
|
280
256
|
end
|
281
257
|
end
|
282
258
|
|
283
259
|
Mongo::Collection.__send__(:include, Mongoid::QueryCache::Collection)
|
284
260
|
Mongo::Collection::View.__send__(:include, Mongoid::QueryCache::View)
|
285
|
-
Mongoid::Document.__send__(:include, Mongoid::QueryCache::Document)
|