mongoid 7.5.1 → 8.1.2
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/CHANGELOG.md +3 -3
- data/README.md +6 -6
- data/Rakefile +25 -0
- data/lib/config/locales/en.yml +92 -43
- data/lib/mongoid/association/accessors.rb +40 -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 +54 -14
- 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 +69 -45
- 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 +29 -19
- 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/paths/embedded/many.rb +19 -0
- data/lib/mongoid/atomic.rb +7 -0
- 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/cacheable.rb +2 -2
- 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 +145 -17
- 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 +521 -333
- 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 +1 -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 +93 -8
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- 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 +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +135 -36
- 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 +19 -8
- 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 +129 -20
- 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 +76 -15
- 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 +63 -10
- 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/shardable.rb +35 -11
- 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 +2 -3
- data/lib/mongoid/traversable.rb +5 -4
- data/lib/mongoid/utils.rb +22 -0
- 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 +9 -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 +10 -14
- 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 +132 -1
- data/spec/integration/callbacks_spec.rb +360 -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 +276 -65
- data/spec/mongoid/association/embedded/embeds_many_models.rb +158 -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/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 +215 -228
- 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 +193 -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 +554 -33
- data/spec/mongoid/cacheable_spec.rb +3 -3
- 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 +179 -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 +220 -30
- 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 +1570 -413
- 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 +90 -5
- data/spec/mongoid/criteria/queryable/storable_spec.rb +72 -0
- 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 +500 -84
- 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 +599 -8
- 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 +57 -58
- 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 +9 -30
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +157 -51
- 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/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 -10
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/lite_constraints.rb +8 -0
- data/spec/shared/shlib/server.sh +5 -5
- 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 +4 -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/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
- data.tar.gz.sig +0 -0
- metadata +720 -638
- 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/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/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,51 +72,125 @@ 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
|
|
124
|
+
|
|
125
|
+
# When this flag is true, the attributes method on a document will return
|
|
126
|
+
# a BSON::Document when that document is retrieved from the database, and
|
|
127
|
+
# a Hash otherwise. When this flag is false, the attributes method will
|
|
128
|
+
# always return a Hash.
|
|
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
|
+
# Returns the Config singleton, for use in the configure DSL.
|
|
189
|
+
#
|
|
190
|
+
# @return [ self ] The Config singleton.
|
|
191
|
+
def config
|
|
192
|
+
self
|
|
193
|
+
end
|
|
118
194
|
|
|
119
195
|
# Has Mongoid been configured? This is checking that at least a valid
|
|
120
196
|
# client config exists.
|
|
@@ -122,7 +198,7 @@ module Mongoid
|
|
|
122
198
|
# @example Is Mongoid configured?
|
|
123
199
|
# config.configured?
|
|
124
200
|
#
|
|
125
|
-
# @return [ true
|
|
201
|
+
# @return [ true | false ] If Mongoid is configured.
|
|
126
202
|
def configured?
|
|
127
203
|
clients.key?(:default)
|
|
128
204
|
end
|
|
@@ -163,7 +239,7 @@ module Mongoid
|
|
|
163
239
|
# Mongoid.load!("/path/to/mongoid.yml")
|
|
164
240
|
#
|
|
165
241
|
# @param [ String ] path The path to the file.
|
|
166
|
-
# @param [ String
|
|
242
|
+
# @param [ String | Symbol ] environment The environment to load.
|
|
167
243
|
def load!(path, environment = nil)
|
|
168
244
|
settings = Environment.load_yaml(path, environment)
|
|
169
245
|
if settings.present?
|
|
@@ -197,6 +273,17 @@ module Mongoid
|
|
|
197
273
|
end
|
|
198
274
|
end
|
|
199
275
|
|
|
276
|
+
# Deregister a model in the application with Mongoid.
|
|
277
|
+
#
|
|
278
|
+
# @param [ Class ] klass The model to deregister.
|
|
279
|
+
#
|
|
280
|
+
# @api private
|
|
281
|
+
def deregister_model(klass)
|
|
282
|
+
LOCK.synchronize do
|
|
283
|
+
models.delete(klass)
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
200
287
|
# From a hash of settings, load all the configuration.
|
|
201
288
|
#
|
|
202
289
|
# @example Load the configuration.
|
|
@@ -207,6 +294,7 @@ module Mongoid
|
|
|
207
294
|
configuration = settings.with_indifferent_access
|
|
208
295
|
self.options = configuration[:options]
|
|
209
296
|
self.clients = configuration[:clients]
|
|
297
|
+
Mongo.options = configuration[:driver_options] || {}
|
|
210
298
|
set_log_levels
|
|
211
299
|
end
|
|
212
300
|
|
|
@@ -215,9 +303,9 @@ module Mongoid
|
|
|
215
303
|
# @example Override the database globally.
|
|
216
304
|
# config.override_database(:optional)
|
|
217
305
|
#
|
|
218
|
-
# @param [ String
|
|
306
|
+
# @param [ String | Symbol ] name The name of the database.
|
|
219
307
|
#
|
|
220
|
-
# @return [ String
|
|
308
|
+
# @return [ String | Symbol ] The global override.
|
|
221
309
|
def override_database(name)
|
|
222
310
|
Threaded.database_override = name
|
|
223
311
|
end
|
|
@@ -227,9 +315,9 @@ module Mongoid
|
|
|
227
315
|
# @example Override the client globally.
|
|
228
316
|
# config.override_client(:optional)
|
|
229
317
|
#
|
|
230
|
-
# @param [ String
|
|
318
|
+
# @param [ String | Symbol ] name The name of the client.
|
|
231
319
|
#
|
|
232
|
-
# @return [ String
|
|
320
|
+
# @return [ String | Symbol ] The global override.
|
|
233
321
|
def override_client(name)
|
|
234
322
|
Threaded.client_override = name ? name.to_s : nil
|
|
235
323
|
end
|
|
@@ -268,6 +356,7 @@ module Mongoid
|
|
|
268
356
|
# @param [ Hash ] options The configuration options.
|
|
269
357
|
def options=(options)
|
|
270
358
|
if options
|
|
359
|
+
Validators::AsyncQueryExecutor.validate(options)
|
|
271
360
|
options.each_pair do |option, value|
|
|
272
361
|
Validators::Option.validate(option)
|
|
273
362
|
send("#{option}=", value)
|
|
@@ -300,7 +389,7 @@ module Mongoid
|
|
|
300
389
|
# @example Is the application using passenger?
|
|
301
390
|
# config.running_with_passenger?
|
|
302
391
|
#
|
|
303
|
-
# @return [ true
|
|
392
|
+
# @return [ true | false ] If the app is deployed on Passenger.
|
|
304
393
|
def running_with_passenger?
|
|
305
394
|
@running_with_passenger ||= defined?(PhusionPassenger)
|
|
306
395
|
end
|
|
@@ -335,5 +424,44 @@ module Mongoid
|
|
|
335
424
|
client
|
|
336
425
|
end
|
|
337
426
|
end
|
|
427
|
+
|
|
428
|
+
module DeprecatedOptions
|
|
429
|
+
OPTIONS = %i[ use_activesupport_time_zone
|
|
430
|
+
broken_aggregables
|
|
431
|
+
broken_alias_handling
|
|
432
|
+
broken_and
|
|
433
|
+
broken_scoping
|
|
434
|
+
broken_updates
|
|
435
|
+
compare_time_by_ms
|
|
436
|
+
legacy_attributes
|
|
437
|
+
legacy_pluck_distinct
|
|
438
|
+
legacy_triple_equals
|
|
439
|
+
object_id_as_json_oid
|
|
440
|
+
overwrite_chained_operators ]
|
|
441
|
+
|
|
442
|
+
if RUBY_VERSION < '3.0'
|
|
443
|
+
def self.prepended(klass)
|
|
444
|
+
klass.class_eval do
|
|
445
|
+
OPTIONS.each do |option|
|
|
446
|
+
alias_method :"#{option}_without_deprecation=", :"#{option}="
|
|
447
|
+
|
|
448
|
+
define_method(:"#{option}=") do |value|
|
|
449
|
+
Mongoid::Warnings.send(:"warn_#{option}_deprecated")
|
|
450
|
+
send(:"#{option}_without_deprecation=", value)
|
|
451
|
+
end
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
else
|
|
456
|
+
OPTIONS.each do |option|
|
|
457
|
+
define_method(:"#{option}=") do |value|
|
|
458
|
+
Mongoid::Warnings.send(:"warn_#{option}_deprecated")
|
|
459
|
+
super(value)
|
|
460
|
+
end
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
prepend DeprecatedOptions
|
|
338
466
|
end
|
|
339
467
|
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
|