mongoid 7.6.2 → 8.0.1
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 +2 -0
- data/README.md +3 -3
- data/Rakefile +21 -85
- data/lib/config/locales/en.yml +46 -56
- data/lib/mongoid/association/accessors.rb +32 -3
- data/lib/mongoid/association/bindable.rb +48 -0
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/depending.rb +4 -8
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +28 -5
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
- data/lib/mongoid/association/macros.rb +2 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +5 -39
- data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
- data/lib/mongoid/association/proxy.rb +12 -0
- data/lib/mongoid/association/referenced/auto_save.rb +3 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
- data/lib/mongoid/association/referenced/syncable.rb +2 -2
- data/lib/mongoid/association/relatable.rb +38 -4
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/factory.rb +0 -4
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config.rb +15 -73
- data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +63 -47
- data/lib/mongoid/contextual/mongo.rb +173 -287
- data/lib/mongoid/contextual/none.rb +33 -15
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +0 -12
- data/lib/mongoid/criteria/queryable/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +2 -133
- data/lib/mongoid/criteria/queryable/selector.rb +90 -5
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -28
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +88 -33
- data/lib/mongoid/equality.rb +4 -4
- data/lib/mongoid/errors/document_not_found.rb +6 -2
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +5 -1
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors.rb +2 -3
- data/lib/mongoid/extensions/array.rb +8 -6
- data/lib/mongoid/extensions/big_decimal.rb +29 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +13 -32
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/object.rb +2 -0
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +2 -13
- data/lib/mongoid/extensions/symbol.rb +3 -14
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +7 -0
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +49 -7
- data/lib/mongoid/findable.rb +21 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +4 -1
- data/lib/mongoid/interceptable.rb +69 -9
- data/lib/mongoid/matchable.rb +1 -6
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
- data/lib/mongoid/matcher/regex.rb +9 -8
- data/lib/mongoid/matcher.rb +0 -1
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistence_context.rb +8 -42
- data/lib/mongoid/query_cache.rb +6 -258
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/scopable.rb +9 -11
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/shardable.rb +11 -35
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/threaded.rb +0 -3
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +1 -0
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -5
- data/lib/mongoid/warnings.rb +3 -5
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -20
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +1 -15
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/regex.yml +0 -21
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +36 -51
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +60 -156
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +73 -198
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +480 -27
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +22 -60
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +52 -15
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +467 -156
- data/spec/mongoid/contextual/mongo_spec.rb +566 -426
- data/spec/mongoid/contextual/none_spec.rb +11 -19
- data/spec/mongoid/copyable_spec.rb +451 -2
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -2
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
- data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
- data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
- data/spec/mongoid/criteria_spec.rb +469 -1203
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/equality_spec.rb +12 -12
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -236
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +64 -29
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +16 -19
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +24 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +1 -156
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +36 -34
- data/spec/mongoid/serializable_spec.rb +14 -7
- data/spec/mongoid/shardable_models.rb +0 -14
- data/spec/mongoid/shardable_spec.rb +61 -153
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +1 -7
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/cluster_config.rb +40 -5
- data/spec/shared/lib/mrss/constraints.rb +46 -7
- data/spec/shared/lib/mrss/docker_runner.rb +21 -17
- data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
- data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
- data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
- data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
- data/spec/shared/lib/mrss/utils.rb +6 -28
- data/spec/shared/share/Dockerfile.erb +114 -38
- data/spec/shared/shlib/distro.sh +0 -10
- data/spec/shared/shlib/server.sh +83 -64
- data/spec/shared/shlib/set_env.sh +81 -16
- data/spec/support/constraints.rb +24 -0
- data/spec/support/expectations.rb +17 -20
- data/spec/support/macros.rb +30 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +0 -0
- metadata +695 -650
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/lib/mongoid/field_readable.rb +0 -70
- data/lib/mongoid/matcher/regexp_budget.rb +0 -389
- data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
- data/spec/integration/query_operator_guard_spec.rb +0 -89
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
- data/spec/shared/CANDIDATE.md +0 -28
- data/spec/shared/lib/mrss/release/candidate.rb +0 -287
- data/spec/shared/lib/mrss/release/product_data.rb +0 -144
- data/spec/shared/lib/tasks/candidate.rake +0 -64
data/lib/mongoid/findable.rb
CHANGED
|
@@ -38,6 +38,7 @@ module Mongoid
|
|
|
38
38
|
:max,
|
|
39
39
|
:min,
|
|
40
40
|
:none,
|
|
41
|
+
:pick,
|
|
41
42
|
:pluck,
|
|
42
43
|
:read,
|
|
43
44
|
:sum,
|
|
@@ -121,6 +122,13 @@ module Mongoid
|
|
|
121
122
|
# strings will be transparently converted to +BSON::ObjectId+ instances
|
|
122
123
|
# during query construction.
|
|
123
124
|
#
|
|
125
|
+
# If this method is given a block, it delegates to +Enumerable#find+ and
|
|
126
|
+
# returns the first document of those found by the current Crieria object
|
|
127
|
+
# for which the block returns a truthy value. If both a block and ids are
|
|
128
|
+
# given, the block is ignored and the documents for the given ids are
|
|
129
|
+
# returned. If a block and a Proc are given, the method delegates to
|
|
130
|
+
# +Enumerable#find+ and uses the proc as the default.
|
|
131
|
+
#
|
|
124
132
|
# The +find+ method takes into account the default scope defined on the
|
|
125
133
|
# model class, if any.
|
|
126
134
|
#
|
|
@@ -131,8 +139,13 @@ module Mongoid
|
|
|
131
139
|
#
|
|
132
140
|
# @raise Errors::DocumentNotFound If not all documents are found and
|
|
133
141
|
# the +raise_not_found_error+ Mongoid configuration option is truthy.
|
|
134
|
-
def find(*args)
|
|
135
|
-
|
|
142
|
+
def find(*args, &block)
|
|
143
|
+
empty_or_proc = args.empty? || (args.length == 1 && args.first.is_a?(Proc))
|
|
144
|
+
if block_given? && empty_or_proc
|
|
145
|
+
with_default_scope.find(*args, &block)
|
|
146
|
+
else
|
|
147
|
+
with_default_scope.find(*args)
|
|
148
|
+
end
|
|
136
149
|
end
|
|
137
150
|
|
|
138
151
|
# Find the first +Document+ given the conditions.
|
|
@@ -182,15 +195,11 @@ module Mongoid
|
|
|
182
195
|
# @example Find the first document.
|
|
183
196
|
# Person.first
|
|
184
197
|
#
|
|
185
|
-
# @param [ Integer
|
|
186
|
-
# return, or a hash of options.
|
|
187
|
-
#
|
|
188
|
-
# @option limit_or_opts [ :none ] :id_sort This option is deprecated.
|
|
189
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
|
198
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
190
199
|
#
|
|
191
200
|
# @return [ Document ] The first matching document.
|
|
192
|
-
def first(
|
|
193
|
-
with_default_scope.first(
|
|
201
|
+
def first(limit = nil)
|
|
202
|
+
with_default_scope.first(limit)
|
|
194
203
|
end
|
|
195
204
|
alias :one :first
|
|
196
205
|
|
|
@@ -199,15 +208,11 @@ module Mongoid
|
|
|
199
208
|
# @example Find the last document.
|
|
200
209
|
# Person.last
|
|
201
210
|
#
|
|
202
|
-
# @param [ Integer
|
|
203
|
-
# return, or a hash of options.
|
|
204
|
-
#
|
|
205
|
-
# @option limit_or_opts [ :none ] :id_sort This option is deprecated.
|
|
206
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
|
211
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
207
212
|
#
|
|
208
213
|
# @return [ Document ] The last matching document.
|
|
209
|
-
def last(
|
|
210
|
-
with_default_scope.last(
|
|
214
|
+
def last(limit = nil)
|
|
215
|
+
with_default_scope.last(limit)
|
|
211
216
|
end
|
|
212
217
|
end
|
|
213
218
|
end
|
|
@@ -13,7 +13,6 @@ module Mongoid
|
|
|
13
13
|
:database,
|
|
14
14
|
:default_language,
|
|
15
15
|
:language_override,
|
|
16
|
-
:drop_dups,
|
|
17
16
|
:name,
|
|
18
17
|
:sparse,
|
|
19
18
|
:unique,
|
|
@@ -98,6 +97,10 @@ module Mongoid
|
|
|
98
97
|
unless VALID_TYPES.include?(value)
|
|
99
98
|
raise Errors::InvalidIndex.new(klass, spec, options)
|
|
100
99
|
end
|
|
100
|
+
|
|
101
|
+
if value == "geoHaystack"
|
|
102
|
+
Mongoid::Warnings.warn_geo_haystack_deprecated
|
|
103
|
+
end
|
|
101
104
|
end
|
|
102
105
|
end
|
|
103
106
|
end
|
|
@@ -27,7 +27,7 @@ module Mongoid
|
|
|
27
27
|
:before_save,
|
|
28
28
|
:before_update,
|
|
29
29
|
:before_upsert,
|
|
30
|
-
:before_validation
|
|
30
|
+
:before_validation,
|
|
31
31
|
].freeze
|
|
32
32
|
|
|
33
33
|
included do
|
|
@@ -37,6 +37,12 @@ module Mongoid
|
|
|
37
37
|
define_model_callbacks :build, :find, :initialize, :touch, only: :after
|
|
38
38
|
define_model_callbacks :create, :destroy, :save, :update, :upsert
|
|
39
39
|
|
|
40
|
+
# This callback is used internally by Mongoid to save association
|
|
41
|
+
# targets for referenced associations after the parent model is persisted.
|
|
42
|
+
#
|
|
43
|
+
# @api private
|
|
44
|
+
define_model_callbacks :persist_parent
|
|
45
|
+
|
|
40
46
|
attr_accessor :before_callback_halted
|
|
41
47
|
end
|
|
42
48
|
|
|
@@ -109,22 +115,76 @@ module Mongoid
|
|
|
109
115
|
# end
|
|
110
116
|
#
|
|
111
117
|
# @param [ Symbol ] kind The type of callback to execute.
|
|
112
|
-
# @param [
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
118
|
+
# @param [ true | false ] with_children Flag specifies whether callbacks of embedded document should be run.
|
|
119
|
+
def run_callbacks(kind, with_children: true, &block)
|
|
120
|
+
if with_children
|
|
121
|
+
cascadable_children(kind).each do |child|
|
|
122
|
+
if child.run_callbacks(child_callback_type(kind, child), with_children: with_children) == false
|
|
123
|
+
return false
|
|
124
|
+
end
|
|
119
125
|
end
|
|
120
126
|
end
|
|
121
127
|
if callback_executable?(kind)
|
|
122
|
-
super(kind,
|
|
128
|
+
super(kind, &block)
|
|
123
129
|
else
|
|
124
130
|
true
|
|
125
131
|
end
|
|
126
132
|
end
|
|
127
133
|
|
|
134
|
+
# Run the callbacks for embedded documents.
|
|
135
|
+
#
|
|
136
|
+
# @param [ Symbol ] kind The type of callback to execute.
|
|
137
|
+
# @param [ Array<Document> ] children Children to exeute callbacks on. If
|
|
138
|
+
# nil, callbacks will be executed on all cascadable children of
|
|
139
|
+
# the document.
|
|
140
|
+
#
|
|
141
|
+
# @api private
|
|
142
|
+
def _mongoid_run_child_callbacks(kind, children: nil, &block)
|
|
143
|
+
child, *tail = (children || cascadable_children(kind))
|
|
144
|
+
if child.nil?
|
|
145
|
+
return block&.call
|
|
146
|
+
elsif tail.empty?
|
|
147
|
+
return child.run_callbacks(child_callback_type(kind, child), &block)
|
|
148
|
+
else
|
|
149
|
+
return child.run_callbacks(child_callback_type(kind, child)) do
|
|
150
|
+
_mongoid_run_child_callbacks(kind, children: tail, &block)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# This is used to store callbacks to be executed later. A good use case for
|
|
156
|
+
# this is delaying the after_find and after_initialize callbacks until the
|
|
157
|
+
# associations are set on the document. This can also be used to delay
|
|
158
|
+
# applying the defaults on a document.
|
|
159
|
+
#
|
|
160
|
+
# @return [ Array<Symbol> ] an array of symbols that represent the pending callbacks.
|
|
161
|
+
#
|
|
162
|
+
# @api private
|
|
163
|
+
def pending_callbacks
|
|
164
|
+
@pending_callbacks ||= [].to_set
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# @api private
|
|
168
|
+
def pending_callbacks=(value)
|
|
169
|
+
@pending_callbacks = value
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Run the pending callbacks. If the callback is :apply_defaults, we will apply
|
|
173
|
+
# the defaults for this document. Otherwise, the callback is passed to the
|
|
174
|
+
# run_callbacks function.
|
|
175
|
+
#
|
|
176
|
+
# @api private
|
|
177
|
+
def run_pending_callbacks
|
|
178
|
+
pending_callbacks.each do |cb|
|
|
179
|
+
if [:apply_defaults, :apply_post_processed_defaults].include?(cb)
|
|
180
|
+
send(cb)
|
|
181
|
+
else
|
|
182
|
+
self.run_callbacks(cb, with_children: false)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
pending_callbacks.clear
|
|
186
|
+
end
|
|
187
|
+
|
|
128
188
|
private
|
|
129
189
|
|
|
130
190
|
# We need to hook into this for autosave, since we don't want it firing if
|
data/lib/mongoid/matchable.rb
CHANGED
|
@@ -17,12 +17,7 @@ module Mongoid
|
|
|
17
17
|
#
|
|
18
18
|
# @return [ true, false ] True if matches, false if not.
|
|
19
19
|
def _matches?(selector)
|
|
20
|
-
|
|
21
|
-
# documents against one selector open a budget of their own first, and
|
|
22
|
-
# this one joins it rather than giving every document a fresh limit.
|
|
23
|
-
Matcher::RegexpBudget.open(selector) do
|
|
24
|
-
Matcher::Expression.matches?(self, selector)
|
|
25
|
-
end
|
|
20
|
+
Matcher::Expression.matches?(self, selector)
|
|
26
21
|
end
|
|
27
22
|
end
|
|
28
23
|
end
|
|
@@ -6,10 +6,12 @@ module Mongoid
|
|
|
6
6
|
#
|
|
7
7
|
# @api private
|
|
8
8
|
module EqImplWithRegexp
|
|
9
|
-
module_function def matches?(
|
|
9
|
+
module_function def matches?(original_operator, value, condition)
|
|
10
10
|
case condition
|
|
11
|
-
when Regexp
|
|
12
|
-
value
|
|
11
|
+
when Regexp
|
|
12
|
+
value =~ condition
|
|
13
|
+
when ::BSON::Regexp::Raw
|
|
14
|
+
value =~ condition.compile
|
|
13
15
|
else
|
|
14
16
|
if Mongoid.compare_time_by_ms &&
|
|
15
17
|
value.kind_of?(Time) && condition.kind_of?(Time)
|
|
@@ -3,24 +3,25 @@ module Mongoid
|
|
|
3
3
|
|
|
4
4
|
# @api private
|
|
5
5
|
module Regex
|
|
6
|
-
module_function def matches?(
|
|
7
|
-
|
|
6
|
+
module_function def matches?(exists, value, condition)
|
|
7
|
+
condition = case condition
|
|
8
|
+
when Regexp
|
|
9
|
+
condition
|
|
10
|
+
when BSON::Regexp::Raw
|
|
11
|
+
condition.compile
|
|
12
|
+
else
|
|
8
13
|
# Note that strings must have been converted to a regular expression
|
|
9
14
|
# instance already (with $options taken into account, if provided).
|
|
10
15
|
raise Errors::InvalidQuery, "$regex requires a regular expression argument: #{Errors::InvalidQuery.truncate_expr(condition)}"
|
|
11
16
|
end
|
|
12
17
|
|
|
13
|
-
# The condition is compiled by RegexpBudget rather than here, so that
|
|
14
|
-
# the budget's timeout can be baked into the pattern.
|
|
15
18
|
case value
|
|
16
19
|
when Array
|
|
17
|
-
# Object#=~ is gone as of Ruby 3.2, so an element that cannot be
|
|
18
|
-
# matched against has to be rejected rather than passed to =~.
|
|
19
20
|
value.any? do |v|
|
|
20
|
-
v
|
|
21
|
+
v =~ condition
|
|
21
22
|
end
|
|
22
23
|
when String
|
|
23
|
-
|
|
24
|
+
value =~ condition
|
|
24
25
|
else
|
|
25
26
|
false
|
|
26
27
|
end
|
data/lib/mongoid/matcher.rb
CHANGED
|
@@ -104,7 +104,6 @@ require 'mongoid/matcher/nor'
|
|
|
104
104
|
require 'mongoid/matcher/not'
|
|
105
105
|
require 'mongoid/matcher/or'
|
|
106
106
|
require 'mongoid/matcher/regex'
|
|
107
|
-
require 'mongoid/matcher/regexp_budget'
|
|
108
107
|
require 'mongoid/matcher/size'
|
|
109
108
|
require 'mongoid/matcher/type'
|
|
110
109
|
require 'mongoid/matcher/expression_operator'
|
|
@@ -102,13 +102,22 @@ module Mongoid
|
|
|
102
102
|
def prepare_insert(options = {})
|
|
103
103
|
return self if performing_validations?(options) &&
|
|
104
104
|
invalid?(options[:context] || :create)
|
|
105
|
-
|
|
106
|
-
run_callbacks(:create) do
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
run_callbacks(:save, with_children: false) do
|
|
106
|
+
run_callbacks(:create, with_children: false) do
|
|
107
|
+
run_callbacks(:persist_parent, with_children: false) do
|
|
108
|
+
_mongoid_run_child_callbacks(:save) do
|
|
109
|
+
_mongoid_run_child_callbacks(:create) do
|
|
110
|
+
result = yield(self)
|
|
111
|
+
if !result.is_a?(Document) || result.errors.empty?
|
|
112
|
+
post_process_insert
|
|
113
|
+
post_process_persist(result, options)
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
109
118
|
end
|
|
110
119
|
end
|
|
111
|
-
|
|
120
|
+
self
|
|
112
121
|
end
|
|
113
122
|
|
|
114
123
|
module ClassMethods
|
|
@@ -96,13 +96,20 @@ module Mongoid
|
|
|
96
96
|
return false if performing_validations?(options) &&
|
|
97
97
|
invalid?(options[:context] || :update)
|
|
98
98
|
process_flagged_destroys
|
|
99
|
-
|
|
100
|
-
run_callbacks(:update) do
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
run_callbacks(:save, with_children: false) do
|
|
100
|
+
run_callbacks(:update, with_children: false) do
|
|
101
|
+
run_callbacks(:persist_parent, with_children: false) do
|
|
102
|
+
_mongoid_run_child_callbacks(:save) do
|
|
103
|
+
_mongoid_run_child_callbacks(:update) do
|
|
104
|
+
result = yield(self)
|
|
105
|
+
self.previously_new_record = false
|
|
106
|
+
post_process_persist(result, options)
|
|
107
|
+
true
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
103
111
|
end
|
|
104
112
|
end
|
|
105
|
-
post_process_persist(result, options) and result
|
|
106
113
|
end
|
|
107
114
|
|
|
108
115
|
# Update the document in the database.
|
|
@@ -57,7 +57,9 @@ module Mongoid
|
|
|
57
57
|
# @return [ Mongo::Collection ] The collection for this persistence
|
|
58
58
|
# context.
|
|
59
59
|
def collection(parent = nil)
|
|
60
|
-
parent ?
|
|
60
|
+
parent ?
|
|
61
|
+
parent.collection.with(client_options.except(:database, "database")) :
|
|
62
|
+
client[collection_name.to_sym]
|
|
61
63
|
end
|
|
62
64
|
|
|
63
65
|
# Get the collection name for this persistence context.
|
|
@@ -187,7 +189,8 @@ module Mongoid
|
|
|
187
189
|
#
|
|
188
190
|
# @return [ Mongoid::PersistenceContext ] The persistence context for the object.
|
|
189
191
|
def set(object, options_or_context)
|
|
190
|
-
|
|
192
|
+
key = "[mongoid][#{object.object_id}]:context"
|
|
193
|
+
existing_context = Thread.current[key]
|
|
191
194
|
existing_options = if existing_context
|
|
192
195
|
existing_context.options
|
|
193
196
|
else
|
|
@@ -198,7 +201,7 @@ module Mongoid
|
|
|
198
201
|
end
|
|
199
202
|
new_options = existing_options.merge(options_or_context)
|
|
200
203
|
context = PersistenceContext.new(object, new_options)
|
|
201
|
-
|
|
204
|
+
Thread.current[key] = context
|
|
202
205
|
end
|
|
203
206
|
|
|
204
207
|
# Get the persistence context for a particular class or model instance.
|
|
@@ -210,7 +213,7 @@ module Mongoid
|
|
|
210
213
|
#
|
|
211
214
|
# @return [ Mongoid::PersistenceContext ] The persistence context for the object.
|
|
212
215
|
def get(object)
|
|
213
|
-
|
|
216
|
+
Thread.current["[mongoid][#{object.object_id}]:context"]
|
|
214
217
|
end
|
|
215
218
|
|
|
216
219
|
# Clear the persistence context for a particular class or model instance.
|
|
@@ -229,44 +232,7 @@ module Mongoid
|
|
|
229
232
|
end
|
|
230
233
|
end
|
|
231
234
|
ensure
|
|
232
|
-
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
private
|
|
236
|
-
|
|
237
|
-
# Key to store persistence contexts in the thread local storage.
|
|
238
|
-
#
|
|
239
|
-
# @api private
|
|
240
|
-
PERSISTENCE_CONTEXT_KEY = :"[mongoid]:persistence_context"
|
|
241
|
-
|
|
242
|
-
# Get the persistence context for a given object from the thread local
|
|
243
|
-
# storage.
|
|
244
|
-
#
|
|
245
|
-
# @param [ Object ] object Object to get the persistance context for.
|
|
246
|
-
#
|
|
247
|
-
# @return [ Mongoid::PersistenceContext | nil ] The persistence context
|
|
248
|
-
# for the object if previously stored, otherwise nil.
|
|
249
|
-
#
|
|
250
|
-
# @api private
|
|
251
|
-
def get_context(object)
|
|
252
|
-
Thread.current[PERSISTENCE_CONTEXT_KEY] ||= {}
|
|
253
|
-
Thread.current[PERSISTENCE_CONTEXT_KEY][object.object_id]
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
# Store persistence context for a given object in the thread local
|
|
257
|
-
# storage.
|
|
258
|
-
#
|
|
259
|
-
# @param [ Object ] object Object to store the persistance context for.
|
|
260
|
-
# @param [ Mongoid::PersistenceContext ] context Context to store
|
|
261
|
-
#
|
|
262
|
-
# @api private
|
|
263
|
-
def store_context(object, context)
|
|
264
|
-
if context.nil?
|
|
265
|
-
Thread.current[PERSISTENCE_CONTEXT_KEY]&.delete(object.object_id)
|
|
266
|
-
else
|
|
267
|
-
Thread.current[PERSISTENCE_CONTEXT_KEY] ||= {}
|
|
268
|
-
Thread.current[PERSISTENCE_CONTEXT_KEY][object.object_id] = context
|
|
269
|
-
end
|
|
235
|
+
Thread.current["[mongoid][#{object.object_id}]:context"] = original_context
|
|
270
236
|
end
|
|
271
237
|
end
|
|
272
238
|
end
|