mongoid 7.5.4 → 8.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/Rakefile +44 -46
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +44 -11
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +5 -3
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +34 -11
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -3
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -3
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +85 -46
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -5
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +24 -5
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +8 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +45 -7
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +15 -4
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- 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/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +70 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +22 -30
- data/lib/mongoid/association/referenced/has_many/proxy.rb +40 -21
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +4 -4
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +16 -7
- data/lib/mongoid/attributes/dynamic.rb +4 -4
- data/lib/mongoid/attributes/nested.rb +6 -6
- data/lib/mongoid/attributes/processing.rb +37 -6
- data/lib/mongoid/attributes/projector.rb +2 -2
- data/lib/mongoid/attributes/readonly.rb +3 -3
- data/lib/mongoid/attributes.rb +51 -42
- data/lib/mongoid/changeable.rb +147 -14
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +3 -15
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/options.rb +3 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +153 -18
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +285 -58
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +540 -346
- data/lib/mongoid/contextual/none.rb +193 -20
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +14 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +8 -5
- data/lib/mongoid/criteria/includable.rb +27 -22
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -16
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- 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 +1 -17
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +15 -9
- 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 +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -14
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -12
- 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/key.rb +4 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +11 -17
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +47 -38
- data/lib/mongoid/criteria/queryable/selector.rb +92 -7
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +20 -40
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +127 -35
- data/lib/mongoid/equality.rb +8 -8
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +6 -3
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +33 -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/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +7 -4
- data/lib/mongoid/extensions/hash.rb +38 -9
- data/lib/mongoid/extensions/integer.rb +7 -4
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +10 -8
- 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 +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +29 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +55 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +19 -4
- data/lib/mongoid/fields/standard.rb +17 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +142 -28
- data/lib/mongoid/findable.rb +54 -24
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +186 -16
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/matcher.rb +33 -13
- data/lib/mongoid/persistable/creatable.rb +19 -9
- data/lib/mongoid/persistable/deletable.rb +2 -2
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +14 -2
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +69 -12
- data/lib/mongoid/persistable/upsertable.rb +21 -2
- data/lib/mongoid/persistable.rb +6 -3
- data/lib/mongoid/persistence_context.rb +6 -4
- data/lib/mongoid/query_cache.rb +13 -261
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/reloadable.rb +10 -8
- data/lib/mongoid/scopable.rb +15 -13
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +10 -6
- data/lib/mongoid/stateful.rb +57 -10
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +42 -12
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +3 -4
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/associated.rb +96 -18
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +5 -7
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +17 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +19 -4
- data/lib/mongoid.rb +17 -3
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +13 -16
- 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 +61 -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 +132 -1
- data/spec/integration/callbacks_spec.rb +381 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +118 -80
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +3 -32
- 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/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 +96 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +290 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +37 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +16 -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/proxy_spec.rb +15 -2
- 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 +4 -20
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +186 -229
- 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 +215 -177
- 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 +15 -1
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- 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 +526 -33
- data/spec/mongoid/changeable_spec.rb +429 -37
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +149 -15
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +214 -31
- 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 +850 -88
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +2256 -1005
- data/spec/mongoid/contextual/none_spec.rb +60 -21
- data/spec/mongoid/copyable_spec.rb +453 -11
- 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/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- 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 +15 -484
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +469 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +78 -86
- data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -3
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -5
- data/spec/mongoid/criteria_spec.rb +469 -1205
- 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 +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/readonly_document_spec.rb +2 -2
- 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 +712 -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 +53 -74
- data/spec/mongoid/extensions/hash_spec.rb +33 -3
- data/spec/mongoid/extensions/integer_spec.rb +50 -64
- 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 +639 -106
- data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -83
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields/localized_spec.rb +80 -37
- data/spec/mongoid/fields_spec.rb +503 -87
- data/spec/mongoid/findable_spec.rb +450 -58
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +55 -30
- data/spec/mongoid/interceptable_spec.rb +824 -22
- 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 +28 -8
- data/spec/mongoid/persistable/destroyable_spec.rb +28 -8
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +89 -1
- data/spec/mongoid/persistence_context_spec.rb +31 -57
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +56 -215
- data/spec/mongoid/reloadable_spec.rb +83 -6
- data/spec/mongoid/scopable_spec.rb +91 -1
- data/spec/mongoid/serializable_spec.rb +25 -39
- data/spec/mongoid/shardable_spec.rb +4 -4
- data/spec/mongoid/stateful_spec.rb +150 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +392 -4
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +390 -2
- data/spec/mongoid/touchable_spec_models.rb +14 -8
- data/spec/mongoid/traversable_spec.rb +13 -35
- data/spec/mongoid/validatable/associated_spec.rb +13 -30
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +58 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +34 -16
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/spec_helper.rb +5 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +78 -0
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +5 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/cover.rb +10 -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/lat_lng.rb +6 -0
- data/spec/support/models/name.rb +10 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +2 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/product.rb +1 -0
- data/spec/support/models/purse.rb +9 -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
- metadata +101 -96
- checksums.yaml.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/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -231
- data/spec/shared/lib/mrss/constraints.rb +0 -378
- data/spec/shared/lib/mrss/docker_runner.rb +0 -291
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
- data/spec/shared/lib/mrss/session_registry.rb +0 -69
- data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -325
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/config.sh +0 -27
- data/spec/shared/shlib/distro.sh +0 -74
- data/spec/shared/shlib/server.sh +0 -392
- data/spec/shared/shlib/set_env.sh +0 -169
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
data/lib/mongoid/config.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "mongoid/config/defaults"
|
3
4
|
require "mongoid/config/environment"
|
4
5
|
require "mongoid/config/options"
|
5
6
|
require "mongoid/config/validators"
|
@@ -11,6 +12,7 @@ module Mongoid
|
|
11
12
|
module Config
|
12
13
|
extend Forwardable
|
13
14
|
extend Options
|
15
|
+
extend Defaults
|
14
16
|
extend self
|
15
17
|
|
16
18
|
def_delegators ::Mongoid, :logger, :logger=
|
@@ -70,57 +72,138 @@ module Mongoid
|
|
70
72
|
|
71
73
|
# Use ActiveSupport's time zone in time operations instead of the
|
72
74
|
# Ruby default time zone.
|
75
|
+
# @deprecated
|
73
76
|
option :use_activesupport_time_zone, default: true
|
74
77
|
|
75
78
|
# Return stored times as UTC.
|
76
79
|
option :use_utc, default: false
|
77
80
|
|
81
|
+
# Store BigDecimals as Decimal128s instead of strings in the db.
|
82
|
+
option :map_big_decimal_to_decimal128, default: true
|
83
|
+
|
78
84
|
# Update embedded documents correctly when setting it, unsetting it
|
79
85
|
# and resetting it. See MONGOID-5206 and MONGOID-5240 for more details.
|
80
|
-
option :broken_updates, default:
|
86
|
+
option :broken_updates, default: false
|
81
87
|
|
82
88
|
# Maintain legacy behavior of === on Mongoid documents, which returns
|
83
89
|
# true in a number of cases where Ruby's === implementation would
|
84
90
|
# return false.
|
85
|
-
option :legacy_triple_equals, default:
|
91
|
+
option :legacy_triple_equals, default: false
|
86
92
|
|
87
93
|
# When exiting a nested `with_scope' block, set the current scope to
|
88
94
|
# nil instead of the parent scope for backwards compatibility.
|
89
|
-
option :broken_scoping, default:
|
95
|
+
option :broken_scoping, default: false
|
90
96
|
|
91
97
|
# Maintain broken behavior of sum over empty result sets for backwards
|
92
98
|
# compatibility.
|
93
|
-
option :broken_aggregables, default:
|
99
|
+
option :broken_aggregables, default: false
|
94
100
|
|
95
101
|
# Ignore aliased fields in embedded documents when performing pluck and
|
96
102
|
# distinct operations, for backwards compatibility.
|
97
|
-
option :broken_alias_handling, default:
|
103
|
+
option :broken_alias_handling, default: false
|
98
104
|
|
99
105
|
# Maintain broken `and' behavior when using the same operator on the same
|
100
106
|
# field multiple times for backwards compatibility.
|
101
|
-
option :broken_and, default:
|
107
|
+
option :broken_and, default: false
|
102
108
|
|
103
109
|
# Use millisecond precision when comparing Time objects with the _matches?
|
104
110
|
# function.
|
105
|
-
option :compare_time_by_ms, default:
|
111
|
+
option :compare_time_by_ms, default: true
|
106
112
|
|
107
113
|
# Use bson-ruby's implementation of as_json for BSON::ObjectId instead of
|
108
114
|
# the one monkey-patched into Mongoid.
|
109
|
-
option :object_id_as_json_oid, default:
|
115
|
+
option :object_id_as_json_oid, default: false
|
110
116
|
|
111
117
|
# Maintain legacy behavior of pluck and distinct, which does not
|
112
118
|
# demongoize the values on returning them.
|
113
|
-
option :legacy_pluck_distinct, default:
|
119
|
+
option :legacy_pluck_distinct, default: false
|
114
120
|
|
115
121
|
# Combine chained operators, which use the same field and operator,
|
116
122
|
# using and's instead of overwriting them.
|
117
|
-
option :overwrite_chained_operators, default:
|
123
|
+
option :overwrite_chained_operators, default: false
|
118
124
|
|
119
125
|
# When this flag is true, the attributes method on a document will return
|
120
126
|
# a BSON::Document when that document is retrieved from the database, and
|
121
127
|
# a Hash otherwise. When this flag is false, the attributes method will
|
122
128
|
# always return a Hash.
|
123
|
-
option :legacy_attributes, default:
|
129
|
+
option :legacy_attributes, default: false
|
130
|
+
|
131
|
+
# Allow BSON::Decimal128 to be parsed and returned directly in
|
132
|
+
# field values. When BSON 5 is present and the this option is set to false
|
133
|
+
# (the default), BSON::Decimal128 values in the database will be returned
|
134
|
+
# as BigDecimal.
|
135
|
+
#
|
136
|
+
# @note this option only has effect when BSON 5+ is present. Otherwise,
|
137
|
+
# the setting is ignored.
|
138
|
+
option :allow_bson5_decimal128, default: false, on_change: -> (allow) do
|
139
|
+
if BSON::VERSION >= '5.0.0'
|
140
|
+
if allow
|
141
|
+
BSON::Registry.register(BSON::Decimal128::BSON_TYPE, BSON::Decimal128)
|
142
|
+
else
|
143
|
+
BSON::Registry.register(BSON::Decimal128::BSON_TYPE, BigDecimal)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# Sets the async_query_executor for the application. By default the thread pool executor
|
149
|
+
# is set to `:immediate. Options are:
|
150
|
+
#
|
151
|
+
# - :immediate - Initializes a single +Concurrent::ImmediateExecutor+
|
152
|
+
# - :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+
|
153
|
+
# that uses the +async_query_concurrency+ for the +max_threads+ value.
|
154
|
+
option :async_query_executor, default: :immediate
|
155
|
+
|
156
|
+
# Defines how many asynchronous queries can be executed concurrently.
|
157
|
+
# This option should be set only if `async_query_executor` is set
|
158
|
+
# to `:global_thread_pool`.
|
159
|
+
option :global_executor_concurrency, default: nil
|
160
|
+
|
161
|
+
# When this flag is false, a document will become read-only only once the
|
162
|
+
# #readonly! method is called, and an error will be raised on attempting
|
163
|
+
# to save or update such documents, instead of just on delete. When this
|
164
|
+
# flag is true, a document is only read-only if it has been projected
|
165
|
+
# using #only or #without, and read-only documents will not be
|
166
|
+
# deletable/destroyable, but they will be savable/updatable.
|
167
|
+
# When this feature flag is turned on, the read-only state will be reset on
|
168
|
+
# reload, but when it is turned off, it won't be.
|
169
|
+
option :legacy_readonly, default: true
|
170
|
+
|
171
|
+
# When this flag is true, any attempt to change the _id of a persisted
|
172
|
+
# document will raise an exception (`Errors::ImmutableAttribute`).
|
173
|
+
# This will be the default in 9.0. When this flag is false (the default
|
174
|
+
# in 8.x), changing the _id of a persisted document might be ignored,
|
175
|
+
# or it might work, depending on the situation.
|
176
|
+
option :immutable_ids, default: false
|
177
|
+
|
178
|
+
# When this flag is true, callbacks for every embedded document will be
|
179
|
+
# called only once, even if the embedded document is embedded in multiple
|
180
|
+
# documents in the root document's dependencies graph.
|
181
|
+
# This will be the default in 9.0. Setting this flag to false restores the
|
182
|
+
# pre-9.0 behavior, where callbacks are called for every occurrence of an
|
183
|
+
# embedded document. The pre-9.0 behavior leads to a problem that for multi
|
184
|
+
# level nested documents callbacks are called multiple times.
|
185
|
+
# See https://jira.mongodb.org/browse/MONGOID-5542
|
186
|
+
option :prevent_multiple_calls_of_embedded_callbacks, default: false
|
187
|
+
|
188
|
+
# When this flag is true, callbacks for embedded documents will not be
|
189
|
+
# called. This is the default in 8.x, but will be changed to false in 9.0.
|
190
|
+
#
|
191
|
+
# Setting this flag to true (as it is in 8.x) may lead to stack
|
192
|
+
# overflow errors if there are more than cicrca 1000 embedded
|
193
|
+
# documents in the root document's dependencies graph.
|
194
|
+
#
|
195
|
+
# It is strongly recommended to set this flag to false in 8.x, if you
|
196
|
+
# are not using around callbacks for embedded documents.
|
197
|
+
#
|
198
|
+
# See https://jira.mongodb.org/browse/MONGOID-5658 for more details.
|
199
|
+
option :around_callbacks_for_embeds, default: true
|
200
|
+
|
201
|
+
# Returns the Config singleton, for use in the configure DSL.
|
202
|
+
#
|
203
|
+
# @return [ self ] The Config singleton.
|
204
|
+
def config
|
205
|
+
self
|
206
|
+
end
|
124
207
|
|
125
208
|
# Has Mongoid been configured? This is checking that at least a valid
|
126
209
|
# client config exists.
|
@@ -128,7 +211,7 @@ module Mongoid
|
|
128
211
|
# @example Is Mongoid configured?
|
129
212
|
# config.configured?
|
130
213
|
#
|
131
|
-
# @return [ true
|
214
|
+
# @return [ true | false ] If Mongoid is configured.
|
132
215
|
def configured?
|
133
216
|
clients.key?(:default)
|
134
217
|
end
|
@@ -169,7 +252,7 @@ module Mongoid
|
|
169
252
|
# Mongoid.load!("/path/to/mongoid.yml")
|
170
253
|
#
|
171
254
|
# @param [ String ] path The path to the file.
|
172
|
-
# @param [ String
|
255
|
+
# @param [ String | Symbol ] environment The environment to load.
|
173
256
|
def load!(path, environment = nil)
|
174
257
|
settings = Environment.load_yaml(path, environment)
|
175
258
|
if settings.present?
|
@@ -203,6 +286,17 @@ module Mongoid
|
|
203
286
|
end
|
204
287
|
end
|
205
288
|
|
289
|
+
# Deregister a model in the application with Mongoid.
|
290
|
+
#
|
291
|
+
# @param [ Class ] klass The model to deregister.
|
292
|
+
#
|
293
|
+
# @api private
|
294
|
+
def deregister_model(klass)
|
295
|
+
LOCK.synchronize do
|
296
|
+
models.delete(klass)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
206
300
|
# From a hash of settings, load all the configuration.
|
207
301
|
#
|
208
302
|
# @example Load the configuration.
|
@@ -213,6 +307,7 @@ module Mongoid
|
|
213
307
|
configuration = settings.with_indifferent_access
|
214
308
|
self.options = configuration[:options]
|
215
309
|
self.clients = configuration[:clients]
|
310
|
+
Mongo.options = configuration[:driver_options] || {}
|
216
311
|
set_log_levels
|
217
312
|
end
|
218
313
|
|
@@ -221,9 +316,9 @@ module Mongoid
|
|
221
316
|
# @example Override the database globally.
|
222
317
|
# config.override_database(:optional)
|
223
318
|
#
|
224
|
-
# @param [ String
|
319
|
+
# @param [ String | Symbol ] name The name of the database.
|
225
320
|
#
|
226
|
-
# @return [ String
|
321
|
+
# @return [ String | Symbol ] The global override.
|
227
322
|
def override_database(name)
|
228
323
|
Threaded.database_override = name
|
229
324
|
end
|
@@ -233,9 +328,9 @@ module Mongoid
|
|
233
328
|
# @example Override the client globally.
|
234
329
|
# config.override_client(:optional)
|
235
330
|
#
|
236
|
-
# @param [ String
|
331
|
+
# @param [ String | Symbol ] name The name of the client.
|
237
332
|
#
|
238
|
-
# @return [ String
|
333
|
+
# @return [ String | Symbol ] The global override.
|
239
334
|
def override_client(name)
|
240
335
|
Threaded.client_override = name ? name.to_s : nil
|
241
336
|
end
|
@@ -274,6 +369,7 @@ module Mongoid
|
|
274
369
|
# @param [ Hash ] options The configuration options.
|
275
370
|
def options=(options)
|
276
371
|
if options
|
372
|
+
Validators::AsyncQueryExecutor.validate(options)
|
277
373
|
options.each_pair do |option, value|
|
278
374
|
Validators::Option.validate(option)
|
279
375
|
send("#{option}=", value)
|
@@ -306,7 +402,7 @@ module Mongoid
|
|
306
402
|
# @example Is the application using passenger?
|
307
403
|
# config.running_with_passenger?
|
308
404
|
#
|
309
|
-
# @return [ true
|
405
|
+
# @return [ true | false ] If the app is deployed on Passenger.
|
310
406
|
def running_with_passenger?
|
311
407
|
@running_with_passenger ||= defined?(PhusionPassenger)
|
312
408
|
end
|
@@ -341,5 +437,44 @@ module Mongoid
|
|
341
437
|
client
|
342
438
|
end
|
343
439
|
end
|
440
|
+
|
441
|
+
module DeprecatedOptions
|
442
|
+
OPTIONS = %i[ use_activesupport_time_zone
|
443
|
+
broken_aggregables
|
444
|
+
broken_alias_handling
|
445
|
+
broken_and
|
446
|
+
broken_scoping
|
447
|
+
broken_updates
|
448
|
+
compare_time_by_ms
|
449
|
+
legacy_attributes
|
450
|
+
legacy_pluck_distinct
|
451
|
+
legacy_triple_equals
|
452
|
+
object_id_as_json_oid
|
453
|
+
overwrite_chained_operators ]
|
454
|
+
|
455
|
+
if RUBY_VERSION < '3.0'
|
456
|
+
def self.prepended(klass)
|
457
|
+
klass.class_eval do
|
458
|
+
OPTIONS.each do |option|
|
459
|
+
alias_method :"#{option}_without_deprecation=", :"#{option}="
|
460
|
+
|
461
|
+
define_method(:"#{option}=") do |value|
|
462
|
+
Mongoid::Warnings.send(:"warn_#{option}_deprecated")
|
463
|
+
send(:"#{option}_without_deprecation=", value)
|
464
|
+
end
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
468
|
+
else
|
469
|
+
OPTIONS.each do |option|
|
470
|
+
define_method(:"#{option}=") do |value|
|
471
|
+
Mongoid::Warnings.send(:"warn_#{option}_deprecated")
|
472
|
+
super(value)
|
473
|
+
end
|
474
|
+
end
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
478
|
+
prepend DeprecatedOptions
|
344
479
|
end
|
345
480
|
end
|
@@ -9,7 +9,7 @@ module Mongoid
|
|
9
9
|
# Get all the aggregate values for the provided field.
|
10
10
|
# Provided for interface consistency with Aggregable::Mongo.
|
11
11
|
#
|
12
|
-
# @param [ String
|
12
|
+
# @param [ String | Symbol ] field The field name.
|
13
13
|
#
|
14
14
|
# @return [ Hash ] A Hash containing the aggregate values.
|
15
15
|
# If no documents are present, then returned Hash will have
|
@@ -27,9 +27,13 @@ module Mongoid
|
|
27
27
|
#
|
28
28
|
# @param [ Symbol ] field The field to average.
|
29
29
|
#
|
30
|
-
# @return [
|
30
|
+
# @return [ Numeric ] The average.
|
31
31
|
def avg(field)
|
32
|
-
count
|
32
|
+
total = count { |doc| !doc.send(field).nil? }
|
33
|
+
return nil unless total > 0
|
34
|
+
|
35
|
+
total = total.to_f if total.is_a?(Integer)
|
36
|
+
sum(field) / total
|
33
37
|
end
|
34
38
|
|
35
39
|
# Get the max value of the provided field. If provided a block, will
|
@@ -46,10 +50,12 @@ module Mongoid
|
|
46
50
|
#
|
47
51
|
# @param [ Symbol ] field The field to max.
|
48
52
|
#
|
49
|
-
# @return [
|
53
|
+
# @return [ Numeric | Document ] The max value or document with the max
|
50
54
|
# value.
|
51
55
|
def max(field = nil)
|
52
|
-
|
56
|
+
return super() if block_given?
|
57
|
+
|
58
|
+
aggregate_by(field, :max)
|
53
59
|
end
|
54
60
|
|
55
61
|
# Get the min value of the provided field. If provided a block, will
|
@@ -66,10 +72,12 @@ module Mongoid
|
|
66
72
|
#
|
67
73
|
# @param [ Symbol ] field The field to min.
|
68
74
|
#
|
69
|
-
# @return [
|
75
|
+
# @return [ Numeric | Document ] The min value or document with the min
|
70
76
|
# value.
|
71
77
|
def min(field = nil)
|
72
|
-
|
78
|
+
return super() if block_given?
|
79
|
+
|
80
|
+
aggregate_by(field, :min)
|
73
81
|
end
|
74
82
|
|
75
83
|
# Get the sum value of the provided field. If provided a block, will
|
@@ -83,13 +91,11 @@ module Mongoid
|
|
83
91
|
#
|
84
92
|
# @param [ Symbol ] field The field to sum.
|
85
93
|
#
|
86
|
-
# @return [
|
94
|
+
# @return [ Numeric ] The sum value.
|
87
95
|
def sum(field = nil)
|
88
|
-
if block_given?
|
89
|
-
|
90
|
-
|
91
|
-
count > 0 ? super(0) { |doc| doc.public_send(field) } : 0
|
92
|
-
end
|
96
|
+
return super() if block_given?
|
97
|
+
|
98
|
+
aggregate_by(field, :sum) || 0
|
93
99
|
end
|
94
100
|
|
95
101
|
private
|
@@ -99,14 +105,16 @@ module Mongoid
|
|
99
105
|
# @api private
|
100
106
|
#
|
101
107
|
# @example Aggregate by the field and method.
|
102
|
-
# aggregable.aggregate_by(:
|
108
|
+
# aggregable.aggregate_by(:likes, :min_by)
|
103
109
|
#
|
104
110
|
# @param [ Symbol ] field The field to aggregate on.
|
105
111
|
# @param [ Symbol ] method The method (min_by or max_by).
|
106
112
|
#
|
107
|
-
# @return [
|
113
|
+
# @return [ Numeric | nil ] The aggregate.
|
108
114
|
def aggregate_by(field, method)
|
109
|
-
|
115
|
+
return nil unless any?
|
116
|
+
|
117
|
+
map { |doc| doc.public_send(field) }.compact.public_send(method)
|
110
118
|
end
|
111
119
|
end
|
112
120
|
end
|
@@ -20,13 +20,13 @@ module Mongoid
|
|
20
20
|
# # "avg" => 750.0
|
21
21
|
# # }
|
22
22
|
#
|
23
|
-
# @param [ String
|
23
|
+
# @param [ String | Symbol ] field The field name.
|
24
24
|
#
|
25
25
|
# @return [ Hash ] A Hash containing the aggregate values.
|
26
26
|
# If no documents are found, then returned Hash will have
|
27
27
|
# count, sum of 0 and max, min, avg of nil.
|
28
28
|
def aggregates(field)
|
29
|
-
result = collection.
|
29
|
+
result = collection.aggregate(pipeline(field), session: _session).to_a
|
30
30
|
if result.empty?
|
31
31
|
if Mongoid.broken_aggregables
|
32
32
|
{ "count" => 0, "sum" => nil, "avg" => nil, "min" => nil, "max" => nil }
|
@@ -64,7 +64,7 @@ module Mongoid
|
|
64
64
|
#
|
65
65
|
# @param [ Symbol ] field The field to max.
|
66
66
|
#
|
67
|
-
# @return [ Float
|
67
|
+
# @return [ Float | Document ] The max value or document with the max
|
68
68
|
# value.
|
69
69
|
def max(field = nil)
|
70
70
|
block_given? ? super() : aggregates(field)["max"]
|
@@ -84,7 +84,7 @@ module Mongoid
|
|
84
84
|
#
|
85
85
|
# @param [ Symbol ] field The field to min.
|
86
86
|
#
|
87
|
-
# @return [ Float
|
87
|
+
# @return [ Float | Document ] The min value or document with the min
|
88
88
|
# value.
|
89
89
|
def min(field = nil)
|
90
90
|
block_given? ? super() : aggregates(field)["min"]
|
@@ -115,7 +115,7 @@ module Mongoid
|
|
115
115
|
# @example Get the pipeline.
|
116
116
|
# aggregable.pipeline(:likes)
|
117
117
|
#
|
118
|
-
# @param [ String
|
118
|
+
# @param [ String | Symbol ] field The name of the field.
|
119
119
|
#
|
120
120
|
# @return [ Array ] The array of pipeline operators.
|
121
121
|
def pipeline(field)
|
@@ -11,7 +11,7 @@ module Mongoid
|
|
11
11
|
# Get all the aggregate values for the provided field in null context.
|
12
12
|
# Provided for interface consistency with Aggregable::Mongo.
|
13
13
|
#
|
14
|
-
# @param [ String
|
14
|
+
# @param [ String | Symbol ] _field The field name.
|
15
15
|
#
|
16
16
|
# @return [ Hash ] A Hash with count, sum of 0 and max, min, avg of nil.
|
17
17
|
def aggregates(_field)
|
@@ -150,7 +150,7 @@ module Mongoid
|
|
150
150
|
# @example Unset the field on the matches.
|
151
151
|
# context.unset(:name)
|
152
152
|
#
|
153
|
-
# @param [ String | Symbol | Array<String|Symbol> | Hash ] args
|
153
|
+
# @param [ [ String | Symbol | Array<String | Symbol> | Hash ]... ] *args
|
154
154
|
# The name(s) of the field(s) to unset.
|
155
155
|
# If a Hash is specified, its keys will be used irrespective of what
|
156
156
|
# each key's value is, even if the value is nil or false.
|
@@ -16,7 +16,7 @@ module Mongoid
|
|
16
16
|
# @example Get the average distance.
|
17
17
|
# geo_near.average_distance
|
18
18
|
#
|
19
|
-
# @return [ Float
|
19
|
+
# @return [ Float | nil ] The average distance.
|
20
20
|
def average_distance
|
21
21
|
average = stats["avgDistance"]
|
22
22
|
(average.nil? || average.nan?) ? nil : average
|
@@ -46,7 +46,7 @@ module Mongoid
|
|
46
46
|
# @example Provide the distance multiplier.
|
47
47
|
# geo_near.distance_multiplier(13113.1)
|
48
48
|
#
|
49
|
-
# @param [ Integer
|
49
|
+
# @param [ Integer | Float ] value The distance multiplier.
|
50
50
|
#
|
51
51
|
# @return [ GeoNear ] The GeoNear wrapper.
|
52
52
|
def distance_multiplier(value)
|
@@ -98,9 +98,9 @@ module Mongoid
|
|
98
98
|
# @example Get the max distance.
|
99
99
|
# geo_near.max_distance
|
100
100
|
#
|
101
|
-
# @param [ Integer
|
101
|
+
# @param [ Integer | Float ] value The maximum distance.
|
102
102
|
#
|
103
|
-
# @return [ GeoNear
|
103
|
+
# @return [ GeoNear | Float ] The GeoNear command or the value.
|
104
104
|
def max_distance(value = nil)
|
105
105
|
if value
|
106
106
|
command[:maxDistance] = value
|
@@ -115,7 +115,7 @@ module Mongoid
|
|
115
115
|
# @example Set the min distance.
|
116
116
|
# geo_near.min_distance(0.5)
|
117
117
|
#
|
118
|
-
# @param [ Integer
|
118
|
+
# @param [ Integer | Float ] value The minimum distance.
|
119
119
|
#
|
120
120
|
# @return [ GeoNear ] The GeoNear command.
|
121
121
|
def min_distance(value)
|
@@ -139,7 +139,7 @@ module Mongoid
|
|
139
139
|
# @example Set the unique flag.
|
140
140
|
# geo_near.unique(false)
|
141
141
|
#
|
142
|
-
# @param [ true
|
142
|
+
# @param [ true | false ] value Whether to return unique documents.
|
143
143
|
#
|
144
144
|
# @return [ GeoNear ] The command.
|
145
145
|
def unique(value = true)
|
@@ -211,7 +211,7 @@ module Mongoid
|
|
211
211
|
# @example Get the documents.
|
212
212
|
# geo_near.documents
|
213
213
|
#
|
214
|
-
# @return [ Array
|
214
|
+
# @return [ Array | Cursor ] The documents.
|
215
215
|
def documents
|
216
216
|
results["results"].map do |attributes|
|
217
217
|
doc = Factory.from_db(criteria.klass, attributes["obj"], criteria)
|
@@ -121,7 +121,7 @@ module Mongoid
|
|
121
121
|
# @return [ MapReduce ] The map/reduce object.
|
122
122
|
def out(location)
|
123
123
|
normalized = location.dup
|
124
|
-
normalized.
|
124
|
+
normalized.transform_values! do |value|
|
125
125
|
value.is_a?(::Symbol) ? value.to_s : value
|
126
126
|
end
|
127
127
|
@map_reduce = @map_reduce.out(normalized)
|
@@ -147,7 +147,7 @@ module Mongoid
|
|
147
147
|
def raw
|
148
148
|
validate_out!
|
149
149
|
cmd = command
|
150
|
-
opts = { read:
|
150
|
+
opts = { read: criteria.options.fetch(:read) } if criteria.options[:read]
|
151
151
|
@map_reduce.database.command(cmd, (opts || {}).merge(session: _session)).first
|
152
152
|
end
|
153
153
|
alias :results :raw
|