mongoid 7.2.0 → 7.3.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Rakefile +16 -0
- data/lib/config/locales/en.yml +2 -2
- data/lib/mongoid/association/accessors.rb +1 -1
- data/lib/mongoid/association/constrainable.rb +1 -1
- data/lib/mongoid/association/depending.rb +4 -4
- data/lib/mongoid/association/embedded/batchable.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +10 -3
- data/lib/mongoid/association/nested/many.rb +1 -1
- data/lib/mongoid/association/nested/one.rb +4 -2
- data/lib/mongoid/association/proxy.rb +6 -1
- data/lib/mongoid/association/referenced/auto_save.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +493 -495
- data/lib/mongoid/association/referenced/has_many/proxy.rb +2 -2
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +2 -2
- data/lib/mongoid/attributes/projector.rb +120 -0
- data/lib/mongoid/attributes.rb +32 -14
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/clients/factory.rb +22 -8
- data/lib/mongoid/clients.rb +1 -1
- data/lib/mongoid/config.rb +19 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +10 -8
- data/lib/mongoid/copyable.rb +1 -1
- data/lib/mongoid/criteria/findable.rb +1 -1
- data/lib/mongoid/criteria/queryable/expandable.rb +0 -24
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions.rb +0 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +46 -20
- data/lib/mongoid/criteria/queryable/selectable.rb +8 -8
- data/lib/mongoid/criteria/queryable/selector.rb +0 -4
- data/lib/mongoid/criteria.rb +4 -5
- data/lib/mongoid/document.rb +4 -17
- data/lib/mongoid/errors/delete_restriction.rb +8 -9
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +1 -2
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +2 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/fields.rb +43 -5
- data/lib/mongoid/inspectable.rb +1 -1
- data/lib/mongoid/interceptable.rb +3 -1
- data/lib/mongoid/matcher/bits.rb +41 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_all_set.rb +20 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_any_set.rb +20 -0
- data/lib/mongoid/matcher/elem_match.rb +2 -1
- data/lib/mongoid/matcher/expression.rb +9 -14
- data/lib/mongoid/matcher/field_expression.rb +4 -5
- data/lib/mongoid/matcher/field_operator.rb +13 -11
- data/lib/mongoid/matcher/mod.rb +17 -0
- data/lib/mongoid/matcher/type.rb +99 -0
- data/lib/mongoid/matcher.rb +26 -43
- data/lib/mongoid/persistable/deletable.rb +1 -2
- data/lib/mongoid/persistable/destroyable.rb +8 -2
- data/lib/mongoid/persistable/updatable.rb +27 -2
- data/lib/mongoid/query_cache.rb +35 -29
- data/lib/mongoid/reloadable.rb +5 -0
- data/lib/mongoid/selectable.rb +5 -7
- data/lib/mongoid/shardable.rb +21 -5
- data/lib/mongoid/touchable.rb +23 -4
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/config_generator.rb +8 -1
- data/spec/integration/app_spec.rb +171 -84
- data/spec/integration/associations/embeds_many_spec.rb +44 -0
- data/spec/integration/associations/has_one_spec.rb +48 -0
- data/spec/integration/callbacks_models.rb +49 -0
- data/spec/integration/callbacks_spec.rb +216 -0
- data/spec/integration/criteria/date_field_spec.rb +1 -1
- data/spec/integration/document_spec.rb +30 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
- data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
- data/spec/integration/matcher_operator_data/in.yml +16 -0
- data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/lite_spec_helper.rb +5 -4
- data/spec/mongoid/association/depending_spec.rb +391 -352
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
- data/spec/mongoid/association/nested/one_spec.rb +18 -14
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +25 -8
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +1 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +8 -0
- data/spec/mongoid/atomic/paths_spec.rb +105 -12
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +41 -0
- data/spec/mongoid/attributes_spec.rb +333 -0
- data/spec/mongoid/clients/factory_spec.rb +48 -0
- data/spec/mongoid/config_spec.rb +32 -0
- data/spec/mongoid/contextual/atomic_spec.rb +17 -4
- data/spec/mongoid/contextual/mongo_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -73
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +105 -7
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +265 -24
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -565
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
- data/spec/mongoid/criteria_projection_spec.rb +411 -0
- data/spec/mongoid/criteria_spec.rb +0 -275
- data/spec/mongoid/document_fields_spec.rb +26 -0
- data/spec/mongoid/document_spec.rb +13 -13
- data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
- data/spec/mongoid/extensions/false_class_spec.rb +1 -1
- data/spec/mongoid/extensions/string_spec.rb +5 -5
- data/spec/mongoid/extensions/true_class_spec.rb +1 -1
- data/spec/mongoid/fields/localized_spec.rb +4 -4
- data/spec/mongoid/fields_spec.rb +4 -4
- data/spec/mongoid/inspectable_spec.rb +12 -4
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
- data/spec/mongoid/matcher/extract_attribute_spec.rb +3 -13
- data/spec/mongoid/persistable/deletable_spec.rb +175 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +191 -3
- data/spec/mongoid/persistable/savable_spec.rb +3 -5
- data/spec/mongoid/persistable/settable_spec.rb +30 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +1 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +8 -0
- data/spec/mongoid/reloadable_spec.rb +18 -1
- data/spec/mongoid/shardable_spec.rb +44 -0
- data/spec/mongoid/touchable_spec.rb +104 -16
- data/spec/mongoid/touchable_spec_models.rb +52 -0
- data/spec/mongoid/validatable_spec.rb +1 -1
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/lib/mrss/cluster_config.rb +221 -0
- data/spec/shared/lib/mrss/constraints.rb +51 -0
- data/spec/shared/lib/mrss/docker_runner.rb +265 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +14 -1
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +231 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +290 -0
- data/spec/shared/shlib/set_env.sh +128 -0
- data/spec/spec_helper.rb +6 -2
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/models/bolt.rb +8 -0
- data/spec/support/models/customer.rb +11 -0
- data/spec/support/models/customer_address.rb +12 -0
- data/spec/support/models/dictionary.rb +6 -0
- data/spec/support/models/hole.rb +13 -0
- data/spec/support/models/mop.rb +9 -0
- data/spec/support/models/nut.rb +8 -0
- data/spec/support/models/person.rb +6 -0
- data/spec/support/models/sealer.rb +8 -0
- data/spec/support/models/shirt.rb +12 -0
- data/spec/support/models/spacer.rb +8 -0
- data/spec/support/models/threadlocker.rb +8 -0
- data/spec/support/models/washer.rb +8 -0
- data/spec/support/spec_config.rb +8 -0
- data.tar.gz.sig +0 -0
- metadata +146 -14
- metadata.gz.sig +5 -2
- data/spec/support/cluster_config.rb +0 -158
data/lib/mongoid/matcher.rb
CHANGED
|
@@ -43,66 +43,47 @@ module Mongoid
|
|
|
43
43
|
document = BSON::Document.new(document.send(:as_attributes))
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
expanded = false
|
|
48
|
-
exists = true
|
|
46
|
+
current = [document]
|
|
49
47
|
|
|
50
48
|
key.to_s.split('.').each do |field|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
exists = index < src.length
|
|
55
|
-
src = src[index]
|
|
56
|
-
else
|
|
57
|
-
# Trying to index something that is not an array
|
|
58
|
-
exists = false
|
|
59
|
-
src = nil
|
|
60
|
-
end
|
|
61
|
-
else
|
|
62
|
-
case src
|
|
63
|
-
when nil
|
|
64
|
-
exists = false
|
|
49
|
+
new = []
|
|
50
|
+
current.each do |doc|
|
|
51
|
+
case doc
|
|
65
52
|
when Hash
|
|
66
|
-
|
|
67
|
-
|
|
53
|
+
if doc.key?(field)
|
|
54
|
+
new << doc[field]
|
|
55
|
+
end
|
|
68
56
|
when Array
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
when Array
|
|
79
|
-
new += v
|
|
80
|
-
else
|
|
81
|
-
new += [v]
|
|
82
|
-
end
|
|
83
|
-
exists = true
|
|
57
|
+
if (index = field.to_i).to_s == field
|
|
58
|
+
if doc.length > index
|
|
59
|
+
new << doc[index]
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
doc.each do |subdoc|
|
|
63
|
+
if Hash === subdoc
|
|
64
|
+
if subdoc.key?(field)
|
|
65
|
+
new << subdoc[field]
|
|
84
66
|
end
|
|
85
|
-
else
|
|
86
|
-
# Trying to hash index into a value that is not a hash
|
|
87
67
|
end
|
|
88
68
|
end
|
|
89
|
-
src = new
|
|
90
|
-
else
|
|
91
|
-
# Trying to descend into a field that is not a hash using
|
|
92
|
-
# dot notation.
|
|
93
|
-
exists = false
|
|
94
|
-
src = nil
|
|
95
69
|
end
|
|
96
70
|
end
|
|
71
|
+
current = new
|
|
72
|
+
break if current.empty?
|
|
97
73
|
end
|
|
98
74
|
|
|
99
|
-
|
|
75
|
+
current
|
|
100
76
|
end
|
|
101
77
|
end
|
|
102
78
|
end
|
|
103
79
|
|
|
104
80
|
require 'mongoid/matcher/all'
|
|
105
81
|
require 'mongoid/matcher/and'
|
|
82
|
+
require 'mongoid/matcher/bits'
|
|
83
|
+
require 'mongoid/matcher/bits_all_clear'
|
|
84
|
+
require 'mongoid/matcher/bits_all_set'
|
|
85
|
+
require 'mongoid/matcher/bits_any_clear'
|
|
86
|
+
require 'mongoid/matcher/bits_any_set'
|
|
106
87
|
require 'mongoid/matcher/elem_match'
|
|
107
88
|
require 'mongoid/matcher/elem_match_expression'
|
|
108
89
|
require 'mongoid/matcher/eq'
|
|
@@ -116,6 +97,7 @@ require 'mongoid/matcher/gte'
|
|
|
116
97
|
require 'mongoid/matcher/in'
|
|
117
98
|
require 'mongoid/matcher/lt'
|
|
118
99
|
require 'mongoid/matcher/lte'
|
|
100
|
+
require 'mongoid/matcher/mod'
|
|
119
101
|
require 'mongoid/matcher/ne'
|
|
120
102
|
require 'mongoid/matcher/nin'
|
|
121
103
|
require 'mongoid/matcher/nor'
|
|
@@ -123,5 +105,6 @@ require 'mongoid/matcher/not'
|
|
|
123
105
|
require 'mongoid/matcher/or'
|
|
124
106
|
require 'mongoid/matcher/regex'
|
|
125
107
|
require 'mongoid/matcher/size'
|
|
108
|
+
require 'mongoid/matcher/type'
|
|
126
109
|
require 'mongoid/matcher/expression_operator'
|
|
127
110
|
require 'mongoid/matcher/field_operator'
|
|
@@ -47,7 +47,7 @@ module Mongoid
|
|
|
47
47
|
#
|
|
48
48
|
# @since 4.0.0
|
|
49
49
|
def atomic_deletes
|
|
50
|
-
{ atomic_delete_modifier => { atomic_path => _index ? { "_id" =>
|
|
50
|
+
{ atomic_delete_modifier => { atomic_path => _index ? { "_id" => _id } : true }}
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
# Delete the embedded document.
|
|
@@ -117,7 +117,6 @@ module Mongoid
|
|
|
117
117
|
#
|
|
118
118
|
# @since 4.0.0
|
|
119
119
|
def prepare_delete
|
|
120
|
-
return false unless catch(:abort) { apply_delete_dependencies! }
|
|
121
120
|
yield(self)
|
|
122
121
|
freeze
|
|
123
122
|
self.destroyed = true
|
|
@@ -23,13 +23,19 @@ module Mongoid
|
|
|
23
23
|
def destroy(options = nil)
|
|
24
24
|
raise Errors::ReadonlyDocument.new(self.class) if readonly?
|
|
25
25
|
self.flagged_for_destroy = true
|
|
26
|
-
result = run_callbacks(:destroy)
|
|
26
|
+
result = run_callbacks(:destroy) do
|
|
27
|
+
if catch(:abort) { apply_destroy_dependencies! }
|
|
28
|
+
delete(options || {})
|
|
29
|
+
else
|
|
30
|
+
false
|
|
31
|
+
end
|
|
32
|
+
end
|
|
27
33
|
self.flagged_for_destroy = false
|
|
28
34
|
result
|
|
29
35
|
end
|
|
30
36
|
|
|
31
37
|
def destroy!(options = {})
|
|
32
|
-
destroy || raise(Errors::DocumentNotDestroyed.new(
|
|
38
|
+
destroy || raise(Errors::DocumentNotDestroyed.new(_id, self.class))
|
|
33
39
|
end
|
|
34
40
|
|
|
35
41
|
module ClassMethods
|
|
@@ -137,8 +137,33 @@ module Mongoid
|
|
|
137
137
|
coll = collection(_root)
|
|
138
138
|
selector = atomic_selector
|
|
139
139
|
coll.find(selector).update_one(positionally(selector, updates), session: _session)
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
|
|
141
|
+
# The following code applies updates which would cause
|
|
142
|
+
# path conflicts in MongoDB, for example when changing attributes
|
|
143
|
+
# of foo.0.bars while adding another foo. Each conflicting update
|
|
144
|
+
# is applied using its own write.
|
|
145
|
+
#
|
|
146
|
+
# TODO: MONGOID-5026: reduce the number of writes performed by
|
|
147
|
+
# more intelligently combining the writes such that there are
|
|
148
|
+
# fewer conflicts.
|
|
149
|
+
conflicts.each_pair do |modifier, changes|
|
|
150
|
+
|
|
151
|
+
# Group the changes according to their root key which is
|
|
152
|
+
# the top-level association name.
|
|
153
|
+
# This handles at least the cases described in MONGOID-4982.
|
|
154
|
+
conflicting_change_groups = changes.group_by do |key, _|
|
|
155
|
+
key.split(".", 2).first
|
|
156
|
+
end.values
|
|
157
|
+
|
|
158
|
+
# Apply changes in batches. Pop one change from each
|
|
159
|
+
# field-conflict group round-robin until all changes
|
|
160
|
+
# have been applied.
|
|
161
|
+
while batched_changes = conflicting_change_groups.map(&:pop).compact.to_h.presence
|
|
162
|
+
coll.find(selector).update_one(
|
|
163
|
+
positionally(selector, modifier => batched_changes),
|
|
164
|
+
session: _session,
|
|
165
|
+
)
|
|
166
|
+
end
|
|
142
167
|
end
|
|
143
168
|
end
|
|
144
169
|
end
|
data/lib/mongoid/query_cache.rb
CHANGED
|
@@ -117,38 +117,44 @@ module Mongoid
|
|
|
117
117
|
end
|
|
118
118
|
end
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
# Instantiate the middleware.
|
|
127
|
-
#
|
|
128
|
-
# @example Create the new middleware.
|
|
129
|
-
# Middleware.new(app)
|
|
130
|
-
#
|
|
131
|
-
# @param [ Object ] app The rack applciation stack.
|
|
120
|
+
if defined?(Mongo::QueryCache::Middleware)
|
|
121
|
+
Middleware = Mongo::QueryCache::Middleware
|
|
122
|
+
else
|
|
123
|
+
# The middleware to be added to a rack application in order to activate the
|
|
124
|
+
# query cache.
|
|
132
125
|
#
|
|
133
126
|
# @since 4.0.0
|
|
134
|
-
|
|
135
|
-
@app = app
|
|
136
|
-
end
|
|
127
|
+
class Middleware
|
|
137
128
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
129
|
+
# Instantiate the middleware.
|
|
130
|
+
#
|
|
131
|
+
# @example Create the new middleware.
|
|
132
|
+
# Middleware.new(app)
|
|
133
|
+
#
|
|
134
|
+
# @param [ Object ] app The rack application stack.
|
|
135
|
+
#
|
|
136
|
+
# @since 4.0.0
|
|
137
|
+
def initialize(app)
|
|
138
|
+
@app = app
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Execute the request, wrapping in a query cache.
|
|
142
|
+
#
|
|
143
|
+
# @example Execute the request.
|
|
144
|
+
# middleware.call(env)
|
|
145
|
+
#
|
|
146
|
+
# @param [ Object ] env The environment.
|
|
147
|
+
#
|
|
148
|
+
# @return [ Object ] The result of the call.
|
|
149
|
+
#
|
|
150
|
+
# @since 4.0.0
|
|
151
|
+
def call(env)
|
|
152
|
+
QueryCache.cache do
|
|
153
|
+
@app.call(env)
|
|
154
|
+
end
|
|
155
|
+
ensure
|
|
156
|
+
QueryCache.clear_cache
|
|
157
|
+
end
|
|
152
158
|
end
|
|
153
159
|
end
|
|
154
160
|
|
data/lib/mongoid/reloadable.rb
CHANGED
|
@@ -21,6 +21,11 @@ module Mongoid
|
|
|
21
21
|
#
|
|
22
22
|
# @since 1.0.0
|
|
23
23
|
def reload
|
|
24
|
+
if @atomic_selector
|
|
25
|
+
# Clear atomic_selector cache for sharded clusters. MONGOID-5076
|
|
26
|
+
remove_instance_variable('@atomic_selector')
|
|
27
|
+
end
|
|
28
|
+
|
|
24
29
|
reloaded = _reload
|
|
25
30
|
if Mongoid.raise_not_found_error && reloaded.empty?
|
|
26
31
|
raise Errors::DocumentNotFound.new(self.class, _id, _id)
|
data/lib/mongoid/selectable.rb
CHANGED
|
@@ -21,7 +21,7 @@ module Mongoid
|
|
|
21
21
|
# @since 1.0.0
|
|
22
22
|
def atomic_selector
|
|
23
23
|
@atomic_selector ||=
|
|
24
|
-
(embedded? ? embedded_atomic_selector :
|
|
24
|
+
(embedded? ? embedded_atomic_selector : root_atomic_selector_in_db)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
private
|
|
@@ -44,18 +44,16 @@ module Mongoid
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
# Get the atomic selector
|
|
47
|
+
# Get the atomic selector that would match the existing version of the
|
|
48
|
+
# root document.
|
|
48
49
|
#
|
|
49
50
|
# @api private
|
|
50
51
|
#
|
|
51
|
-
# @example Get the root atomic selector.
|
|
52
|
-
# document.root_atomic_selector
|
|
53
|
-
#
|
|
54
52
|
# @return [ Hash ] The root document selector.
|
|
55
53
|
#
|
|
56
54
|
# @since 4.0.0
|
|
57
|
-
def
|
|
58
|
-
{ "_id" => _id }.merge!(
|
|
55
|
+
def root_atomic_selector_in_db
|
|
56
|
+
{ "_id" => _id }.merge!(shard_key_selector_in_db)
|
|
59
57
|
end
|
|
60
58
|
end
|
|
61
59
|
end
|
data/lib/mongoid/shardable.rb
CHANGED
|
@@ -52,15 +52,31 @@ module Mongoid
|
|
|
52
52
|
self.class.shard_key_fields
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
# @example Get the selector for the shard keys.
|
|
58
|
-
# person.shard_key_selector
|
|
55
|
+
# Returns the selector that would match the current version of this
|
|
56
|
+
# document.
|
|
59
57
|
#
|
|
60
58
|
# @return [ Hash ] The shard key selector.
|
|
61
59
|
#
|
|
62
|
-
# @
|
|
60
|
+
# @api private
|
|
63
61
|
def shard_key_selector
|
|
62
|
+
selector = {}
|
|
63
|
+
shard_key_fields.each do |field|
|
|
64
|
+
selector[field.to_s] = send(field)
|
|
65
|
+
end
|
|
66
|
+
selector
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Returns the selector that would match the existing version of this
|
|
70
|
+
# document in the database.
|
|
71
|
+
#
|
|
72
|
+
# If the document is not persisted, this method uses the current values
|
|
73
|
+
# of the shard key fields. If the document is persisted, this method
|
|
74
|
+
# uses the values retrieved from the database.
|
|
75
|
+
#
|
|
76
|
+
# @return [ Hash ] The shard key selector.
|
|
77
|
+
#
|
|
78
|
+
# @api private
|
|
79
|
+
def shard_key_selector_in_db
|
|
64
80
|
selector = {}
|
|
65
81
|
shard_key_fields.each do |field|
|
|
66
82
|
selector[field.to_s] = new_record? ? send(field) : attribute_was(field)
|
data/lib/mongoid/touchable.rb
CHANGED
|
@@ -30,11 +30,30 @@ module Mongoid
|
|
|
30
30
|
write_attribute(:updated_at, current) if respond_to?("updated_at=")
|
|
31
31
|
write_attribute(field, current) if field
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
# If the document being touched is embedded, touch its parents
|
|
34
|
+
# all the way through the composition hierarchy to the root object,
|
|
35
|
+
# because when an embedded document is changed the write is actually
|
|
36
|
+
# performed by the composition root. See MONGOID-3468.
|
|
37
|
+
if _parent
|
|
38
|
+
# This will persist updated_at on this document as well as parents.
|
|
39
|
+
# TODO support passing the field name to the parent's touch method;
|
|
40
|
+
# I believe it should be read out of
|
|
41
|
+
# _association.inverse_association.options but inverse_association
|
|
42
|
+
# seems to not always/ever be set here. See MONGOID-5014.
|
|
43
|
+
_parent.touch
|
|
44
|
+
else
|
|
45
|
+
# If the current document is not embedded, it is composition root
|
|
46
|
+
# and we need to persist the write here.
|
|
47
|
+
touches = touch_atomic_updates(field)
|
|
48
|
+
unless touches["$set"].blank?
|
|
49
|
+
selector = atomic_selector
|
|
50
|
+
_root.collection.find(selector).update_one(positionally(selector, touches), session: _session)
|
|
51
|
+
end
|
|
37
52
|
end
|
|
53
|
+
|
|
54
|
+
# Callbacks are invoked on the composition root first and on the
|
|
55
|
+
# leaf-most embedded document last.
|
|
56
|
+
# TODO add tests, see MONGOID-5015.
|
|
38
57
|
run_callbacks(:touch)
|
|
39
58
|
true
|
|
40
59
|
end
|
data/lib/mongoid/version.rb
CHANGED
|
@@ -15,7 +15,14 @@ module Mongoid
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def app_name
|
|
18
|
-
Rails
|
|
18
|
+
app_cls = Rails.application.class
|
|
19
|
+
parent = begin
|
|
20
|
+
# Rails 6.1+
|
|
21
|
+
app_cls.module_parent_name
|
|
22
|
+
rescue NoMethodError
|
|
23
|
+
app_cls.parent.to_s
|
|
24
|
+
end
|
|
25
|
+
parent.underscore
|
|
19
26
|
end
|
|
20
27
|
|
|
21
28
|
def create_config_file
|