mongoid 7.4.0 → 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 +0 -0
- data/README.md +3 -3
- data/lib/config/locales/en.yml +51 -28
- 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/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +48 -8
- 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 +22 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +2 -1
- 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 -14
- data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
- 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/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config/environment.rb +20 -4
- data/lib/mongoid/config.rb +25 -10
- data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +176 -17
- data/lib/mongoid/contextual/mongo.rb +226 -206
- data/lib/mongoid/contextual/none.rb +66 -4
- 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 -13
- 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 -14
- 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 +21 -0
- 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 +28 -34
- data/lib/mongoid/criteria/queryable/selector.rb +89 -4
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -26
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +96 -32
- data/lib/mongoid/errors/document_not_found.rb +29 -8
- 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 -2
- 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 +12 -5
- 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 +194 -28
- data/lib/mongoid/findable.rb +27 -7
- 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/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +19 -2
- 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/selectable.rb +1 -2
- data/lib/mongoid/stateful.rb +27 -1
- 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 +5 -1
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
- data/spec/config/mongoid.yml +16 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +28 -26
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +28 -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/matcher_examples_spec.rb +20 -13
- 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/lite_spec_helper.rb +1 -1
- 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 +219 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -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 +67 -4
- 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 +8 -8
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
- 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/atomic_spec.rb +22 -0
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- 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 +524 -27
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +34 -42
- data/spec/mongoid/clients/options_spec.rb +1 -0
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +32 -2
- data/spec/mongoid/config/environment_spec.rb +39 -1
- data/spec/mongoid/config_spec.rb +104 -13
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- 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 +1337 -69
- data/spec/mongoid/contextual/mongo_spec.rb +1105 -172
- data/spec/mongoid/contextual/none_spec.rb +38 -0
- data/spec/mongoid/copyable_spec.rb +451 -1
- 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/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- 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 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
- data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
- data/spec/mongoid/criteria_spec.rb +474 -1198
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
- 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 -0
- 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 +80 -15
- 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 +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +21 -1
- data/spec/mongoid/shardable_spec.rb +14 -0
- 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/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/constraints.rb +8 -16
- data/spec/shared/lib/mrss/docker_runner.rb +23 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
- data/spec/shared/share/Dockerfile.erb +34 -48
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/server.sh +32 -19
- data/spec/shared/shlib/set_env.sh +37 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +39 -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/code.rb +2 -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/membership.rb +1 -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/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/spec_config.rb +4 -0
- data.tar.gz.sig +0 -0
- metadata +76 -13
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -50,7 +50,7 @@ module Mongoid
|
|
50
50
|
# @example Get the distinct values in null context.
|
51
51
|
# context.distinct(:name)
|
52
52
|
#
|
53
|
-
# @param [ String
|
53
|
+
# @param [ String | Symbol ] _field The name of the field.
|
54
54
|
#
|
55
55
|
# @return [ Array ] An empty Array.
|
56
56
|
def distinct(_field)
|
@@ -88,13 +88,37 @@ module Mongoid
|
|
88
88
|
# @example Get the values for null context.
|
89
89
|
# context.pluck(:name)
|
90
90
|
#
|
91
|
-
# @param [ String
|
91
|
+
# @param [ String | Symbol ] *_fields Field or fields to pluck.
|
92
92
|
#
|
93
93
|
# @return [ Array ] An empty Array.
|
94
|
-
def pluck(*
|
94
|
+
def pluck(*_fields)
|
95
95
|
[]
|
96
96
|
end
|
97
97
|
|
98
|
+
# Pick the field values in null context.
|
99
|
+
#
|
100
|
+
# @example Get the value for null context.
|
101
|
+
# context.pick(:name)
|
102
|
+
#
|
103
|
+
# @param [ String | Symbol ] *_fields Field or fields to pick.
|
104
|
+
#
|
105
|
+
# @return [ nil ] Always reeturn nil.
|
106
|
+
def pick(*_fields)
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
# Tally the field values in null context.
|
111
|
+
#
|
112
|
+
# @example Get the values for null context.
|
113
|
+
# context.tally(:name)
|
114
|
+
#
|
115
|
+
# @param [ String | Symbol ] _field Field to tally.
|
116
|
+
#
|
117
|
+
# @return [ Hash ] An empty Hash.
|
118
|
+
def tally(_field)
|
119
|
+
{}
|
120
|
+
end
|
121
|
+
|
98
122
|
# Create the new null context.
|
99
123
|
#
|
100
124
|
# @example Create the new context.
|
@@ -105,13 +129,51 @@ module Mongoid
|
|
105
129
|
@criteria, @klass = criteria, criteria.klass
|
106
130
|
end
|
107
131
|
|
132
|
+
# Always returns nil.
|
133
|
+
#
|
134
|
+
# @example Get the first document in null context.
|
135
|
+
# context.first
|
136
|
+
#
|
137
|
+
# @param [ Integer ] limit The number of documents to return.
|
138
|
+
#
|
139
|
+
# @return [ nil ] Always nil.
|
140
|
+
def first(limit = nil)
|
141
|
+
[] unless limit.nil?
|
142
|
+
end
|
143
|
+
|
108
144
|
# Always returns nil.
|
109
145
|
#
|
110
146
|
# @example Get the last document in null context.
|
111
147
|
# context.last
|
112
148
|
#
|
149
|
+
# @param [ Integer ] limit The number of documents to return.
|
150
|
+
#
|
113
151
|
# @return [ nil ] Always nil.
|
114
|
-
def last
|
152
|
+
def last(limit = nil)
|
153
|
+
[] unless limit.nil?
|
154
|
+
end
|
155
|
+
|
156
|
+
# Returns nil or empty array.
|
157
|
+
#
|
158
|
+
# @example Take a document in null context.
|
159
|
+
# context.take
|
160
|
+
#
|
161
|
+
# @param [ Integer | nil ] limit The number of documents to take or nil.
|
162
|
+
#
|
163
|
+
# @return [ [] | nil ] Empty array or nil.
|
164
|
+
def take(limit = nil)
|
165
|
+
limit ? [] : nil
|
166
|
+
end
|
167
|
+
|
168
|
+
# Always raises an error.
|
169
|
+
#
|
170
|
+
# @example Take a document in null context.
|
171
|
+
# context.take!
|
172
|
+
#
|
173
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] always raises.
|
174
|
+
def take!
|
175
|
+
raise Errors::DocumentNotFound.new(klass, nil, nil)
|
176
|
+
end
|
115
177
|
|
116
178
|
# Always returns zero.
|
117
179
|
#
|
data/lib/mongoid/copyable.rb
CHANGED
@@ -10,7 +10,11 @@ module Mongoid
|
|
10
10
|
# the exception of the document's id, and will reset all the
|
11
11
|
# instance variables.
|
12
12
|
#
|
13
|
-
# This clone also includes embedded documents.
|
13
|
+
# This clone also includes embedded documents. If there is an _id field in
|
14
|
+
# the embedded document, it will be maintained, unlike the root's _id.
|
15
|
+
#
|
16
|
+
# If cloning an embedded child, the embedded parent is not cloned and the
|
17
|
+
# embedded_in association is not set.
|
14
18
|
#
|
15
19
|
# @example Clone the document.
|
16
20
|
# document.clone
|
@@ -19,19 +23,42 @@ module Mongoid
|
|
19
23
|
def clone
|
20
24
|
# @note This next line is here to address #2704, even though having an
|
21
25
|
# _id and id field in the document would cause problems with Mongoid
|
22
|
-
# elsewhere.
|
26
|
+
# elsewhere. Note this is only done on the root document as we want
|
27
|
+
# to maintain the same _id on the embedded documents.
|
23
28
|
attrs = clone_document.except(*self.class.id_fields)
|
29
|
+
Copyable.clone_with_hash(self.class, attrs)
|
30
|
+
end
|
31
|
+
alias :dup :clone
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# Create clone of a document of the given klass with the given attributes
|
36
|
+
# hash. This is used recursively so that embedded associations are cloned
|
37
|
+
# safely.
|
38
|
+
#
|
39
|
+
# @param klass [ Class ] The class of the document to create.
|
40
|
+
# @param attrs [ Hash ] The hash of the attributes.
|
41
|
+
#
|
42
|
+
# @return [ Document ] The new document.
|
43
|
+
def self.clone_with_hash(klass, attrs)
|
24
44
|
dynamic_attrs = {}
|
25
|
-
_attribute_names =
|
45
|
+
_attribute_names = klass.attribute_names
|
26
46
|
attrs.reject! do |attr_name, value|
|
27
47
|
unless _attribute_names.include?(attr_name)
|
28
48
|
dynamic_attrs[attr_name] = value
|
29
49
|
true
|
30
50
|
end
|
31
51
|
end
|
32
|
-
|
52
|
+
|
53
|
+
Factory.build(klass, attrs).tap do |object|
|
33
54
|
dynamic_attrs.each do |attr_name, value|
|
34
|
-
|
55
|
+
assoc = object.embedded_relations[attr_name]
|
56
|
+
if assoc&.one? && Hash === value
|
57
|
+
object.send("#{attr_name}=", clone_with_hash(assoc.klass, value))
|
58
|
+
elsif assoc&.many? && Array === value
|
59
|
+
docs = value.map { |h| clone_with_hash(assoc.klass, h) }
|
60
|
+
object.send("#{attr_name}=", docs)
|
61
|
+
elsif object.respond_to?("#{attr_name}=")
|
35
62
|
object.send("#{attr_name}=", value)
|
36
63
|
else
|
37
64
|
object.attributes[attr_name] = value
|
@@ -39,9 +66,6 @@ module Mongoid
|
|
39
66
|
end
|
40
67
|
end
|
41
68
|
end
|
42
|
-
alias :dup :clone
|
43
|
-
|
44
|
-
private
|
45
69
|
|
46
70
|
# Clone the document attributes
|
47
71
|
#
|
@@ -26,15 +26,12 @@ module Mongoid
|
|
26
26
|
#
|
27
27
|
# @return [ Criteria ] The cloned criteria.
|
28
28
|
def includes(*relations)
|
29
|
-
extract_includes_list(klass, relations)
|
29
|
+
extract_includes_list(klass, nil, relations)
|
30
30
|
clone
|
31
31
|
end
|
32
32
|
|
33
33
|
# Get a list of criteria that are to be executed for eager loading.
|
34
34
|
#
|
35
|
-
# @example Get the eager loading inclusions.
|
36
|
-
# Person.includes(:game).inclusions
|
37
|
-
#
|
38
35
|
# @return [ Array<Association> ] The inclusions.
|
39
36
|
def inclusions
|
40
37
|
@inclusions ||= []
|
@@ -42,9 +39,6 @@ module Mongoid
|
|
42
39
|
|
43
40
|
# Set the inclusions for the criteria.
|
44
41
|
#
|
45
|
-
# @example Set the inclusions.
|
46
|
-
# criteria.inclusions = [ association ]
|
47
|
-
#
|
48
42
|
# @param [ Array<Association> ] value The inclusions.
|
49
43
|
#
|
50
44
|
# @return [ Array<Association> ] The new inclusions.
|
@@ -56,30 +50,40 @@ module Mongoid
|
|
56
50
|
|
57
51
|
# Add an inclusion definition to the list of inclusions for the criteria.
|
58
52
|
#
|
59
|
-
# @
|
60
|
-
#
|
61
|
-
#
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
53
|
+
# @param [ Association ] association The association.
|
54
|
+
# @param [ String ] parent The name of the association above this one in
|
55
|
+
# the inclusion tree, if it is a nested inclusion.
|
56
|
+
def add_inclusion(association, parent = nil)
|
57
|
+
if assoc = inclusions.detect { |a| a == association }
|
58
|
+
assoc.parent_inclusions.push(parent) if parent
|
59
|
+
else
|
60
|
+
assoc = association.dup
|
61
|
+
assoc.parent_inclusions = []
|
62
|
+
assoc.parent_inclusions.push(parent) if parent
|
63
|
+
inclusions.push(assoc)
|
64
|
+
end
|
68
65
|
end
|
69
66
|
|
70
|
-
|
67
|
+
# Iterate through the list of relations and create the inclusions list.
|
68
|
+
#
|
69
|
+
# @param [ Class, String, Symbol ] _parent_class The class from which the
|
70
|
+
# association originates.
|
71
|
+
# @param [ String ] parent The name of the association above this one in
|
72
|
+
# the inclusion tree, if it is a nested inclusion.
|
73
|
+
# @param relations_list The names of the associations to eager load.
|
74
|
+
def extract_includes_list(_parent_class, parent, *relations_list)
|
71
75
|
relations_list.flatten.each do |relation_object|
|
72
76
|
if relation_object.is_a?(Hash)
|
73
77
|
relation_object.each do |relation, _includes|
|
74
78
|
association = _parent_class.reflect_on_association(relation)
|
75
79
|
raise Errors::InvalidIncludes.new(_klass, [ relation ]) unless association
|
76
|
-
add_inclusion(
|
77
|
-
extract_includes_list(association.klass, _includes)
|
80
|
+
add_inclusion(association, parent)
|
81
|
+
extract_includes_list(association.klass, association.name, _includes)
|
78
82
|
end
|
79
83
|
else
|
80
84
|
association = _parent_class.reflect_on_association(relation_object)
|
81
85
|
raise Errors::InvalidIncludes.new(_parent_class, [ relation_object ]) unless association
|
82
|
-
add_inclusion(
|
86
|
+
add_inclusion(association, parent)
|
83
87
|
end
|
84
88
|
end
|
85
89
|
end
|
@@ -9,9 +9,12 @@ module Mongoid
|
|
9
9
|
# @example Dump the criteria.
|
10
10
|
# Marshal.dump(criteria)
|
11
11
|
#
|
12
|
+
# Note :mongo is written here for backwards compatibility with Mongoid 7
|
13
|
+
# and earlier.
|
14
|
+
#
|
12
15
|
# @return [ Array<Object> ] The dumped data.
|
13
16
|
def marshal_dump
|
14
|
-
data = [ klass,
|
17
|
+
data = [ klass, :mongo, inclusions, documents, strategy, negating ]
|
15
18
|
data.push(scoping_options).push(dump_hash(:selector)).push(dump_hash(:options))
|
16
19
|
end
|
17
20
|
|
@@ -23,7 +26,12 @@ module Mongoid
|
|
23
26
|
# @param [ Array ] data The raw data.
|
24
27
|
def marshal_load(data)
|
25
28
|
@scoping_options, raw_selector, raw_options = data.pop(3)
|
26
|
-
@klass,
|
29
|
+
@klass, driver, @inclusions, @documents, @strategy, @negating = data
|
30
|
+
|
31
|
+
if driver == :mongo1x
|
32
|
+
raise NotImplementedError, "Mongoid no longer supports marshalling with driver version 1.x."
|
33
|
+
end
|
34
|
+
|
27
35
|
@selector = load_hash(Queryable::Selector, raw_selector)
|
28
36
|
@options = load_hash(Queryable::Options, raw_options)
|
29
37
|
end
|
@@ -108,18 +108,6 @@ module Mongoid
|
|
108
108
|
{ first => last.to_direction }
|
109
109
|
end
|
110
110
|
|
111
|
-
# Update all the values in the hash with the provided block.
|
112
|
-
#
|
113
|
-
# @example Update the values in place.
|
114
|
-
# [ 1, 2, 3 ].update_values(&:to_s)
|
115
|
-
#
|
116
|
-
# @param [ Proc ] block The block to execute on each value.
|
117
|
-
#
|
118
|
-
# @return [ Array ] the array.
|
119
|
-
def update_values(&block)
|
120
|
-
replace(map(&block))
|
121
|
-
end
|
122
|
-
|
123
111
|
private
|
124
112
|
|
125
113
|
# Converts the array to a multi-dimensional array.
|
@@ -145,7 +133,8 @@ module Mongoid
|
|
145
133
|
#
|
146
134
|
# @return [ Object ] The evolved object.
|
147
135
|
def evolve(object)
|
148
|
-
|
136
|
+
case object
|
137
|
+
when ::Array, ::Set
|
149
138
|
object.map { |obj| obj.class.evolve(obj) }
|
150
139
|
else
|
151
140
|
object
|
@@ -12,18 +12,39 @@ module Mongoid
|
|
12
12
|
module BigDecimal
|
13
13
|
module ClassMethods
|
14
14
|
|
15
|
-
# Evolves the big decimal into a MongoDB friendly value
|
16
|
-
# a string.
|
15
|
+
# Evolves the big decimal into a MongoDB friendly value.
|
17
16
|
#
|
18
17
|
# @example Evolve the big decimal
|
19
18
|
# BigDecimal.evolve(decimal)
|
20
19
|
#
|
21
20
|
# @param [ BigDecimal ] object The object to convert.
|
22
21
|
#
|
23
|
-
# @return [
|
22
|
+
# @return [ Object ] The big decimal as a string, a Decimal128,
|
23
|
+
# or the inputted object if it is uncastable.
|
24
24
|
def evolve(object)
|
25
25
|
__evolve__(object) do |obj|
|
26
|
-
|
26
|
+
return if obj.nil?
|
27
|
+
case obj
|
28
|
+
when ::BigDecimal
|
29
|
+
if Mongoid.map_big_decimal_to_decimal128
|
30
|
+
BSON::Decimal128.new(obj)
|
31
|
+
else
|
32
|
+
obj.to_s
|
33
|
+
end
|
34
|
+
# Always return on string for backwards compatibility with querying
|
35
|
+
# string-backed BigDecimal fields.
|
36
|
+
when BSON::Decimal128, String then obj
|
37
|
+
else
|
38
|
+
if obj.numeric?
|
39
|
+
if Mongoid.map_big_decimal_to_decimal128
|
40
|
+
BSON::Decimal128.new(object.to_s)
|
41
|
+
else
|
42
|
+
obj.to_s
|
43
|
+
end
|
44
|
+
else
|
45
|
+
obj
|
46
|
+
end
|
47
|
+
end
|
27
48
|
end
|
28
49
|
end
|
29
50
|
end
|
@@ -134,20 +134,6 @@ module Mongoid
|
|
134
134
|
replacement
|
135
135
|
end
|
136
136
|
|
137
|
-
# Update all the values in the hash with the provided block.
|
138
|
-
#
|
139
|
-
# @example Update the values in place.
|
140
|
-
# { field: "1" }.update_values(&:to_i)
|
141
|
-
#
|
142
|
-
# @param [ Proc ] block The block to execute on each value.
|
143
|
-
#
|
144
|
-
# @return [ Hash ] the hash.
|
145
|
-
def update_values(&block)
|
146
|
-
each_pair do |key, value|
|
147
|
-
store(key, block[value])
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
137
|
private
|
152
138
|
|
153
139
|
# Apply the provided strategy for the hash with the given object.
|
@@ -51,7 +51,7 @@ module Mongoid
|
|
51
51
|
#
|
52
52
|
# @return [ Object ] The converted number.
|
53
53
|
def __numeric__(object)
|
54
|
-
object.to_s
|
54
|
+
object.to_s.match?(/\A[-+]?[0-9]*[0-9.]0*\z/) ? object.to_i : Float(object)
|
55
55
|
end
|
56
56
|
|
57
57
|
# Evolve the object to an integer.
|
@@ -43,13 +43,21 @@ module Mongoid
|
|
43
43
|
# @example Evolve the range.
|
44
44
|
# (11231312..213123131).__evolve_range__
|
45
45
|
#
|
46
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
47
|
+
#
|
46
48
|
# @return [ Hash ] The $gte/$lte range query.
|
47
|
-
|
49
|
+
#
|
50
|
+
# @api private
|
51
|
+
def __evolve_range__(serializer: nil)
|
48
52
|
__evolve_range_naive__.transform_values! do |value|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
+
if serializer
|
54
|
+
serializer.evolve(value)
|
55
|
+
else
|
56
|
+
case value
|
57
|
+
when Time, DateTime then value.__evolve_time__
|
58
|
+
when Date then value.__evolve_date__
|
59
|
+
else value
|
60
|
+
end
|
53
61
|
end
|
54
62
|
end
|
55
63
|
end
|
@@ -52,6 +52,27 @@ module Mongoid
|
|
52
52
|
self
|
53
53
|
end
|
54
54
|
|
55
|
+
# Merge criteria with operators using the and operator.
|
56
|
+
#
|
57
|
+
# @param [ Hash ] criterion The criterion to add to the criteria.
|
58
|
+
# @param [ String ] operator The MongoDB operator.
|
59
|
+
#
|
60
|
+
# @return [ Criteria ] The resulting criteria.
|
61
|
+
def and_with_operator(criterion, operator)
|
62
|
+
crit = self
|
63
|
+
if criterion
|
64
|
+
criterion.each_pair do |field, value|
|
65
|
+
val = prepare(field, operator, value)
|
66
|
+
# The prepare method already takes the negation into account. We
|
67
|
+
# set negating to false here so that ``and`` doesn't also apply
|
68
|
+
# negation and we have a double negative.
|
69
|
+
crit.negating = false
|
70
|
+
crit = crit.and(field => val)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
crit
|
74
|
+
end
|
75
|
+
|
55
76
|
private
|
56
77
|
|
57
78
|
# Adds the criterion to the existing selection.
|
@@ -318,15 +318,9 @@ module Mongoid
|
|
318
318
|
#
|
319
319
|
# @return [ Optional ] The cloned optional.
|
320
320
|
def add_sort_option(options, field, direction)
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
options.store(:sort, sorting)
|
325
|
-
else
|
326
|
-
sorting = (options[:sort] || {}).dup
|
327
|
-
sorting[field] = direction
|
328
|
-
options.store(:sort, sorting)
|
329
|
-
end
|
321
|
+
sorting = (options[:sort] || {}).dup
|
322
|
+
sorting[field] = direction
|
323
|
+
options.store(:sort, sorting)
|
330
324
|
end
|
331
325
|
|
332
326
|
# Take the provided criterion and store it as an option in the query
|
@@ -84,7 +84,7 @@ module Mongoid
|
|
84
84
|
#
|
85
85
|
# @return [ Options ] The copied options.
|
86
86
|
def __deep_copy__
|
87
|
-
self.class.new(aliases, serializers) do |copy|
|
87
|
+
self.class.new(aliases, serializers, associations, aliased_associations) do |copy|
|
88
88
|
each_pair do |key, value|
|
89
89
|
copy.merge!(key => value.__deep_copy__)
|
90
90
|
end
|