mongoid 5.4.0 → 6.4.8
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/README.md +3 -3
- data/Rakefile +26 -0
- data/lib/config/locales/en.yml +40 -0
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +5 -5
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/sessions.rb +113 -0
- data/lib/mongoid/clients/storage_options.rb +2 -69
- data/lib/mongoid/clients.rb +10 -63
- data/lib/mongoid/composable.rb +29 -2
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +4 -4
- data/lib/mongoid/contextual/map_reduce.rb +7 -3
- data/lib/mongoid/contextual/memory.rb +9 -4
- data/lib/mongoid/contextual/mongo.rb +65 -30
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +29 -3
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -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 +79 -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/extensions.rb +28 -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 +273 -0
- data/lib/mongoid/criteria/queryable/optional.rb +429 -0
- data/lib/mongoid/criteria/queryable/options.rb +153 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/criteria/queryable.rb +87 -0
- data/lib/mongoid/criteria.rb +6 -2
- data/lib/mongoid/document.rb +34 -41
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
- 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/invalid_session_use.rb +24 -0
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/decimal128.rb +3 -3
- data/lib/mongoid/extensions/hash.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/extensions/string.rb +6 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +16 -14
- data/lib/mongoid/interceptable.rb +9 -22
- data/lib/mongoid/matchable/all.rb +2 -2
- data/lib/mongoid/matchable/and.rb +3 -3
- data/lib/mongoid/matchable/default.rb +2 -2
- data/lib/mongoid/matchable/elem_match.rb +28 -0
- data/lib/mongoid/matchable/exists.rb +2 -2
- data/lib/mongoid/matchable/gt.rb +4 -2
- data/lib/mongoid/matchable/gte.rb +4 -2
- data/lib/mongoid/matchable/in.rb +2 -2
- data/lib/mongoid/matchable/lt.rb +4 -2
- data/lib/mongoid/matchable/lte.rb +4 -2
- data/lib/mongoid/matchable/ne.rb +2 -2
- data/lib/mongoid/matchable/nin.rb +2 -2
- data/lib/mongoid/matchable/nor.rb +37 -0
- data/lib/mongoid/matchable/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/matchable.rb +16 -7
- data/lib/mongoid/persistable/creatable.rb +5 -3
- data/lib/mongoid/persistable/deletable.rb +5 -3
- data/lib/mongoid/persistable/destroyable.rb +1 -5
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistable/updatable.rb +7 -14
- data/lib/mongoid/persistable/upsertable.rb +2 -1
- data/lib/mongoid/persistable.rb +4 -6
- data/lib/mongoid/persistence_context.rb +220 -0
- data/lib/mongoid/query_cache.rb +67 -23
- data/lib/mongoid/railtie.rb +17 -1
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/relations/accessors.rb +3 -0
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
- data/lib/mongoid/relations/counter_cache.rb +15 -5
- data/lib/mongoid/relations/eager/base.rb +3 -3
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
- data/lib/mongoid/relations/eager/has_many.rb +1 -1
- data/lib/mongoid/relations/eager.rb +6 -11
- data/lib/mongoid/relations/embedded/batchable.rb +20 -18
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +51 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- data/lib/mongoid/relations/many.rb +4 -0
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +1 -31
- data/lib/mongoid/relations/referenced/in.rb +19 -10
- data/lib/mongoid/relations/referenced/many.rb +30 -26
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +15 -1
- data/lib/mongoid/relations/synchronization.rb +12 -12
- data/lib/mongoid/relations/targets/enumerable.rb +24 -4
- data/lib/mongoid/relations/touchable.rb +7 -4
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/stateful.rb +1 -0
- data/lib/mongoid/tasks/database.rb +3 -2
- data/lib/mongoid/threaded.rb +74 -0
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +6 -6
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
- data/spec/app/models/agent.rb +2 -0
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/array_field.rb +7 -0
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +3 -0
- data/spec/app/models/book.rb +2 -1
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/app/models/dokument.rb +1 -0
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/page.rb +1 -1
- data/spec/app/models/person.rb +3 -3
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/subscription.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +15 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
- data/spec/mongoid/atomic_spec.rb +5 -5
- data/spec/mongoid/attributes/nested_spec.rb +18 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +90 -5
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +80 -28
- data/spec/mongoid/clients/options_spec.rb +396 -95
- data/spec/mongoid/clients/sessions_spec.rb +334 -0
- data/spec/mongoid/clients_spec.rb +243 -101
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +67 -11
- data/spec/mongoid/contextual/atomic_spec.rb +3 -3
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
- data/spec/mongoid/contextual/mongo_spec.rb +275 -22
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
- 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 → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
- 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 +1799 -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 +4242 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +156 -22
- data/spec/mongoid/document_spec.rb +100 -90
- 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 +321 -19
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/hash_spec.rb +15 -0
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -4
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/factory_spec.rb +11 -0
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/findable_spec.rb +47 -2
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +85 -19
- data/spec/mongoid/matchable/all_spec.rb +4 -4
- data/spec/mongoid/matchable/and_spec.rb +10 -10
- data/spec/mongoid/matchable/default_spec.rb +12 -12
- data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
- data/spec/mongoid/matchable/exists_spec.rb +5 -5
- data/spec/mongoid/matchable/gt_spec.rb +18 -7
- data/spec/mongoid/matchable/gte_spec.rb +17 -7
- data/spec/mongoid/matchable/in_spec.rb +5 -5
- data/spec/mongoid/matchable/lt_spec.rb +18 -7
- data/spec/mongoid/matchable/lte_spec.rb +18 -7
- data/spec/mongoid/matchable/ne_spec.rb +5 -5
- data/spec/mongoid/matchable/nin_spec.rb +5 -5
- data/spec/mongoid/matchable/nor_spec.rb +209 -0
- data/spec/mongoid/matchable/or_spec.rb +7 -7
- data/spec/mongoid/matchable/regexp_spec.rb +5 -5
- data/spec/mongoid/matchable/size_spec.rb +3 -3
- data/spec/mongoid/matchable_spec.rb +199 -54
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +35 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +34 -29
- data/spec/mongoid/persistable/settable_spec.rb +77 -27
- data/spec/mongoid/persistable/updatable_spec.rb +182 -3
- data/spec/mongoid/persistable_spec.rb +16 -16
- data/spec/mongoid/persistence_context_spec.rb +694 -0
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/query_cache_spec.rb +170 -12
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
- data/spec/mongoid/relations/eager_spec.rb +40 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +415 -7
- data/spec/mongoid/relations/metadata_spec.rb +15 -1
- data/spec/mongoid/relations/proxy_spec.rb +27 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
- data/spec/mongoid/relations/synchronization_spec.rb +48 -2
- data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
- data/spec/mongoid/relations/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +101 -8
- data/spec/support/cluster_config.rb +158 -0
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +42 -0
- data.tar.gz.sig +0 -0
- metadata +163 -61
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/railties/document.rb +0 -12
- data/spec/mongoid/railties/document_spec.rb +0 -24
data/lib/mongoid/railtie.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require "mongoid/railties/document"
|
3
2
|
require "rails"
|
4
3
|
require "rails/mongoid"
|
5
4
|
|
@@ -103,6 +102,23 @@ module Rails
|
|
103
102
|
puts "There is a configuration error with the current mongoid.yml."
|
104
103
|
puts e.message
|
105
104
|
end
|
105
|
+
|
106
|
+
# Include Controller extension that measures Mongoid runtime
|
107
|
+
# during request processing. The value then appears in Rails'
|
108
|
+
# instrumentation event `process_action.action_controller`.
|
109
|
+
#
|
110
|
+
# The measurement is made via internal Mongo monitoring subscription
|
111
|
+
initializer "mongoid.runtime-metric" do
|
112
|
+
require "mongoid/railties/controller_runtime"
|
113
|
+
|
114
|
+
ActiveSupport.on_load :action_controller do
|
115
|
+
include ::Mongoid::Railties::ControllerRuntime::ControllerExtension
|
116
|
+
end
|
117
|
+
|
118
|
+
Mongo::Monitoring::Global.subscribe Mongo::Monitoring::COMMAND,
|
119
|
+
::Mongoid::Railties::ControllerRuntime::Collector.new
|
120
|
+
end
|
121
|
+
|
106
122
|
end
|
107
123
|
end
|
108
124
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Mongoid
|
2
|
+
module Railties
|
3
|
+
module ControllerRuntime
|
4
|
+
|
5
|
+
# This extension mimics the Rails' internal method to
|
6
|
+
# measure ActiveRecord runtime during request processing.
|
7
|
+
# It appends MongoDB runtime value (`mongoid_runtime`) into payload
|
8
|
+
# of instrumentation event `process_action.action_controller`.
|
9
|
+
module ControllerExtension
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
attr_internal :mongoid_runtime
|
15
|
+
|
16
|
+
# Reset the runtime before each action.
|
17
|
+
def process_action(action, *args)
|
18
|
+
Collector.reset_runtime
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
# Override to collect the measurements.
|
23
|
+
def cleanup_view_runtime
|
24
|
+
mongo_rt_before_render = Collector.reset_runtime
|
25
|
+
runtime = super
|
26
|
+
mongo_rt_after_render = Collector.reset_runtime
|
27
|
+
self.mongoid_runtime = mongo_rt_before_render + mongo_rt_after_render
|
28
|
+
runtime - mongo_rt_after_render
|
29
|
+
end
|
30
|
+
|
31
|
+
# Add the measurement to the instrumentation event payload.
|
32
|
+
def append_info_to_payload(payload)
|
33
|
+
super
|
34
|
+
payload[:mongoid_runtime] = (mongoid_runtime || 0) + Collector.reset_runtime
|
35
|
+
end
|
36
|
+
|
37
|
+
module ClassMethods
|
38
|
+
|
39
|
+
# Append MongoDB runtime information to ActionController runtime
|
40
|
+
# log message.
|
41
|
+
def log_process_action(payload)
|
42
|
+
messages = super
|
43
|
+
mongoid_runtime = payload[:mongoid_runtime]
|
44
|
+
messages << ("MongoDB: %.1fms" % mongoid_runtime.to_f) if mongoid_runtime
|
45
|
+
messages
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
# The Collector of MongoDB runtime metric, that subscribes to Mongo
|
53
|
+
# driver command monitoring. Stores the value within a thread-local
|
54
|
+
# variable to provide correct accounting when an application issues
|
55
|
+
# MongoDB operations from background threads.
|
56
|
+
class Collector
|
57
|
+
|
58
|
+
VARIABLE_NAME = "Mongoid.controller_runtime".freeze
|
59
|
+
|
60
|
+
def started _; end
|
61
|
+
|
62
|
+
def _completed e
|
63
|
+
Collector.runtime += e.duration
|
64
|
+
end
|
65
|
+
alias :succeeded :_completed
|
66
|
+
alias :failed :_completed
|
67
|
+
|
68
|
+
def self.runtime
|
69
|
+
Thread.current[VARIABLE_NAME] ||= 0
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.runtime= value
|
73
|
+
Thread.current[VARIABLE_NAME] = value
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.reset_runtime
|
77
|
+
to_now = runtime
|
78
|
+
self.runtime = 0
|
79
|
+
to_now
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -229,6 +229,9 @@ module Mongoid
|
|
229
229
|
if value = get_relation(name, metadata, object)
|
230
230
|
if value.respond_to?(:substitute)
|
231
231
|
set_relation(name, value.substitute(object.substitutable))
|
232
|
+
else
|
233
|
+
value = __build__(name, value, metadata)
|
234
|
+
set_relation(name, value.substitute(object.substitutable))
|
232
235
|
end
|
233
236
|
else
|
234
237
|
__build__(name, object.substitutable, metadata)
|
@@ -59,17 +59,25 @@ module Mongoid
|
|
59
59
|
if metadata.autosave? && !metadata.embedded?
|
60
60
|
save_method = :"autosave_documents_for_#{metadata.name}"
|
61
61
|
define_method(save_method) do
|
62
|
-
|
63
62
|
if before_callback_halted?
|
64
63
|
self.before_callback_halted = false
|
65
64
|
else
|
66
65
|
__autosaving__ do
|
67
66
|
if relation = ivar(metadata.name)
|
68
|
-
options = persistence_options || {}
|
69
67
|
if :belongs_to == metadata.macro
|
70
|
-
|
68
|
+
if changed_for_autosave?(relation)
|
69
|
+
relation.with(persistence_context) do |_relation|
|
70
|
+
_relation.save
|
71
|
+
end
|
72
|
+
end
|
71
73
|
else
|
72
|
-
Array(relation).each
|
74
|
+
Array(relation).each do |doc|
|
75
|
+
if changed_for_autosave?(doc)
|
76
|
+
doc.with(persistence_context) do |d|
|
77
|
+
d.save
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
73
81
|
end
|
74
82
|
end
|
75
83
|
end
|
@@ -26,8 +26,8 @@ module Mongoid
|
|
26
26
|
end
|
27
27
|
doc.reset_relation_criteria(metadata.inverse)
|
28
28
|
end
|
29
|
-
base.
|
30
|
-
doc.
|
29
|
+
base._synced[metadata.foreign_key] = true
|
30
|
+
doc._synced[metadata.inverse_foreign_key] = true
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -45,8 +45,8 @@ module Mongoid
|
|
45
45
|
inverse_keys.delete_one(inverse_record_id(doc))
|
46
46
|
doc.reset_relation_criteria(metadata.inverse)
|
47
47
|
end
|
48
|
-
base.
|
49
|
-
doc.
|
48
|
+
base._synced[metadata.foreign_key] = true
|
49
|
+
doc._synced[metadata.inverse_foreign_key] = true
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -15,7 +15,9 @@ module Mongoid
|
|
15
15
|
#
|
16
16
|
# @since 4.0.0
|
17
17
|
def reset_counters(*counters)
|
18
|
-
self.class.
|
18
|
+
self.class.with(persistence_context) do |_class|
|
19
|
+
_class.reset_counters(self, *counters)
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
module ClassMethods
|
@@ -111,12 +113,16 @@ module Mongoid
|
|
111
113
|
original, current = attribute_change(foreign_key)
|
112
114
|
|
113
115
|
unless original.nil?
|
114
|
-
record.class.
|
116
|
+
record.class.with(persistence_context) do |_class|
|
117
|
+
_class.decrement_counter(cache_column, original)
|
118
|
+
end
|
115
119
|
end
|
116
120
|
|
117
121
|
unless current.nil?
|
118
122
|
record[cache_column] = (record[cache_column] || 0) + 1
|
119
|
-
record.class.
|
123
|
+
record.class.with(record.persistence_context) do |_class|
|
124
|
+
_class.increment_counter(cache_column, current) if record.persisted?
|
125
|
+
end
|
120
126
|
end
|
121
127
|
end
|
122
128
|
end
|
@@ -127,7 +133,9 @@ module Mongoid
|
|
127
133
|
record[cache_column] = (record[cache_column] || 0) + 1
|
128
134
|
|
129
135
|
if record.persisted?
|
130
|
-
record.class.
|
136
|
+
record.class.with(record.persistence_context) do |_class|
|
137
|
+
_class.increment_counter(cache_column, record._id)
|
138
|
+
end
|
131
139
|
record.remove_change(cache_column)
|
132
140
|
end
|
133
141
|
end
|
@@ -138,7 +146,9 @@ module Mongoid
|
|
138
146
|
record[cache_column] = (record[cache_column] || 0) - 1 unless record.frozen?
|
139
147
|
|
140
148
|
if record.persisted?
|
141
|
-
record.class.
|
149
|
+
record.class.with(record.persistence_context) do |_class|
|
150
|
+
_class.decrement_counter(cache_column, record._id)
|
151
|
+
end
|
142
152
|
record.remove_change(cache_column)
|
143
153
|
end
|
144
154
|
end
|
@@ -48,7 +48,7 @@ module Mongoid
|
|
48
48
|
@loaded = []
|
49
49
|
while shift_metadata
|
50
50
|
preload
|
51
|
-
@loaded << @docs.collect { |d| d.send(@metadata.name) }
|
51
|
+
@loaded << @docs.collect { |d| d.send(@metadata.name) if d.respond_to?(@metadata.name) }
|
52
52
|
end
|
53
53
|
@loaded.flatten
|
54
54
|
end
|
@@ -99,12 +99,12 @@ module Mongoid
|
|
99
99
|
# @example Return a hash with the current documents grouped by key.
|
100
100
|
# loader.grouped_docs
|
101
101
|
#
|
102
|
-
# @return [ Hash ] hash with
|
102
|
+
# @return [ Hash ] hash with grouped documents.
|
103
103
|
#
|
104
104
|
# @since 4.0.0
|
105
105
|
def grouped_docs
|
106
106
|
@grouped_docs[@metadata.name] ||= @docs.group_by do |doc|
|
107
|
-
doc.send(group_by_key)
|
107
|
+
doc.send(group_by_key) if doc.respond_to?(group_by_key)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
@@ -17,7 +17,7 @@ module Mongoid
|
|
17
17
|
|
18
18
|
@docs.each do |d|
|
19
19
|
keys = d.send(group_by_key)
|
20
|
-
docs = entries.values_at(*keys)
|
20
|
+
docs = entries.values_at(*keys).compact
|
21
21
|
set_relation(d, docs)
|
22
22
|
end
|
23
23
|
end
|
@@ -31,7 +31,7 @@ module Mongoid
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_relation(doc, element)
|
34
|
-
doc.__build__(@metadata.name, element, @metadata)
|
34
|
+
doc.__build__(@metadata.name, element, @metadata) unless doc.blank?
|
35
35
|
end
|
36
36
|
|
37
37
|
def group_by_key
|
@@ -22,19 +22,14 @@ module Mongoid
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def preload(relations, docs)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
relations.group_by(&:inverse_class_name)
|
26
|
+
.values
|
27
|
+
.each do |associations|
|
28
|
+
associations.group_by(&:relation)
|
29
|
+
.each do |relation, association|
|
30
|
+
relation.eager_load_klass.new(association, docs).run
|
31
31
|
end
|
32
32
|
end
|
33
|
-
grouped_relations.each do |_klass, associations|
|
34
|
-
docs = associations.collect do |_relation, association|
|
35
|
-
_relation.eager_load_klass.new(association, docs).run
|
36
|
-
end.flatten
|
37
|
-
end
|
38
33
|
end
|
39
34
|
end
|
40
35
|
end
|
@@ -8,19 +8,19 @@ module Mongoid
|
|
8
8
|
module Batchable
|
9
9
|
include Positional
|
10
10
|
|
11
|
-
# Insert new documents as a batch push ($
|
11
|
+
# Insert new documents as a batch push ($push with $each). This ensures that
|
12
12
|
# all callbacks are run at the appropriate time and only 1 request is
|
13
13
|
# made to the database.
|
14
14
|
#
|
15
15
|
# @example Execute the batch push.
|
16
|
-
# batchable.
|
16
|
+
# batchable.batch_insert([ doc_one, doc_two ])
|
17
17
|
#
|
18
18
|
# @param [ Array<Document> ] docs The docs to add.
|
19
19
|
#
|
20
20
|
# @return [ Array<Hash> ] The inserts.
|
21
21
|
#
|
22
|
-
# @since
|
23
|
-
def
|
22
|
+
# @since 3.0.0
|
23
|
+
def batch_insert(docs)
|
24
24
|
execute_batch_push(docs)
|
25
25
|
end
|
26
26
|
|
@@ -38,7 +38,8 @@ module Mongoid
|
|
38
38
|
pre_process_batch_remove(docs, :delete)
|
39
39
|
unless docs.empty?
|
40
40
|
collection.find(selector).update_one(
|
41
|
-
positionally(selector, "$unset" => { path => true })
|
41
|
+
positionally(selector, "$unset" => { path => true }),
|
42
|
+
session: _session
|
42
43
|
)
|
43
44
|
post_process_batch_remove(docs, :delete)
|
44
45
|
end
|
@@ -58,7 +59,8 @@ module Mongoid
|
|
58
59
|
removals = pre_process_batch_remove(docs, method)
|
59
60
|
if !docs.empty?
|
60
61
|
collection.find(selector).update_one(
|
61
|
-
positionally(selector, "$pullAll" => { path => removals })
|
62
|
+
positionally(selector, "$pullAll" => { path => removals }),
|
63
|
+
session: _session
|
62
64
|
)
|
63
65
|
post_process_batch_remove(docs, method)
|
64
66
|
end
|
@@ -85,7 +87,7 @@ module Mongoid
|
|
85
87
|
else
|
86
88
|
batch_remove(target.dup)
|
87
89
|
end
|
88
|
-
|
90
|
+
elsif target != docs
|
89
91
|
base.delayed_atomic_sets.clear unless _assigning?
|
90
92
|
docs = normalize_docs(docs).compact
|
91
93
|
target.clear and _unscoped.clear
|
@@ -116,26 +118,25 @@ module Mongoid
|
|
116
118
|
end
|
117
119
|
end
|
118
120
|
|
119
|
-
# Perform a batch persist of the provided documents with
|
120
|
-
# operation.
|
121
|
+
# Perform a batch persist of the provided documents with a $set.
|
121
122
|
#
|
122
123
|
# @api private
|
123
124
|
#
|
124
|
-
|
125
|
+
#@example Perform a batch $set.
|
125
126
|
# batchable.execute_batch_set(docs)
|
126
127
|
#
|
127
128
|
# @param [ Array<Document> ] docs The docs to persist.
|
128
|
-
# @param [ String ] operation The atomic operation.
|
129
129
|
#
|
130
130
|
# @return [ Array<Hash> ] The inserts.
|
131
131
|
#
|
132
|
-
# @since
|
132
|
+
# @since 7.0.0
|
133
133
|
def execute_batch_set(docs)
|
134
134
|
self.inserts_valid = true
|
135
135
|
inserts = pre_process_batch_insert(docs)
|
136
136
|
if insertable?
|
137
137
|
collection.find(selector).update_one(
|
138
|
-
|
138
|
+
positionally(selector, '$set' => { path => inserts }),
|
139
|
+
session: _session
|
139
140
|
)
|
140
141
|
post_process_batch_insert(docs)
|
141
142
|
end
|
@@ -150,17 +151,18 @@ module Mongoid
|
|
150
151
|
# batchable.execute_batch_push(docs)
|
151
152
|
#
|
152
153
|
# @param [ Array<Document> ] docs The docs to persist.
|
153
|
-
# @param [ String ] operation The atomic operation.
|
154
154
|
#
|
155
155
|
# @return [ Array<Hash> ] The inserts.
|
156
156
|
#
|
157
|
-
# @since
|
157
|
+
# @since 7.0.0
|
158
158
|
def execute_batch_push(docs)
|
159
159
|
self.inserts_valid = true
|
160
160
|
pushes = pre_process_batch_insert(docs)
|
161
161
|
if insertable?
|
162
162
|
collection.find(selector).update_one(
|
163
|
-
positionally(selector, '$push' => { path => { '$each' => pushes } })
|
163
|
+
positionally(selector, '$push' => { path => { '$each' => pushes } }),
|
164
|
+
session: _session
|
165
|
+
)
|
164
166
|
post_process_batch_insert(docs)
|
165
167
|
end
|
166
168
|
pushes
|
@@ -303,7 +305,7 @@ module Mongoid
|
|
303
305
|
self.inserts_valid = false
|
304
306
|
end
|
305
307
|
end
|
306
|
-
doc.
|
308
|
+
doc.send(:as_attributes)
|
307
309
|
end
|
308
310
|
end
|
309
311
|
|
@@ -332,7 +334,7 @@ module Mongoid
|
|
332
334
|
_unscoped.delete_one(doc)
|
333
335
|
unbind_one(doc)
|
334
336
|
execute_callback :after_remove, doc
|
335
|
-
doc.
|
337
|
+
doc.send(:as_attributes)
|
336
338
|
end
|
337
339
|
end
|
338
340
|
|
@@ -8,6 +8,18 @@ module Mongoid
|
|
8
8
|
# multiple documents.
|
9
9
|
class In < Relations::One
|
10
10
|
|
11
|
+
# The allowed options when defining this relation.
|
12
|
+
#
|
13
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
14
|
+
#
|
15
|
+
# @since 6.0.0
|
16
|
+
VALID_OPTIONS = [
|
17
|
+
:autobuild,
|
18
|
+
:cyclic,
|
19
|
+
:polymorphic,
|
20
|
+
:touch
|
21
|
+
].freeze
|
22
|
+
|
11
23
|
# Instantiate a new embedded_in relation.
|
12
24
|
#
|
13
25
|
# @example Create the new relation.
|
@@ -207,7 +219,7 @@ module Mongoid
|
|
207
219
|
#
|
208
220
|
# @since 2.1.0
|
209
221
|
def valid_options
|
210
|
-
|
222
|
+
VALID_OPTIONS
|
211
223
|
end
|
212
224
|
|
213
225
|
# Get the default validation setting for the relation. Determines if
|
@@ -10,6 +10,23 @@ module Mongoid
|
|
10
10
|
class Many < Relations::Many
|
11
11
|
include Batchable
|
12
12
|
|
13
|
+
# The allowed options when defining this relation.
|
14
|
+
#
|
15
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
16
|
+
#
|
17
|
+
# @since 6.0.0
|
18
|
+
VALID_OPTIONS = [
|
19
|
+
:as,
|
20
|
+
:cascade_callbacks,
|
21
|
+
:cyclic,
|
22
|
+
:order,
|
23
|
+
:store_as,
|
24
|
+
:before_add,
|
25
|
+
:after_add,
|
26
|
+
:before_remove,
|
27
|
+
:after_remove
|
28
|
+
].freeze
|
29
|
+
|
13
30
|
# Appends a document or array of documents to the relation. Will set
|
14
31
|
# the parent and update the index in the process.
|
15
32
|
#
|
@@ -41,11 +58,7 @@ module Mongoid
|
|
41
58
|
#
|
42
59
|
# @since 2.0.0.rc.1
|
43
60
|
def as_document
|
44
|
-
|
45
|
-
_unscoped.each do |doc|
|
46
|
-
attributes.push(doc.as_document)
|
47
|
-
end
|
48
|
-
attributes
|
61
|
+
as_attributes.collect { |attrs| BSON::Document.new(attrs) }
|
49
62
|
end
|
50
63
|
|
51
64
|
# Appends an array of documents to the relation. Performs a batch
|
@@ -60,7 +73,7 @@ module Mongoid
|
|
60
73
|
#
|
61
74
|
# @since 2.4.0
|
62
75
|
def concat(docs)
|
63
|
-
|
76
|
+
batch_insert(docs) unless docs.empty?
|
64
77
|
self
|
65
78
|
end
|
66
79
|
|
@@ -281,6 +294,29 @@ module Mongoid
|
|
281
294
|
end
|
282
295
|
end
|
283
296
|
|
297
|
+
# Shift documents off the relation. This can be a single document or
|
298
|
+
# multiples, and will automatically persist the changes.
|
299
|
+
#
|
300
|
+
# @example Shift a single document.
|
301
|
+
# relation.shift
|
302
|
+
#
|
303
|
+
# @example Shift multiple documents.
|
304
|
+
# relation.shift(3)
|
305
|
+
#
|
306
|
+
# @param [ Integer ] count The number of documents to shift, or 1 if not
|
307
|
+
# provided.
|
308
|
+
#
|
309
|
+
# @return [ Document, Array<Document> ] The shifted document(s).
|
310
|
+
def shift(count = nil)
|
311
|
+
if count
|
312
|
+
if target.size > 0 && docs = target[0, count]
|
313
|
+
docs.each { |doc| delete(doc) }
|
314
|
+
end
|
315
|
+
else
|
316
|
+
delete(target[0])
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
284
320
|
# Substitutes the supplied target documents for the existing documents
|
285
321
|
# in the relation.
|
286
322
|
#
|
@@ -496,6 +532,14 @@ module Mongoid
|
|
496
532
|
@_unscoped = docs
|
497
533
|
end
|
498
534
|
|
535
|
+
def as_attributes
|
536
|
+
attributes = []
|
537
|
+
_unscoped.each do |doc|
|
538
|
+
attributes.push(doc.as_document)
|
539
|
+
end
|
540
|
+
attributes
|
541
|
+
end
|
542
|
+
|
499
543
|
class << self
|
500
544
|
|
501
545
|
# Return the builder that is responsible for generating the documents
|
@@ -617,10 +661,7 @@ module Mongoid
|
|
617
661
|
#
|
618
662
|
# @since 2.1.0
|
619
663
|
def valid_options
|
620
|
-
|
621
|
-
:as, :cascade_callbacks, :cyclic, :order, :store_as,
|
622
|
-
:before_add, :after_add, :before_remove, :after_remove
|
623
|
-
]
|
664
|
+
VALID_OPTIONS
|
624
665
|
end
|
625
666
|
|
626
667
|
# Get the default validation setting for the relation. Determines if
|
@@ -7,6 +7,19 @@ module Mongoid
|
|
7
7
|
# relations.
|
8
8
|
class One < Relations::One
|
9
9
|
|
10
|
+
# The allowed options when defining this relation.
|
11
|
+
#
|
12
|
+
# @return [ Array<Symbol> ] The allowed options when defining this relation.
|
13
|
+
#
|
14
|
+
# @since 6.0.0
|
15
|
+
VALID_OPTIONS = [
|
16
|
+
:autobuild,
|
17
|
+
:as,
|
18
|
+
:cascade_callbacks,
|
19
|
+
:cyclic,
|
20
|
+
:store_as
|
21
|
+
].freeze
|
22
|
+
|
10
23
|
# Instantiate a new embeds_one relation.
|
11
24
|
#
|
12
25
|
# @example Create the new proxy.
|
@@ -200,7 +213,7 @@ module Mongoid
|
|
200
213
|
#
|
201
214
|
# @since 2.1.0
|
202
215
|
def valid_options
|
203
|
-
|
216
|
+
VALID_OPTIONS
|
204
217
|
end
|
205
218
|
|
206
219
|
# Get the default validation setting for the relation. Determines if
|
@@ -140,6 +140,7 @@ module Mongoid
|
|
140
140
|
aliased_fields[name.to_s] = meta.foreign_key
|
141
141
|
touchable(meta)
|
142
142
|
add_counter_cache_callbacks(meta) if meta.counter_cached?
|
143
|
+
validates(name, presence: true) if require_association?(options)
|
143
144
|
meta
|
144
145
|
end
|
145
146
|
|
@@ -197,7 +198,7 @@ module Mongoid
|
|
197
198
|
reference(meta, Array)
|
198
199
|
autosave(meta)
|
199
200
|
validates_relation(meta)
|
200
|
-
|
201
|
+
_synced(meta)
|
201
202
|
meta
|
202
203
|
end
|
203
204
|
|
@@ -350,9 +351,16 @@ module Mongoid
|
|
350
351
|
# @param [ Symbol ] name The name of the relation.
|
351
352
|
# @param [ Metadata ] metadata The metadata for the relation.
|
352
353
|
def relate(name, metadata)
|
354
|
+
Fields::Validators::Macro.validate_relation(self, name)
|
353
355
|
self.relations = relations.merge(name.to_s => metadata)
|
354
356
|
getter(name, metadata).setter(name, metadata).existence_check(name)
|
355
357
|
end
|
358
|
+
|
359
|
+
def require_association?(options = {})
|
360
|
+
required = options[:required] if options.key?(:required)
|
361
|
+
required = !options[:optional] if options.key?(:optional) && required.nil?
|
362
|
+
required.nil? ? Mongoid.belongs_to_required_by_default : required
|
363
|
+
end
|
356
364
|
end
|
357
365
|
end
|
358
366
|
end
|
@@ -778,10 +778,10 @@ module Mongoid
|
|
778
778
|
#
|
779
779
|
# @since 2.0.0.rc.1
|
780
780
|
def validate?
|
781
|
-
|
782
|
-
self[:validate]
|
783
|
-
else
|
781
|
+
if self[:validate].nil?
|
784
782
|
self[:validate] = relation.validation_default
|
783
|
+
else
|
784
|
+
self[:validate]
|
785
785
|
end
|
786
786
|
end
|
787
787
|
|
@@ -17,7 +17,7 @@ module Mongoid
|
|
17
17
|
:name,
|
18
18
|
:relation,
|
19
19
|
:validate
|
20
|
-
]
|
20
|
+
].freeze
|
21
21
|
|
22
22
|
# Determine if the provided options are valid for the relation.
|
23
23
|
#
|
@@ -32,7 +32,7 @@ module Mongoid
|
|
32
32
|
#
|
33
33
|
# @since 2.1.0
|
34
34
|
def validate!(options)
|
35
|
-
valid_options = options[:relation]
|
35
|
+
valid_options = options[:relation]::VALID_OPTIONS + COMMON
|
36
36
|
options.keys.each do |key|
|
37
37
|
if !valid_options.include?(key)
|
38
38
|
raise Errors::InvalidOptions.new(
|