mongoid 7.0.13 → 8.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +30 -30
- data/README.md +32 -19
- data/Rakefile +43 -0
- data/lib/config/locales/en.yml +178 -95
- data/lib/mongoid/association/accessors.rb +175 -83
- data/lib/mongoid/association/bindable.rb +57 -28
- data/lib/mongoid/association/builders.rb +8 -14
- data/lib/mongoid/association/constrainable.rb +5 -7
- data/lib/mongoid/association/depending.rb +9 -18
- data/lib/mongoid/association/eager_loadable.rb +31 -10
- data/lib/mongoid/association/embedded/batchable.rb +67 -53
- data/lib/mongoid/association/embedded/cyclic.rb +10 -17
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +7 -4
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +14 -24
- data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +8 -5
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +143 -122
- data/lib/mongoid/association/embedded/embeds_many.rb +8 -36
- data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +26 -9
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +63 -29
- data/lib/mongoid/association/embedded/embeds_one.rb +9 -33
- data/lib/mongoid/association/embedded.rb +2 -0
- data/lib/mongoid/association/macros.rb +71 -41
- data/lib/mongoid/association/many.rb +25 -35
- data/lib/mongoid/association/marshalable.rb +3 -6
- data/lib/mongoid/association/nested/many.rb +22 -30
- data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
- data/lib/mongoid/association/nested/one.rb +19 -30
- data/lib/mongoid/association/nested.rb +3 -3
- data/lib/mongoid/association/one.rb +5 -12
- data/lib/mongoid/association/options.rb +16 -46
- data/lib/mongoid/association/proxy.rb +37 -38
- data/lib/mongoid/association/referenced/auto_save.rb +9 -14
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
- data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
- data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
- data/lib/mongoid/association/referenced/eager.rb +41 -40
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +105 -68
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
- data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
- data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
- data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
- data/lib/mongoid/association/referenced/has_many/proxy.rb +101 -124
- data/lib/mongoid/association/referenced/has_many.rb +21 -45
- data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
- data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
- data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
- data/lib/mongoid/association/referenced/has_one.rb +16 -36
- data/lib/mongoid/association/referenced/syncable.rb +11 -26
- data/lib/mongoid/association/referenced.rb +2 -0
- data/lib/mongoid/association/reflections.rb +7 -6
- data/lib/mongoid/association/relatable.rb +62 -84
- data/lib/mongoid/association.rb +13 -27
- data/lib/mongoid/atomic/modifiers.rb +29 -53
- data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
- data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
- data/lib/mongoid/atomic/paths/embedded.rb +2 -3
- data/lib/mongoid/atomic/paths/root.rb +4 -7
- data/lib/mongoid/atomic/paths.rb +2 -1
- data/lib/mongoid/atomic.rb +45 -51
- data/lib/mongoid/attributes/dynamic.rb +6 -21
- data/lib/mongoid/attributes/nested.rb +11 -14
- data/lib/mongoid/attributes/processing.rb +46 -30
- data/lib/mongoid/attributes/projector.rb +119 -0
- data/lib/mongoid/attributes/readonly.rb +5 -8
- data/lib/mongoid/attributes.rb +80 -98
- data/lib/mongoid/cacheable.rb +7 -10
- data/lib/mongoid/changeable.rb +49 -70
- data/lib/mongoid/clients/factory.rb +42 -17
- data/lib/mongoid/clients/options.rb +15 -14
- data/lib/mongoid/clients/sessions.rb +4 -20
- data/lib/mongoid/clients/storage_options.rb +7 -12
- data/lib/mongoid/clients/validators/storage.rb +5 -12
- data/lib/mongoid/clients/validators.rb +2 -1
- data/lib/mongoid/clients.rb +3 -10
- data/lib/mongoid/composable.rb +5 -9
- data/lib/mongoid/config/environment.rb +30 -5
- data/lib/mongoid/config/options.rb +23 -23
- data/lib/mongoid/config/validators/client.rb +8 -23
- data/lib/mongoid/config/validators/option.rb +2 -3
- data/lib/mongoid/config/validators.rb +2 -1
- data/lib/mongoid/config.rb +164 -48
- data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
- data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
- data/lib/mongoid/contextual/aggregable/none.rb +65 -0
- data/lib/mongoid/contextual/aggregable.rb +17 -0
- data/lib/mongoid/contextual/atomic.rb +29 -31
- data/lib/mongoid/contextual/command.rb +2 -5
- data/lib/mongoid/contextual/geo_near.rb +13 -44
- data/lib/mongoid/contextual/map_reduce.rb +7 -35
- data/lib/mongoid/contextual/memory.rb +187 -81
- data/lib/mongoid/contextual/mongo.rb +360 -239
- data/lib/mongoid/contextual/none.rb +109 -31
- data/lib/mongoid/contextual/queryable.rb +3 -4
- data/lib/mongoid/contextual.rb +9 -11
- data/lib/mongoid/copyable.rb +42 -17
- data/lib/mongoid/criteria/findable.rb +19 -19
- data/lib/mongoid/criteria/includable.rb +30 -33
- data/lib/mongoid/criteria/inspectable.rb +2 -3
- data/lib/mongoid/criteria/marshalable.rb +12 -7
- data/lib/mongoid/criteria/modifiable.rb +2 -19
- data/lib/mongoid/criteria/options.rb +2 -3
- data/lib/mongoid/criteria/permission.rb +3 -2
- data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
- data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
- data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
- data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
- data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -16
- data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
- data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
- data/lib/mongoid/criteria/queryable/extensions/time.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
- data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
- data/lib/mongoid/criteria/queryable/key.rb +39 -24
- data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
- data/lib/mongoid/criteria/queryable/mergeable.rb +200 -40
- data/lib/mongoid/criteria/queryable/optional.rb +10 -59
- data/lib/mongoid/criteria/queryable/options.rb +4 -21
- data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
- data/lib/mongoid/criteria/queryable/selectable.rb +417 -171
- data/lib/mongoid/criteria/queryable/selector.rb +127 -30
- data/lib/mongoid/criteria/queryable/smash.rb +42 -18
- data/lib/mongoid/criteria/queryable/storable.rb +237 -0
- data/lib/mongoid/criteria/queryable.rb +18 -15
- data/lib/mongoid/criteria/scopable.rb +29 -21
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +95 -107
- data/lib/mongoid/deprecable.rb +37 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +148 -97
- data/lib/mongoid/equality.rb +35 -18
- data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
- data/lib/mongoid/errors/callback.rb +2 -3
- data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
- data/lib/mongoid/errors/delete_restriction.rb +10 -13
- data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
- data/lib/mongoid/errors/document_not_found.rb +35 -21
- data/lib/mongoid/errors/empty_config_file.rb +25 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
- data/lib/mongoid/errors/invalid_collection.rb +2 -1
- data/lib/mongoid/errors/invalid_config_file.rb +25 -0
- data/lib/mongoid/errors/invalid_config_option.rb +3 -4
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +8 -7
- data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
- data/lib/mongoid/errors/invalid_field_option.rb +2 -3
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_find.rb +2 -3
- data/lib/mongoid/errors/invalid_includes.rb +2 -3
- data/lib/mongoid/errors/invalid_index.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +4 -5
- data/lib/mongoid/errors/invalid_path.rb +2 -3
- data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
- data/lib/mongoid/errors/invalid_query.rb +40 -0
- data/lib/mongoid/errors/invalid_relation.rb +5 -10
- data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
- data/lib/mongoid/errors/invalid_scope.rb +2 -3
- data/lib/mongoid/errors/invalid_session_use.rb +3 -6
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
- data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
- data/lib/mongoid/errors/invalid_time.rb +2 -3
- data/lib/mongoid/errors/inverse_not_found.rb +3 -4
- data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
- data/lib/mongoid/errors/mixed_relations.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +6 -13
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
- data/lib/mongoid/errors/no_client_config.rb +4 -5
- data/lib/mongoid/errors/no_client_database.rb +3 -4
- data/lib/mongoid/errors/no_client_hosts.rb +3 -4
- data/lib/mongoid/errors/no_clients_config.rb +2 -3
- data/lib/mongoid/errors/no_default_client.rb +3 -4
- data/lib/mongoid/errors/no_environment.rb +2 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
- data/lib/mongoid/errors/no_metadata.rb +2 -3
- data/lib/mongoid/errors/no_parent.rb +2 -3
- data/lib/mongoid/errors/readonly_attribute.rb +3 -4
- data/lib/mongoid/errors/readonly_document.rb +3 -6
- data/lib/mongoid/errors/scope_overwrite.rb +2 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
- data/lib/mongoid/errors/unknown_attribute.rb +3 -4
- data/lib/mongoid/errors/unknown_model.rb +2 -3
- data/lib/mongoid/errors/unsaved_document.rb +3 -2
- data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -1
- data/lib/mongoid/errors.rb +14 -3
- data/lib/mongoid/evolvable.rb +4 -5
- data/lib/mongoid/extensions/array.rb +37 -44
- data/lib/mongoid/extensions/big_decimal.rb +35 -21
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +10 -6
- data/lib/mongoid/extensions/date.rb +32 -25
- data/lib/mongoid/extensions/date_time.rb +5 -13
- data/lib/mongoid/extensions/decimal128.rb +2 -5
- data/lib/mongoid/extensions/false_class.rb +5 -8
- data/lib/mongoid/extensions/float.rb +12 -14
- data/lib/mongoid/extensions/hash.rb +87 -45
- data/lib/mongoid/extensions/integer.rb +12 -16
- data/lib/mongoid/extensions/module.rb +3 -4
- data/lib/mongoid/extensions/nil_class.rb +2 -5
- data/lib/mongoid/extensions/object.rb +25 -50
- data/lib/mongoid/extensions/object_id.rb +2 -7
- data/lib/mongoid/extensions/range.rb +42 -20
- data/lib/mongoid/extensions/regexp.rb +13 -7
- data/lib/mongoid/extensions/set.rb +13 -11
- data/lib/mongoid/extensions/string.rb +30 -61
- data/lib/mongoid/extensions/symbol.rb +6 -22
- data/lib/mongoid/extensions/time.rb +37 -23
- data/lib/mongoid/extensions/time_with_zone.rb +26 -9
- data/lib/mongoid/extensions/true_class.rb +5 -8
- data/lib/mongoid/extensions.rb +19 -3
- data/lib/mongoid/factory.rb +104 -17
- data/lib/mongoid/fields/foreign_key.rb +14 -26
- data/lib/mongoid/fields/localized.rb +11 -15
- data/lib/mongoid/fields/standard.rb +13 -43
- data/lib/mongoid/fields/validators/macro.rb +32 -20
- data/lib/mongoid/fields/validators.rb +2 -1
- data/lib/mongoid/fields.rb +328 -85
- data/lib/mongoid/findable.rb +90 -33
- data/lib/mongoid/indexable/specification.rb +5 -18
- data/lib/mongoid/indexable/validators/options.rb +8 -9
- data/lib/mongoid/indexable.rb +6 -21
- data/lib/mongoid/inspectable.rb +4 -11
- data/lib/mongoid/interceptable.rb +191 -41
- data/lib/mongoid/loggable.rb +13 -16
- data/lib/mongoid/matchable.rb +3 -154
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/bits.rb +41 -0
- data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_all_set.rb +20 -0
- data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
- data/lib/mongoid/matcher/bits_any_set.rb +20 -0
- data/lib/mongoid/matcher/elem_match.rb +36 -0
- data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
- data/lib/mongoid/matcher/eq.rb +11 -0
- data/lib/mongoid/matcher/eq_impl.rb +67 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +35 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +62 -0
- data/lib/mongoid/matcher/field_operator.rb +54 -0
- data/lib/mongoid/matcher/gt.rb +17 -0
- data/lib/mongoid/matcher/gte.rb +17 -0
- data/lib/mongoid/matcher/in.rb +25 -0
- data/lib/mongoid/matcher/lt.rb +17 -0
- data/lib/mongoid/matcher/lte.rb +17 -0
- data/lib/mongoid/matcher/mod.rb +17 -0
- data/lib/mongoid/matcher/ne.rb +16 -0
- data/lib/mongoid/matcher/nin.rb +11 -0
- data/lib/mongoid/matcher/nor.rb +25 -0
- data/lib/mongoid/matcher/not.rb +29 -0
- data/lib/mongoid/matcher/or.rb +21 -0
- data/lib/mongoid/matcher/regex.rb +41 -0
- data/lib/mongoid/matcher/size.rb +26 -0
- data/lib/mongoid/matcher/type.rb +99 -0
- data/lib/mongoid/matcher.rb +130 -0
- data/lib/mongoid/persistable/creatable.rb +22 -30
- data/lib/mongoid/persistable/deletable.rb +6 -22
- data/lib/mongoid/persistable/destroyable.rb +12 -11
- data/lib/mongoid/persistable/incrementable.rb +6 -7
- data/lib/mongoid/persistable/logical.rb +4 -6
- data/lib/mongoid/persistable/poppable.rb +3 -6
- data/lib/mongoid/persistable/pullable.rb +3 -8
- data/lib/mongoid/persistable/pushable.rb +3 -8
- data/lib/mongoid/persistable/renamable.rb +10 -8
- data/lib/mongoid/persistable/savable.rb +5 -10
- data/lib/mongoid/persistable/settable.rb +3 -6
- data/lib/mongoid/persistable/unsettable.rb +9 -9
- data/lib/mongoid/persistable/updatable.rb +50 -31
- data/lib/mongoid/persistable/upsertable.rb +5 -10
- data/lib/mongoid/persistable.rb +135 -40
- data/lib/mongoid/persistence_context.rb +85 -45
- data/lib/mongoid/positional.rb +2 -5
- data/lib/mongoid/query_cache.rb +13 -280
- data/lib/mongoid/railtie.rb +3 -16
- data/lib/mongoid/railties/controller_runtime.rb +4 -2
- data/lib/mongoid/railties/database.rake +9 -0
- data/lib/mongoid/reloadable.rb +19 -22
- data/lib/mongoid/scopable.rb +34 -57
- data/lib/mongoid/selectable.rb +8 -18
- data/lib/mongoid/serializable.rb +33 -34
- data/lib/mongoid/shardable.rb +108 -21
- data/lib/mongoid/stateful.rb +38 -19
- data/lib/mongoid/stringified_symbol.rb +52 -0
- data/lib/mongoid/tasks/database.rake +12 -5
- data/lib/mongoid/tasks/database.rb +85 -7
- data/lib/mongoid/threaded/lifecycle.rb +7 -26
- data/lib/mongoid/threaded.rb +44 -67
- data/lib/mongoid/timestamps/created/short.rb +2 -1
- data/lib/mongoid/timestamps/created.rb +4 -3
- data/lib/mongoid/timestamps/short.rb +2 -1
- data/lib/mongoid/timestamps/timeless.rb +6 -9
- data/lib/mongoid/timestamps/updated/short.rb +2 -1
- data/lib/mongoid/timestamps/updated.rb +5 -6
- data/lib/mongoid/timestamps.rb +3 -2
- data/lib/mongoid/touchable.rb +54 -25
- data/lib/mongoid/traversable.rb +185 -61
- data/lib/mongoid/validatable/associated.rb +99 -22
- data/lib/mongoid/validatable/format.rb +2 -1
- data/lib/mongoid/validatable/length.rb +2 -1
- data/lib/mongoid/validatable/localizable.rb +3 -4
- data/lib/mongoid/validatable/macros.rb +2 -9
- data/lib/mongoid/validatable/presence.rb +10 -15
- data/lib/mongoid/validatable/queryable.rb +2 -3
- data/lib/mongoid/validatable/uniqueness.rb +29 -41
- data/lib/mongoid/validatable.rb +22 -33
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +34 -15
- data/lib/rails/generators/mongoid/config/config_generator.rb +2 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
- data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
- data/lib/rails/generators/mongoid_generator.rb +2 -1
- data/lib/rails/mongoid.rb +4 -5
- data/spec/README.md +19 -4
- data/spec/config/mongoid.yml +17 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +31 -27
- data/spec/integration/associations/belongs_to_spec.rb +20 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
- data/spec/integration/associations/embedded_spec.rb +162 -55
- data/spec/integration/associations/embeds_many_spec.rb +219 -0
- data/spec/integration/associations/embeds_one_spec.rb +41 -0
- data/spec/integration/associations/foreign_key_spec.rb +107 -0
- data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +61 -0
- data/spec/integration/associations/has_many_spec.rb +128 -0
- data/spec/integration/associations/has_one_spec.rb +272 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
- data/spec/integration/associations/reverse_population_spec.rb +34 -0
- data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
- data/spec/integration/associations/scope_option_spec.rb +101 -0
- data/spec/integration/atomic/modifiers_spec.rb +116 -0
- data/spec/integration/bson_regexp_raw_spec.rb +19 -0
- data/spec/integration/callbacks_models.rb +107 -1
- data/spec/integration/callbacks_spec.rb +262 -8
- data/spec/integration/contextual/empty_spec.rb +141 -0
- data/spec/integration/criteria/alias_query_spec.rb +161 -0
- data/spec/integration/criteria/date_field_spec.rb +1 -2
- data/spec/integration/criteria/default_scope_spec.rb +72 -0
- data/spec/integration/criteria/logical_spec.rb +124 -0
- data/spec/integration/criteria/range_spec.rb +359 -0
- data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
- data/spec/integration/discriminator_key_spec.rb +392 -0
- data/spec/integration/discriminator_value_spec.rb +206 -0
- data/spec/integration/document_spec.rb +30 -1
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +73 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
- data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
- data/spec/integration/matcher_operator_data/comment.yml +22 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
- data/spec/integration/matcher_operator_data/in.yml +210 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
- data/spec/integration/matcher_operator_data/mod.yml +55 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_data/type.yml +70 -0
- data/spec/integration/matcher_operator_data/type_array.yml +16 -0
- data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
- data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
- data/spec/integration/matcher_operator_data/type_code.yml +26 -0
- data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
- data/spec/integration/matcher_operator_data/type_date.yml +39 -0
- data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
- data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
- data/spec/integration/matcher_operator_data/type_double.yml +15 -0
- data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
- data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
- data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
- data/spec/integration/matcher_operator_data/type_null.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object.yml +23 -0
- data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
- data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
- data/spec/integration/matcher_operator_data/type_string.yml +15 -0
- data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
- data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
- data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
- data/spec/integration/matcher_operator_spec.rb +122 -0
- data/spec/integration/matcher_spec.rb +283 -0
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/integration/server_query_spec.rb +141 -0
- data/spec/integration/shardable_spec.rb +148 -0
- data/spec/integration/stringified_symbol_field_spec.rb +203 -0
- data/spec/lite_spec_helper.rb +18 -6
- data/spec/mongoid/association/accessors_spec.rb +284 -77
- data/spec/mongoid/association/auto_save_spec.rb +74 -33
- data/spec/mongoid/association/builders_spec.rb +3 -1
- data/spec/mongoid/association/constrainable_spec.rb +2 -0
- data/spec/mongoid/association/counter_cache_spec.rb +35 -33
- data/spec/mongoid/association/depending_spec.rb +431 -338
- data/spec/mongoid/association/eager_spec.rb +8 -5
- data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
- data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +84 -22
- data/spec/mongoid/association/embedded/embedded_in_spec.rb +3 -1
- data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +687 -173
- data/spec/mongoid/association/embedded/embeds_many_models.rb +174 -1
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +71 -1
- data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +23 -21
- data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +2 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +22 -0
- data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +31 -1
- data/spec/mongoid/association/macros_spec.rb +11 -9
- data/spec/mongoid/association/nested/many_spec.rb +2 -0
- data/spec/mongoid/association/nested/one_spec.rb +18 -12
- data/spec/mongoid/association/options_spec.rb +2 -0
- data/spec/mongoid/association/polymorphic_spec.rb +2 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +242 -12
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -3
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +46 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +25 -5
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +418 -361
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +68 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +81 -4
- data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
- data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +314 -133
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +848 -451
- data/spec/mongoid/association/referenced/has_many_models.rb +61 -1
- data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_many_spec.rb +48 -0
- data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
- data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
- data/spec/mongoid/association/referenced/has_one_models.rb +65 -0
- data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +24 -1
- data/spec/mongoid/association/reflections_spec.rb +2 -0
- data/spec/mongoid/association/syncable_spec.rb +47 -31
- data/spec/mongoid/association_spec.rb +2 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
- data/spec/mongoid/atomic/paths_spec.rb +66 -26
- data/spec/mongoid/atomic_spec.rb +53 -6
- data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
- data/spec/mongoid/attributes/nested_spec.rb +149 -78
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
- data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
- data/spec/mongoid/attributes/projector_spec.rb +40 -0
- data/spec/mongoid/attributes/readonly_spec.rb +24 -22
- data/spec/mongoid/attributes_spec.rb +683 -65
- data/spec/mongoid/cacheable_spec.rb +6 -4
- data/spec/mongoid/changeable_spec.rb +185 -43
- data/spec/mongoid/clients/factory_spec.rb +128 -28
- data/spec/mongoid/clients/options_spec.rb +45 -26
- data/spec/mongoid/clients/sessions_spec.rb +25 -66
- data/spec/mongoid/clients/transactions_spec.rb +54 -29
- data/spec/mongoid/clients_spec.rb +65 -8
- data/spec/mongoid/composable_spec.rb +2 -0
- data/spec/mongoid/config/environment_spec.rb +126 -8
- data/spec/mongoid/config/options_spec.rb +22 -3
- data/spec/mongoid/config_spec.rb +377 -1
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
- 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/aggregable/mongo_spec.rb +122 -20
- data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
- data/spec/mongoid/contextual/atomic_spec.rb +205 -67
- data/spec/mongoid/contextual/geo_near_spec.rb +20 -18
- data/spec/mongoid/contextual/map_reduce_spec.rb +6 -18
- data/spec/mongoid/contextual/memory_spec.rb +1360 -91
- data/spec/mongoid/contextual/mongo_spec.rb +1871 -544
- data/spec/mongoid/contextual/none_spec.rb +39 -73
- data/spec/mongoid/copyable_spec.rb +657 -26
- data/spec/mongoid/copyable_spec_models.rb +30 -0
- data/spec/mongoid/criteria/findable_spec.rb +161 -228
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
- data/spec/mongoid/criteria/modifiable_spec.rb +43 -40
- data/spec/mongoid/criteria/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +2 -59
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +34 -16
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +13 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
- data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
- data/spec/mongoid/criteria/queryable/options_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1643 -286
- data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1191 -2752
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +91 -4
- data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
- data/spec/mongoid/criteria/queryable/storable_spec.rb +298 -0
- data/spec/mongoid/criteria/scopable_spec.rb +129 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +409 -0
- data/spec/mongoid/criteria_spec.rb +1322 -1723
- data/spec/mongoid/document_fields_spec.rb +179 -5
- data/spec/mongoid/document_persistence_context_spec.rb +0 -1
- data/spec/mongoid/document_query_spec.rb +89 -0
- data/spec/mongoid/document_spec.rb +153 -87
- data/spec/mongoid/equality_spec.rb +144 -41
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
- data/spec/mongoid/errors/callback_spec.rb +2 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
- data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
- data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
- data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
- data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
- data/spec/mongoid/errors/no_environment_spec.rb +5 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
- data/spec/mongoid/errors/no_parent_spec.rb +3 -1
- data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
- data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
- data/spec/mongoid/errors/validations_spec.rb +2 -0
- data/spec/mongoid/extensions/array_spec.rb +41 -45
- data/spec/mongoid/extensions/big_decimal_spec.rb +714 -212
- data/spec/mongoid/extensions/binary_spec.rb +46 -9
- data/spec/mongoid/extensions/boolean_spec.rb +70 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
- data/spec/mongoid/extensions/date_spec.rb +58 -140
- data/spec/mongoid/extensions/date_time_spec.rb +32 -69
- data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
- data/spec/mongoid/extensions/false_class_spec.rb +3 -1
- data/spec/mongoid/extensions/float_spec.rb +66 -73
- data/spec/mongoid/extensions/hash_spec.rb +138 -3
- data/spec/mongoid/extensions/integer_spec.rb +61 -63
- data/spec/mongoid/extensions/module_spec.rb +2 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
- data/spec/mongoid/extensions/object_id_spec.rb +2 -0
- data/spec/mongoid/extensions/object_spec.rb +13 -24
- data/spec/mongoid/extensions/range_spec.rb +257 -54
- data/spec/mongoid/extensions/regexp_spec.rb +60 -33
- data/spec/mongoid/extensions/set_spec.rb +108 -0
- data/spec/mongoid/extensions/string_spec.rb +111 -50
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
- data/spec/mongoid/extensions/symbol_spec.rb +20 -25
- data/spec/mongoid/extensions/time_spec.rb +663 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +50 -31
- data/spec/mongoid/extensions/true_class_spec.rb +3 -1
- data/spec/mongoid/extensions_spec.rb +16 -2
- data/spec/mongoid/factory_spec.rb +347 -27
- data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
- data/spec/mongoid/fields/localized_spec.rb +43 -16
- data/spec/mongoid/fields/standard_spec.rb +2 -0
- data/spec/mongoid/fields_spec.rb +776 -80
- data/spec/mongoid/findable_spec.rb +133 -34
- data/spec/mongoid/indexable/specification_spec.rb +4 -2
- data/spec/mongoid/indexable_spec.rb +65 -18
- data/spec/mongoid/inspectable_spec.rb +39 -2
- data/spec/mongoid/interceptable_spec.rb +955 -103
- data/spec/mongoid/interceptable_spec_models.rb +307 -0
- data/spec/mongoid/loggable_spec.rb +2 -0
- data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +114 -29
- data/spec/mongoid/persistable/deletable_spec.rb +274 -12
- data/spec/mongoid/persistable/destroyable_spec.rb +202 -12
- data/spec/mongoid/persistable/incrementable_spec.rb +23 -7
- data/spec/mongoid/persistable/logical_spec.rb +19 -3
- data/spec/mongoid/persistable/poppable_spec.rb +19 -3
- data/spec/mongoid/persistable/pullable_spec.rb +36 -6
- data/spec/mongoid/persistable/pushable_spec.rb +36 -6
- data/spec/mongoid/persistable/renamable_spec.rb +18 -2
- data/spec/mongoid/persistable/savable_spec.rb +188 -25
- data/spec/mongoid/persistable/settable_spec.rb +24 -8
- data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
- data/spec/mongoid/persistable/updatable_spec.rb +45 -23
- data/spec/mongoid/persistable/upsertable_spec.rb +18 -2
- data/spec/mongoid/persistable_spec.rb +85 -9
- data/spec/mongoid/persistence_context_spec.rb +52 -1
- data/spec/mongoid/positional_spec.rb +2 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
- data/spec/mongoid/query_cache_spec.rb +339 -87
- data/spec/mongoid/relations/proxy_spec.rb +8 -6
- data/spec/mongoid/reloadable_spec.rb +357 -22
- data/spec/mongoid/scopable_spec.rb +121 -37
- data/spec/mongoid/selectable_spec.rb +8 -6
- data/spec/mongoid/serializable_spec.rb +160 -29
- data/spec/mongoid/shardable_models.rb +75 -0
- data/spec/mongoid/shardable_spec.rb +239 -34
- data/spec/mongoid/stateful_spec.rb +31 -1
- data/spec/mongoid/tasks/database_rake_spec.rb +2 -0
- data/spec/mongoid/tasks/database_spec.rb +2 -0
- data/spec/mongoid/threaded_spec.rb +4 -2
- data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
- data/spec/mongoid/timestamps/created_spec.rb +3 -1
- data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
- data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
- data/spec/mongoid/timestamps/updated_spec.rb +5 -3
- data/spec/mongoid/timestamps_spec.rb +398 -6
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +296 -33
- data/spec/mongoid/touchable_spec_models.rb +57 -0
- data/spec/mongoid/traversable_spec.rb +1160 -1
- data/spec/mongoid/validatable/associated_spec.rb +15 -30
- data/spec/mongoid/validatable/format_spec.rb +2 -0
- data/spec/mongoid/validatable/length_spec.rb +2 -0
- data/spec/mongoid/validatable/numericality_spec.rb +2 -0
- data/spec/mongoid/validatable/presence_spec.rb +28 -22
- data/spec/mongoid/validatable/uniqueness_spec.rb +128 -98
- data/spec/mongoid/validatable_spec.rb +5 -3
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +3 -1
- data/spec/rails/controller_extension/controller_runtime_spec.rb +5 -3
- data/spec/rails/mongoid_spec.rb +8 -18
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/cluster_config.rb +14 -4
- data/spec/shared/lib/mrss/constraints.rb +51 -27
- data/spec/shared/lib/mrss/docker_runner.rb +37 -4
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -18
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +18 -1
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +156 -66
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +171 -45
- data/spec/shared/shlib/set_env.sh +47 -6
- data/spec/spec_helper.rb +38 -36
- data/spec/support/authorization.rb +2 -0
- data/spec/support/client_registry.rb +9 -0
- data/spec/support/constraints.rb +39 -8
- data/spec/support/expectations.rb +5 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/macros.rb +77 -0
- data/spec/{app → support}/models/account.rb +3 -1
- data/spec/{app → support}/models/acolyte.rb +2 -0
- data/spec/{app → support}/models/actor.rb +3 -1
- data/spec/support/models/actress.rb +4 -0
- data/spec/{app → support}/models/address.rb +6 -0
- data/spec/{app → support}/models/address_component.rb +2 -0
- data/spec/{app → support}/models/address_number.rb +2 -0
- data/spec/{app → support}/models/agency.rb +2 -0
- data/spec/{app → support}/models/agent.rb +2 -0
- data/spec/{app → support}/models/album.rb +2 -0
- data/spec/{app → support}/models/alert.rb +2 -0
- data/spec/{app → support}/models/animal.rb +2 -0
- data/spec/{app → support}/models/answer.rb +2 -0
- data/spec/{app → support}/models/appointment.rb +2 -0
- data/spec/support/models/armrest.rb +9 -0
- data/spec/{app → support}/models/article.rb +2 -0
- data/spec/{app → support}/models/artist.rb +4 -0
- data/spec/{app → support}/models/artwork.rb +2 -0
- data/spec/support/models/audible_sound.rb +3 -0
- data/spec/{app → support}/models/audio.rb +2 -0
- data/spec/support/models/augmentation.rb +25 -0
- data/spec/{app → support}/models/author.rb +2 -0
- data/spec/{app → support}/models/baby.rb +2 -0
- data/spec/{app → support}/models/band.rb +9 -0
- data/spec/{app → support}/models/bar.rb +2 -0
- data/spec/{app → support}/models/basic.rb +2 -0
- data/spec/support/models/bed.rb +3 -0
- data/spec/{app → support}/models/big_palette.rb +2 -0
- data/spec/{app → support}/models/birthday.rb +2 -0
- data/spec/support/models/bolt.rb +7 -0
- data/spec/{app → support}/models/bomb.rb +2 -0
- data/spec/{app → support}/models/book.rb +2 -0
- data/spec/{app → support}/models/breed.rb +2 -0
- data/spec/{app → support}/models/browser.rb +3 -1
- data/spec/{app → support}/models/building.rb +2 -0
- data/spec/{app → support}/models/building_address.rb +2 -0
- data/spec/{app → support}/models/bus.rb +2 -0
- data/spec/{app → support}/models/business.rb +2 -0
- data/spec/{app → support}/models/callback_test.rb +2 -0
- data/spec/{app → support}/models/canvas.rb +3 -1
- data/spec/support/models/car.rb +3 -0
- data/spec/{app → support}/models/cat.rb +2 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/{app → support}/models/category.rb +2 -0
- data/spec/{app → support}/models/child.rb +2 -0
- data/spec/{app → support}/models/child_doc.rb +5 -3
- data/spec/{app → support}/models/church.rb +2 -0
- data/spec/{app → support}/models/circle.rb +2 -0
- data/spec/{app → support}/models/circuit.rb +2 -0
- data/spec/support/models/circus.rb +12 -0
- data/spec/{app → support}/models/code.rb +4 -0
- data/spec/support/models/coding/pull_request.rb +11 -0
- data/spec/support/models/coding.rb +3 -0
- data/spec/{app → support}/models/comment.rb +2 -0
- data/spec/{app → support}/models/company.rb +2 -0
- data/spec/{app → support}/models/consumption_period.rb +2 -0
- data/spec/{app → support}/models/contextable_item.rb +2 -0
- data/spec/{app → support}/models/contractor.rb +2 -0
- data/spec/{app → support}/models/cookie.rb +2 -0
- data/spec/{app → support}/models/country_code.rb +4 -0
- data/spec/{app → support}/models/courier_job.rb +2 -0
- data/spec/support/models/crate.rb +12 -0
- data/spec/{app → support}/models/customer.rb +0 -1
- data/spec/{app → support}/models/customer_address.rb +0 -1
- data/spec/support/models/deed.rb +7 -0
- data/spec/{app → support}/models/definition.rb +2 -0
- data/spec/{app → support}/models/delegating_patient.rb +0 -1
- data/spec/{app → support}/models/description.rb +2 -0
- data/spec/{app → support}/models/dictionary.rb +8 -0
- data/spec/{app → support}/models/division.rb +2 -0
- data/spec/{app → support}/models/doctor.rb +2 -0
- data/spec/{app → support}/models/dog.rb +2 -0
- data/spec/{app → support}/models/dokument.rb +2 -0
- data/spec/{app → support}/models/draft.rb +2 -0
- data/spec/{app → support}/models/dragon.rb +2 -0
- data/spec/{app → support}/models/driver.rb +3 -1
- data/spec/{app → support}/models/drug.rb +2 -0
- data/spec/{app → support}/models/dungeon.rb +2 -0
- data/spec/{app → support}/models/edit.rb +2 -0
- data/spec/{app → support}/models/email.rb +2 -0
- data/spec/{app → support}/models/employer.rb +2 -0
- data/spec/{app → support}/models/entry.rb +2 -0
- data/spec/support/models/eraser.rb +3 -0
- data/spec/{app → support}/models/even.rb +2 -0
- data/spec/{app → support}/models/event.rb +2 -0
- data/spec/{app → support}/models/exhibition.rb +2 -0
- data/spec/{app → support}/models/exhibitor.rb +2 -0
- data/spec/{app → support}/models/explosion.rb +2 -0
- data/spec/{app → support}/models/eye.rb +2 -0
- data/spec/{app → support}/models/eye_bowl.rb +2 -0
- data/spec/{app → support}/models/face.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/{app → support}/models/favorite.rb +2 -0
- data/spec/{app → support}/models/filesystem.rb +2 -0
- data/spec/{app → support}/models/fire_hydrant.rb +2 -0
- data/spec/{app → support}/models/firefox.rb +2 -0
- data/spec/{app → support}/models/fish.rb +2 -0
- data/spec/{app → support}/models/folder.rb +2 -0
- data/spec/{app → support}/models/folder_item.rb +2 -0
- data/spec/{app → support}/models/fruits.rb +2 -0
- data/spec/{app → support}/models/game.rb +2 -0
- data/spec/{app → support}/models/ghost.rb +2 -0
- data/spec/support/models/guitar.rb +4 -0
- data/spec/support/models/hole.rb +12 -0
- data/spec/{app → support}/models/home.rb +2 -0
- data/spec/{app → support}/models/house.rb +2 -0
- data/spec/{app → support}/models/html_writer.rb +2 -0
- data/spec/{app → support}/models/id_key.rb +2 -0
- data/spec/support/models/idnodef.rb +7 -0
- data/spec/{app → support}/models/image.rb +2 -0
- data/spec/{app → support}/models/implant.rb +11 -0
- data/spec/support/models/instrument.rb +8 -0
- data/spec/{app → support}/models/item.rb +3 -1
- data/spec/{app → support}/models/jar.rb +2 -0
- data/spec/{app → support}/models/kaleidoscope.rb +2 -0
- data/spec/{app → support}/models/kangaroo.rb +3 -1
- data/spec/{app → support}/models/label.rb +6 -1
- data/spec/{app → support}/models/language.rb +2 -0
- data/spec/{app → support}/models/lat_lng.rb +2 -0
- data/spec/{app → support}/models/league.rb +2 -0
- data/spec/support/models/learner.rb +4 -0
- data/spec/{app → support}/models/line_item.rb +2 -0
- data/spec/{app → support}/models/location.rb +2 -0
- data/spec/{app → support}/models/login.rb +2 -0
- data/spec/{app → support}/models/manufacturer.rb +2 -0
- data/spec/{app → support}/models/meat.rb +2 -0
- data/spec/{app → support}/models/membership.rb +3 -0
- data/spec/{app → support}/models/message.rb +2 -0
- data/spec/{app → support}/models/minim.rb +0 -1
- data/spec/{app → support}/models/mixed_drink.rb +2 -0
- data/spec/support/models/mop.rb +24 -0
- data/spec/{app → support}/models/movie.rb +2 -0
- data/spec/support/models/my_hash.rb +4 -0
- data/spec/{app → support}/models/name.rb +12 -0
- data/spec/support/models/name_only.rb +8 -0
- data/spec/{app → support}/models/node.rb +2 -0
- data/spec/{app → support}/models/note.rb +2 -0
- data/spec/support/models/nut.rb +7 -0
- data/spec/{app → support}/models/odd.rb +2 -0
- data/spec/support/models/order.rb +12 -0
- data/spec/{app → support}/models/ordered_post.rb +3 -1
- data/spec/{app → support}/models/ordered_preference.rb +2 -0
- data/spec/{app → support}/models/oscar.rb +2 -0
- data/spec/support/models/other_owner_object.rb +4 -0
- data/spec/{app → support}/models/override.rb +2 -0
- data/spec/{app → support}/models/ownable.rb +2 -0
- data/spec/{app → support}/models/owner.rb +4 -0
- data/spec/{app → support}/models/pack.rb +2 -0
- data/spec/{app → support}/models/page.rb +2 -0
- data/spec/{app → support}/models/page_question.rb +2 -0
- data/spec/{app → support}/models/palette.rb +3 -1
- data/spec/{app → support}/models/parent.rb +2 -0
- data/spec/{app → support}/models/parent_doc.rb +2 -0
- data/spec/support/models/passport.rb +22 -0
- data/spec/{app → support}/models/patient.rb +2 -0
- data/spec/{app → support}/models/pdf_writer.rb +2 -0
- data/spec/support/models/pencil.rb +3 -0
- data/spec/{app → support}/models/person.rb +23 -1
- data/spec/{app → support}/models/pet.rb +2 -0
- data/spec/{app → support}/models/pet_owner.rb +2 -0
- data/spec/{app → support}/models/phone.rb +5 -1
- data/spec/support/models/piano.rb +4 -0
- data/spec/{app → support}/models/pizza.rb +2 -0
- data/spec/{app → support}/models/player.rb +4 -0
- data/spec/{app → support}/models/post.rb +2 -0
- data/spec/{app → support}/models/post_genre.rb +2 -0
- data/spec/support/models/powerup.rb +25 -0
- data/spec/{app → support}/models/preference.rb +2 -0
- data/spec/{app → support}/models/princess.rb +2 -0
- data/spec/{app → support}/models/product.rb +2 -0
- data/spec/support/models/profile.rb +17 -0
- data/spec/{app → support}/models/pronunciation.rb +2 -0
- data/spec/{app → support}/models/pub.rb +2 -0
- data/spec/support/models/publication/encyclopedia.rb +11 -0
- data/spec/support/models/publication/review.rb +13 -0
- data/spec/support/models/publication.rb +4 -0
- data/spec/{app → support}/models/purchase.rb +2 -0
- data/spec/support/models/purchased_item.rb +10 -0
- data/spec/support/models/purse.rb +9 -0
- data/spec/{app → support}/models/question.rb +2 -0
- data/spec/{app → support}/models/quiz.rb +2 -0
- data/spec/{app → support}/models/rating.rb +2 -0
- data/spec/{app → support}/models/record.rb +2 -0
- data/spec/{app → support}/models/registry.rb +3 -0
- data/spec/{app → support}/models/role.rb +2 -0
- data/spec/{app → support}/models/root_category.rb +2 -0
- data/spec/{app → support}/models/sandwich.rb +2 -0
- data/spec/{app → support}/models/scheduler.rb +2 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/scribe.rb +7 -0
- data/spec/support/models/sealer.rb +7 -0
- data/spec/support/models/seat.rb +24 -0
- data/spec/{app → support}/models/seo.rb +2 -0
- data/spec/support/models/series.rb +7 -0
- data/spec/{app → support}/models/server.rb +2 -0
- data/spec/{app → support}/models/service.rb +2 -0
- data/spec/{app → support}/models/shape.rb +4 -2
- data/spec/{app → support}/models/shelf.rb +2 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/{app → support}/models/shipment_address.rb +2 -0
- data/spec/{app → support}/models/shipping_container.rb +2 -0
- data/spec/{app → support}/models/shipping_pack.rb +2 -0
- data/spec/support/models/shirt.rb +11 -0
- data/spec/{app → support}/models/shop.rb +2 -0
- data/spec/{app → support}/models/short_agent.rb +2 -0
- data/spec/{app → support}/models/short_quiz.rb +2 -0
- data/spec/{app → support}/models/simple.rb +2 -0
- data/spec/{app → support}/models/slave.rb +2 -0
- data/spec/{app → support}/models/song.rb +2 -0
- data/spec/{app → support}/models/sound.rb +2 -0
- data/spec/support/models/spacer.rb +7 -0
- data/spec/{app → support}/models/square.rb +2 -0
- data/spec/{app → support}/models/staff.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
- data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
- data/spec/{app → support}/models/strategy.rb +2 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/{app → support}/models/sub_item.rb +2 -0
- data/spec/{app → support}/models/subscription.rb +2 -0
- data/spec/{app → support}/models/survey.rb +2 -0
- data/spec/{app → support}/models/symptom.rb +2 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +2 -0
- data/spec/{app → support}/models/target.rb +2 -0
- data/spec/{app → support}/models/template.rb +2 -0
- data/spec/{app → support}/models/thing.rb +2 -0
- data/spec/support/models/threadlocker.rb +7 -0
- data/spec/{app → support}/models/title.rb +2 -0
- data/spec/{app → support}/models/tool.rb +4 -2
- data/spec/{app → support}/models/topping.rb +2 -0
- data/spec/support/models/toy.rb +9 -0
- data/spec/{app → support}/models/track.rb +2 -0
- data/spec/{app → support}/models/translation.rb +2 -0
- data/spec/{app → support}/models/tree.rb +2 -0
- data/spec/support/models/truck.rb +7 -0
- data/spec/{app → support}/models/user.rb +2 -0
- data/spec/{app → support}/models/user_account.rb +2 -0
- data/spec/{app → support}/models/validation_callback.rb +2 -0
- data/spec/support/models/vehicle.rb +18 -0
- data/spec/{app → support}/models/version.rb +2 -0
- data/spec/{app → support}/models/vertex.rb +3 -1
- data/spec/{app → support}/models/vet_visit.rb +2 -0
- data/spec/{app → support}/models/video.rb +2 -0
- data/spec/support/models/video_game.rb +3 -0
- data/spec/support/models/washer.rb +7 -0
- data/spec/support/models/weapon.rb +25 -0
- data/spec/{app → support}/models/wiki_page.rb +3 -0
- data/spec/{app → support}/models/word.rb +2 -0
- data/spec/{app → support}/models/word_origin.rb +2 -0
- data/spec/{app → support}/models/writer.rb +4 -2
- 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/shared/time.rb +53 -0
- data/spec/support/spec_config.rb +12 -3
- data.tar.gz.sig +0 -0
- metadata +1162 -764
- metadata.gz.sig +0 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
- data/lib/mongoid/errors/eager_load.rb +0 -22
- data/lib/mongoid/errors/invalid_value.rb +0 -16
- data/lib/mongoid/matchable/all.rb +0 -28
- data/lib/mongoid/matchable/and.rb +0 -30
- data/lib/mongoid/matchable/default.rb +0 -119
- data/lib/mongoid/matchable/elem_match.rb +0 -34
- data/lib/mongoid/matchable/eq.rb +0 -22
- data/lib/mongoid/matchable/exists.rb +0 -23
- data/lib/mongoid/matchable/gt.rb +0 -23
- data/lib/mongoid/matchable/gte.rb +0 -23
- data/lib/mongoid/matchable/in.rb +0 -24
- data/lib/mongoid/matchable/lt.rb +0 -23
- data/lib/mongoid/matchable/lte.rb +0 -23
- data/lib/mongoid/matchable/ne.rb +0 -21
- data/lib/mongoid/matchable/nin.rb +0 -22
- data/lib/mongoid/matchable/nor.rb +0 -37
- data/lib/mongoid/matchable/or.rb +0 -33
- data/lib/mongoid/matchable/regexp.rb +0 -27
- data/lib/mongoid/matchable/size.rb +0 -21
- data/lib/support/ruby_version.rb +0 -26
- data/spec/app/models/actress.rb +0 -2
- data/spec/app/models/augmentation.rb +0 -11
- data/spec/app/models/bed.rb +0 -1
- data/spec/app/models/car.rb +0 -1
- data/spec/app/models/circus.rb +0 -7
- data/spec/app/models/eraser.rb +0 -1
- data/spec/app/models/learner.rb +0 -2
- data/spec/app/models/my_hash.rb +0 -2
- data/spec/app/models/other_owner_object.rb +0 -2
- data/spec/app/models/passport.rb +0 -5
- data/spec/app/models/pencil.rb +0 -1
- data/spec/app/models/powerup.rb +0 -11
- data/spec/app/models/profile.rb +0 -5
- data/spec/app/models/series.rb +0 -4
- data/spec/app/models/truck.rb +0 -3
- data/spec/app/models/vehicle.rb +0 -11
- data/spec/app/models/video_game.rb +0 -1
- data/spec/app/models/weapon.rb +0 -11
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
- data/spec/mongoid/matchable/all_spec.rb +0 -31
- data/spec/mongoid/matchable/and_spec.rb +0 -187
- data/spec/mongoid/matchable/default_spec.rb +0 -137
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
- data/spec/mongoid/matchable/eq_spec.rb +0 -48
- data/spec/mongoid/matchable/exists_spec.rb +0 -57
- data/spec/mongoid/matchable/gt_spec.rb +0 -86
- data/spec/mongoid/matchable/gte_spec.rb +0 -84
- data/spec/mongoid/matchable/in_spec.rb +0 -49
- data/spec/mongoid/matchable/lt_spec.rb +0 -85
- data/spec/mongoid/matchable/lte_spec.rb +0 -85
- data/spec/mongoid/matchable/ne_spec.rb +0 -46
- data/spec/mongoid/matchable/nin_spec.rb +0 -48
- data/spec/mongoid/matchable/nor_spec.rb +0 -209
- data/spec/mongoid/matchable/or_spec.rb +0 -131
- data/spec/mongoid/matchable/regexp_spec.rb +0 -59
- data/spec/mongoid/matchable/size_spec.rb +0 -25
- data/spec/mongoid/matchable_spec.rb +0 -853
- data/spec/support/cluster_config.rb +0 -158
- data/spec/support/session_registry.rb +0 -50
- /data/spec/{app → support}/models/array_field.rb +0 -0
- /data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
- /data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
- /data/spec/{app → support}/models/updatable.rb +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require "mongoid/contextual/atomic"
|
|
3
4
|
require "mongoid/contextual/aggregable/mongo"
|
|
4
5
|
require "mongoid/contextual/command"
|
|
@@ -9,15 +10,16 @@ require "mongoid/association/eager_loadable"
|
|
|
9
10
|
module Mongoid
|
|
10
11
|
module Contextual
|
|
11
12
|
class Mongo
|
|
13
|
+
extend Forwardable
|
|
12
14
|
include Enumerable
|
|
13
15
|
include Aggregable::Mongo
|
|
14
16
|
include Atomic
|
|
15
17
|
include Association::EagerLoadable
|
|
16
18
|
include Queryable
|
|
17
19
|
|
|
20
|
+
Mongoid.deprecate(self, :geo_near)
|
|
21
|
+
|
|
18
22
|
# Options constant.
|
|
19
|
-
#
|
|
20
|
-
# @since 5.0.0
|
|
21
23
|
OPTIONS = [ :hint,
|
|
22
24
|
:limit,
|
|
23
25
|
:skip,
|
|
@@ -35,18 +37,6 @@ module Mongoid
|
|
|
35
37
|
# @attribute [r] view The Mongo collection view.
|
|
36
38
|
attr_reader :view
|
|
37
39
|
|
|
38
|
-
# Is the context cached?
|
|
39
|
-
#
|
|
40
|
-
# @example Is the context cached?
|
|
41
|
-
# context.cached?
|
|
42
|
-
#
|
|
43
|
-
# @return [ true, false ] If the context is cached.
|
|
44
|
-
#
|
|
45
|
-
# @since 3.0.0
|
|
46
|
-
def cached?
|
|
47
|
-
!!@cache
|
|
48
|
-
end
|
|
49
|
-
|
|
50
40
|
# Get the number of documents matching the query.
|
|
51
41
|
#
|
|
52
42
|
# @example Get the number of matching documents.
|
|
@@ -64,11 +54,33 @@ module Mongoid
|
|
|
64
54
|
# into the count.
|
|
65
55
|
#
|
|
66
56
|
# @return [ Integer ] The number of matches.
|
|
67
|
-
#
|
|
68
|
-
# @since 3.0.0
|
|
69
57
|
def count(options = {}, &block)
|
|
70
58
|
return super(&block) if block_given?
|
|
71
|
-
|
|
59
|
+
|
|
60
|
+
if valid_for_count_documents?
|
|
61
|
+
view.count_documents(options)
|
|
62
|
+
else
|
|
63
|
+
view.count(options)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Get the estimated number of documents matching the query.
|
|
68
|
+
#
|
|
69
|
+
# Unlike count, estimated_count does not take a block because it is not
|
|
70
|
+
# traditionally defined (with a block) on Enumarable like count is.
|
|
71
|
+
#
|
|
72
|
+
# @example Get the estimated number of matching documents.
|
|
73
|
+
# context.estimated_count
|
|
74
|
+
#
|
|
75
|
+
# @param [ Hash ] options The options, such as maxTimeMS to be factored
|
|
76
|
+
# into the count.
|
|
77
|
+
#
|
|
78
|
+
# @return [ Integer ] The number of matches.
|
|
79
|
+
def estimated_count(options = {})
|
|
80
|
+
unless self.criteria.selector.empty?
|
|
81
|
+
raise Mongoid::Errors::InvalidEstimatedCountCriteria.new(self.klass)
|
|
82
|
+
end
|
|
83
|
+
view.estimated_document_count(options)
|
|
72
84
|
end
|
|
73
85
|
|
|
74
86
|
# Delete all documents in the database that match the selector.
|
|
@@ -77,8 +89,6 @@ module Mongoid
|
|
|
77
89
|
# context.delete
|
|
78
90
|
#
|
|
79
91
|
# @return [ nil ] Nil.
|
|
80
|
-
#
|
|
81
|
-
# @since 3.0.0
|
|
82
92
|
def delete
|
|
83
93
|
view.delete_many.deleted_count
|
|
84
94
|
end
|
|
@@ -90,8 +100,6 @@ module Mongoid
|
|
|
90
100
|
# context.destroy
|
|
91
101
|
#
|
|
92
102
|
# @return [ nil ] Nil.
|
|
93
|
-
#
|
|
94
|
-
# @since 3.0.0
|
|
95
103
|
def destroy
|
|
96
104
|
each.inject(0) do |count, doc|
|
|
97
105
|
doc.destroy
|
|
@@ -106,14 +114,23 @@ module Mongoid
|
|
|
106
114
|
# @example Get the distinct values.
|
|
107
115
|
# context.distinct(:name)
|
|
108
116
|
#
|
|
109
|
-
# @param [ String
|
|
117
|
+
# @param [ String | Symbol ] field The name of the field.
|
|
110
118
|
#
|
|
111
119
|
# @return [ Array<Object> ] The distinct values for the field.
|
|
112
|
-
#
|
|
113
|
-
# @since 3.0.0
|
|
114
120
|
def distinct(field)
|
|
115
|
-
|
|
116
|
-
|
|
121
|
+
name = if Mongoid.legacy_pluck_distinct
|
|
122
|
+
klass.database_field_name(field)
|
|
123
|
+
else
|
|
124
|
+
klass.cleanse_localized_field_names(field)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
view.distinct(name).map do |value|
|
|
128
|
+
if Mongoid.legacy_pluck_distinct
|
|
129
|
+
value.class.demongoize(value)
|
|
130
|
+
else
|
|
131
|
+
is_translation = "#{name}_translations" == field.to_s
|
|
132
|
+
recursive_demongoize(name, value, is_translation)
|
|
133
|
+
end
|
|
117
134
|
end
|
|
118
135
|
end
|
|
119
136
|
|
|
@@ -126,14 +143,11 @@ module Mongoid
|
|
|
126
143
|
# end
|
|
127
144
|
#
|
|
128
145
|
# @return [ Enumerator ] The enumerator.
|
|
129
|
-
#
|
|
130
|
-
# @since 3.0.0
|
|
131
146
|
def each(&block)
|
|
132
147
|
if block_given?
|
|
133
148
|
documents_for_iteration.each do |doc|
|
|
134
149
|
yield_document(doc, &block)
|
|
135
150
|
end
|
|
136
|
-
@cache_loaded = true
|
|
137
151
|
self
|
|
138
152
|
else
|
|
139
153
|
to_enum
|
|
@@ -146,19 +160,11 @@ module Mongoid
|
|
|
146
160
|
# context.exists?
|
|
147
161
|
#
|
|
148
162
|
# @note We don't use count here since Mongo does not use counted
|
|
149
|
-
# b-tree indexes
|
|
150
|
-
# used to determine the value.
|
|
151
|
-
#
|
|
152
|
-
# @return [ true, false ] If the count is more than zero.
|
|
163
|
+
# b-tree indexes.
|
|
153
164
|
#
|
|
154
|
-
# @
|
|
165
|
+
# @return [ true | false ] If the count is more than zero.
|
|
155
166
|
def exists?
|
|
156
|
-
|
|
157
|
-
return @count > 0 if instance_variable_defined?(:@count)
|
|
158
|
-
|
|
159
|
-
try_cache(:exists) do
|
|
160
|
-
!!(view.projection(_id: 1).limit(1).first)
|
|
161
|
-
end
|
|
167
|
+
!!(view.projection(_id: 1).limit(1).first)
|
|
162
168
|
end
|
|
163
169
|
|
|
164
170
|
# Run an explain on the criteria.
|
|
@@ -167,8 +173,6 @@ module Mongoid
|
|
|
167
173
|
# Band.where(name: "Depeche Mode").explain
|
|
168
174
|
#
|
|
169
175
|
# @return [ Hash ] The explain result.
|
|
170
|
-
#
|
|
171
|
-
# @since 3.0.0
|
|
172
176
|
def explain
|
|
173
177
|
view.explain
|
|
174
178
|
end
|
|
@@ -182,13 +186,11 @@ module Mongoid
|
|
|
182
186
|
# @param [ Hash ] update The updates.
|
|
183
187
|
# @param [ Hash ] options The command options.
|
|
184
188
|
#
|
|
185
|
-
# @option options [ :before
|
|
189
|
+
# @option options [ :before | :after ] :return_document Return the updated document
|
|
186
190
|
# from before or after update.
|
|
187
|
-
# @option options [ true
|
|
191
|
+
# @option options [ true | false ] :upsert Create the document if it doesn't exist.
|
|
188
192
|
#
|
|
189
193
|
# @return [ Document ] The result of the command.
|
|
190
|
-
#
|
|
191
|
-
# @since 5.0.0
|
|
192
194
|
def find_one_and_update(update, options = {})
|
|
193
195
|
if doc = view.find_one_and_update(update, options)
|
|
194
196
|
Factory.from_db(klass, doc)
|
|
@@ -204,13 +206,11 @@ module Mongoid
|
|
|
204
206
|
# @param [ Hash ] replacement The replacement.
|
|
205
207
|
# @param [ Hash ] options The command options.
|
|
206
208
|
#
|
|
207
|
-
# @option options [ :before
|
|
209
|
+
# @option options [ :before | :after ] :return_document Return the updated document
|
|
208
210
|
# from before or after update.
|
|
209
|
-
# @option options [ true
|
|
211
|
+
# @option options [ true | false ] :upsert Create the document if it doesn't exist.
|
|
210
212
|
#
|
|
211
213
|
# @return [ Document ] The result of the command.
|
|
212
|
-
#
|
|
213
|
-
# @since 5.0.0
|
|
214
214
|
def find_one_and_replace(replacement, options = {})
|
|
215
215
|
if doc = view.find_one_and_replace(replacement, options)
|
|
216
216
|
Factory.from_db(klass, doc)
|
|
@@ -224,8 +224,6 @@ module Mongoid
|
|
|
224
224
|
# context.find_one_and_delete
|
|
225
225
|
#
|
|
226
226
|
# @return [ Document ] The result of the command.
|
|
227
|
-
#
|
|
228
|
-
# @since 5.0.0
|
|
229
227
|
def find_one_and_delete
|
|
230
228
|
if doc = view.find_one_and_delete
|
|
231
229
|
Factory.from_db(klass, doc)
|
|
@@ -240,31 +238,16 @@ module Mongoid
|
|
|
240
238
|
# @note Automatically adding a sort on _id when no other sort is
|
|
241
239
|
# defined on the criteria has the potential to cause bad performance issues.
|
|
242
240
|
# If you experience unexpected poor performance when using #first or #last
|
|
243
|
-
# and have no sort defined on the criteria, use
|
|
244
|
-
# Be aware that #
|
|
241
|
+
# and have no sort defined on the criteria, use #take instead.
|
|
242
|
+
# Be aware that #take won't guarantee order.
|
|
245
243
|
#
|
|
246
|
-
# @param [
|
|
247
|
-
#
|
|
248
|
-
# @option opts [ :none ] :id_sort Don't apply a sort on _id if no other sort
|
|
249
|
-
# is defined on the criteria.
|
|
244
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
250
245
|
#
|
|
251
246
|
# @return [ Document ] The first document.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
try_cache(:first) do
|
|
257
|
-
if sort = view.sort || ({ _id: 1 } unless opts[:id_sort] == :none)
|
|
258
|
-
if raw_doc = view.sort(sort).limit(-1).first
|
|
259
|
-
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
260
|
-
eager_load([doc]).first
|
|
261
|
-
end
|
|
262
|
-
else
|
|
263
|
-
if raw_doc = view.limit(-1).first
|
|
264
|
-
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
265
|
-
eager_load([doc]).first
|
|
266
|
-
end
|
|
267
|
-
end
|
|
247
|
+
def first(limit = nil)
|
|
248
|
+
sort = view.sort || { _id: 1 }
|
|
249
|
+
if raw_docs = view.sort(sort).limit(limit || 1).to_a
|
|
250
|
+
process_raw_docs(raw_docs, limit)
|
|
268
251
|
end
|
|
269
252
|
end
|
|
270
253
|
alias :one :first
|
|
@@ -272,10 +255,7 @@ module Mongoid
|
|
|
272
255
|
# Return the first result without applying sort
|
|
273
256
|
#
|
|
274
257
|
# @api private
|
|
275
|
-
#
|
|
276
|
-
# @since 4.0.2
|
|
277
258
|
def find_first
|
|
278
|
-
return documents.first if cached? && cache_loaded?
|
|
279
259
|
if raw_doc = view.first
|
|
280
260
|
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
281
261
|
eager_load([doc]).first
|
|
@@ -300,34 +280,11 @@ module Mongoid
|
|
|
300
280
|
#
|
|
301
281
|
# @return [ GeoNear ] The GeoNear command.
|
|
302
282
|
#
|
|
303
|
-
# @
|
|
283
|
+
# @deprecated
|
|
304
284
|
def geo_near(coordinates)
|
|
305
285
|
GeoNear.new(collection, criteria, coordinates)
|
|
306
286
|
end
|
|
307
287
|
|
|
308
|
-
# Invoke the block for each element of Contextual. Create a new array
|
|
309
|
-
# containing the values returned by the block.
|
|
310
|
-
#
|
|
311
|
-
# If the symbol field name is passed instead of the block, additional
|
|
312
|
-
# optimizations would be used.
|
|
313
|
-
#
|
|
314
|
-
# @example Map by some field.
|
|
315
|
-
# context.map(:field1)
|
|
316
|
-
#
|
|
317
|
-
# @example Map with block.
|
|
318
|
-
# context.map(&:field1)
|
|
319
|
-
#
|
|
320
|
-
# @param [ Symbol ] field The field name.
|
|
321
|
-
#
|
|
322
|
-
# @return [ Array ] The result of mapping.
|
|
323
|
-
def map(field = nil, &block)
|
|
324
|
-
if block_given?
|
|
325
|
-
super(&block)
|
|
326
|
-
else
|
|
327
|
-
criteria.pluck(field)
|
|
328
|
-
end
|
|
329
|
-
end
|
|
330
|
-
|
|
331
288
|
# Create the new Mongo context. This delegates operations to the
|
|
332
289
|
# underlying driver.
|
|
333
290
|
#
|
|
@@ -335,17 +292,15 @@ module Mongoid
|
|
|
335
292
|
# Mongo.new(criteria)
|
|
336
293
|
#
|
|
337
294
|
# @param [ Criteria ] criteria The criteria.
|
|
338
|
-
#
|
|
339
|
-
# @since 3.0.0
|
|
340
295
|
def initialize(criteria)
|
|
341
|
-
@criteria, @klass
|
|
296
|
+
@criteria, @klass = criteria, criteria.klass
|
|
342
297
|
@collection = @klass.collection
|
|
343
298
|
criteria.send(:merge_type_selection)
|
|
344
299
|
@view = collection.find(criteria.selector, session: _session)
|
|
345
300
|
apply_options
|
|
346
301
|
end
|
|
347
302
|
|
|
348
|
-
|
|
303
|
+
def_delegator :@klass, :database_field_name
|
|
349
304
|
|
|
350
305
|
# Get the last document in the database for the criteria's selector.
|
|
351
306
|
#
|
|
@@ -355,36 +310,26 @@ module Mongoid
|
|
|
355
310
|
# @note Automatically adding a sort on _id when no other sort is
|
|
356
311
|
# defined on the criteria has the potential to cause bad performance issues.
|
|
357
312
|
# If you experience unexpected poor performance when using #first or #last
|
|
358
|
-
# and have no sort defined on the criteria, use
|
|
359
|
-
# Be aware that #
|
|
313
|
+
# and have no sort defined on the criteria, use #take instead.
|
|
314
|
+
# Be aware that #take won't guarantee order.
|
|
360
315
|
#
|
|
361
|
-
# @param [
|
|
316
|
+
# @param [ Integer ] limit The number of documents to return.
|
|
362
317
|
#
|
|
363
|
-
# @
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
def last(opts = {})
|
|
368
|
-
try_cache(:last) do
|
|
369
|
-
with_inverse_sorting(opts) do
|
|
370
|
-
if raw_doc = view.limit(-1).first
|
|
371
|
-
doc = Factory.from_db(klass, raw_doc, criteria)
|
|
372
|
-
eager_load([doc]).first
|
|
373
|
-
end
|
|
374
|
-
end
|
|
375
|
-
end
|
|
318
|
+
# @return [ Document ] The last document.
|
|
319
|
+
def last(limit = nil)
|
|
320
|
+
raw_docs = view.sort(inverse_sorting).limit(limit || 1).to_a.reverse
|
|
321
|
+
process_raw_docs(raw_docs, limit)
|
|
376
322
|
end
|
|
377
323
|
|
|
378
|
-
#
|
|
324
|
+
# Returns the number of documents in the database matching
|
|
325
|
+
# the query selector.
|
|
379
326
|
#
|
|
380
327
|
# @example Get the length.
|
|
381
328
|
# context.length
|
|
382
329
|
#
|
|
383
330
|
# @return [ Integer ] The number of documents.
|
|
384
|
-
#
|
|
385
|
-
# @since 3.0.0
|
|
386
331
|
def length
|
|
387
|
-
|
|
332
|
+
self.count
|
|
388
333
|
end
|
|
389
334
|
alias :size :length
|
|
390
335
|
|
|
@@ -396,12 +341,48 @@ module Mongoid
|
|
|
396
341
|
# @param [ Integer ] value The number of documents to return.
|
|
397
342
|
#
|
|
398
343
|
# @return [ Mongo ] The context.
|
|
399
|
-
#
|
|
400
|
-
# @since 3.0.0
|
|
401
344
|
def limit(value)
|
|
402
345
|
@view = view.limit(value) and self
|
|
403
346
|
end
|
|
404
347
|
|
|
348
|
+
# Take the given number of documents from the database.
|
|
349
|
+
#
|
|
350
|
+
# @example Take 10 documents
|
|
351
|
+
# context.take(10)
|
|
352
|
+
#
|
|
353
|
+
# @param [ Integer | nil ] limit The number of documents to return or nil.
|
|
354
|
+
#
|
|
355
|
+
# @return [ Document | Array<Document> ] The list of documents, or one
|
|
356
|
+
# document if no value was given.
|
|
357
|
+
def take(limit = nil)
|
|
358
|
+
if limit
|
|
359
|
+
limit(limit).to_a
|
|
360
|
+
else
|
|
361
|
+
# Do to_a first so that the Mongo#first method is not used and the
|
|
362
|
+
# result is not sorted.
|
|
363
|
+
limit(1).to_a.first
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
# Take one document from the database and raise an error if there are none.
|
|
368
|
+
#
|
|
369
|
+
# @example Take a document
|
|
370
|
+
# context.take!
|
|
371
|
+
#
|
|
372
|
+
# @return [ Document ] The document.
|
|
373
|
+
#
|
|
374
|
+
# @raises [ Mongoid::Errors::DocumentNotFound ] raises when there are no
|
|
375
|
+
# documents to take.
|
|
376
|
+
def take!
|
|
377
|
+
# Do to_a first so that the Mongo#first method is not used and the
|
|
378
|
+
# result is not sorted.
|
|
379
|
+
if fst = limit(1).to_a.first
|
|
380
|
+
fst
|
|
381
|
+
else
|
|
382
|
+
raise Errors::DocumentNotFound.new(klass, nil, nil)
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
405
386
|
# Initiate a map/reduce operation from the context.
|
|
406
387
|
#
|
|
407
388
|
# @example Initiate a map/reduce.
|
|
@@ -411,8 +392,6 @@ module Mongoid
|
|
|
411
392
|
# @param [ String ] reduce The reduce js function.
|
|
412
393
|
#
|
|
413
394
|
# @return [ MapReduce ] The map/reduce lazy wrapper.
|
|
414
|
-
#
|
|
415
|
-
# @since 3.0.0
|
|
416
395
|
def map_reduce(map, reduce)
|
|
417
396
|
MapReduce.new(collection, criteria, map, reduce)
|
|
418
397
|
end
|
|
@@ -423,28 +402,119 @@ module Mongoid
|
|
|
423
402
|
# @example Pluck a field.
|
|
424
403
|
# context.pluck(:_id)
|
|
425
404
|
#
|
|
426
|
-
# @
|
|
427
|
-
# serialization.
|
|
405
|
+
# @param [ String | Symbol ] *fields Field(s) to pluck.
|
|
428
406
|
#
|
|
429
|
-
# @
|
|
430
|
-
#
|
|
431
|
-
# @return [ Array<Object, Array> ] The plucked values.
|
|
432
|
-
#
|
|
433
|
-
# @since 3.1.0
|
|
407
|
+
# @return [ Array<Object> | Array<Array<Object>> ] The plucked values.
|
|
434
408
|
def pluck(*fields)
|
|
409
|
+
# Multiple fields can map to the same field name. For example, plucking
|
|
410
|
+
# a field and its _translations field map to the same field in the database.
|
|
411
|
+
# because of this, we need to keep track of the fields requested.
|
|
412
|
+
normalized_field_names = []
|
|
435
413
|
normalized_select = fields.inject({}) do |hash, f|
|
|
436
|
-
|
|
414
|
+
db_fn = klass.database_field_name(f)
|
|
415
|
+
normalized_field_names.push(db_fn)
|
|
416
|
+
|
|
417
|
+
if Mongoid.legacy_pluck_distinct
|
|
418
|
+
hash[db_fn] = true
|
|
419
|
+
else
|
|
420
|
+
hash[klass.cleanse_localized_field_names(f)] = true
|
|
421
|
+
end
|
|
437
422
|
hash
|
|
438
423
|
end
|
|
439
424
|
|
|
440
425
|
view.projection(normalized_select).reduce([]) do |plucked, doc|
|
|
441
|
-
values =
|
|
442
|
-
|
|
426
|
+
values = normalized_field_names.map do |n|
|
|
427
|
+
if Mongoid.legacy_pluck_distinct
|
|
428
|
+
n.include?('.') ? doc[n.partition('.')[0]] : doc[n]
|
|
429
|
+
else
|
|
430
|
+
extract_value(doc, n)
|
|
431
|
+
end
|
|
443
432
|
end
|
|
444
433
|
plucked << (values.size == 1 ? values.first : values)
|
|
445
434
|
end
|
|
446
435
|
end
|
|
447
436
|
|
|
437
|
+
# Pick the single field values from the database.
|
|
438
|
+
#
|
|
439
|
+
# @example Pick a field.
|
|
440
|
+
# context.pick(:_id)
|
|
441
|
+
#
|
|
442
|
+
# @param [ String | Symbol ] *fields Field(s) to pick.
|
|
443
|
+
#
|
|
444
|
+
# @return [ Object | Array<Object> ] The picked values.
|
|
445
|
+
def pick(*fields)
|
|
446
|
+
limit(1).pluck(*fields).first
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
# Get a hash of counts for the values of a single field. For example,
|
|
450
|
+
# if the following documents were in the database:
|
|
451
|
+
#
|
|
452
|
+
# { _id: 1, age: 21 }
|
|
453
|
+
# { _id: 2, age: 21 }
|
|
454
|
+
# { _id: 3, age: 22 }
|
|
455
|
+
#
|
|
456
|
+
# Model.tally("age")
|
|
457
|
+
#
|
|
458
|
+
# would yield the following result:
|
|
459
|
+
#
|
|
460
|
+
# { 21 => 2, 22 => 1 }
|
|
461
|
+
#
|
|
462
|
+
# When tallying a field inside an array or embeds_many association:
|
|
463
|
+
#
|
|
464
|
+
# { _id: 1, array: [ { x: 1 }, { x: 2 } ] }
|
|
465
|
+
# { _id: 2, array: [ { x: 1 }, { x: 2 } ] }
|
|
466
|
+
# { _id: 3, array: [ { x: 1 }, { x: 3 } ] }
|
|
467
|
+
#
|
|
468
|
+
# Model.tally("array.x")
|
|
469
|
+
#
|
|
470
|
+
# The keys of the resulting hash are arrays:
|
|
471
|
+
#
|
|
472
|
+
# { [ 1, 2 ] => 2, [ 1, 3 ] => 1 }
|
|
473
|
+
#
|
|
474
|
+
# Note that if tallying an element in an array of hashes, and the key
|
|
475
|
+
# doesn't exist in some of the hashes, tally will not include those
|
|
476
|
+
# nil keys in the resulting hash:
|
|
477
|
+
#
|
|
478
|
+
# { _id: 1, array: [ { x: 1 }, { x: 2 }, { y: 3 } ] }
|
|
479
|
+
#
|
|
480
|
+
# Model.tally("array.x")
|
|
481
|
+
# # => { [ 1, 2 ] => 1 }
|
|
482
|
+
#
|
|
483
|
+
# @param [ String | Symbol ] field The field name.
|
|
484
|
+
#
|
|
485
|
+
# @return [ Hash ] The hash of counts.
|
|
486
|
+
def tally(field)
|
|
487
|
+
name = klass.cleanse_localized_field_names(field)
|
|
488
|
+
|
|
489
|
+
fld = klass.traverse_association_tree(name)
|
|
490
|
+
pipeline = [ { "$group" => { _id: "$#{name}", counts: { "$sum": 1 } } } ]
|
|
491
|
+
pipeline.unshift("$match" => view.filter) unless view.filter.blank?
|
|
492
|
+
|
|
493
|
+
collection.aggregate(pipeline).reduce({}) do |tallies, doc|
|
|
494
|
+
is_translation = "#{name}_translations" == field.to_s
|
|
495
|
+
val = doc["_id"]
|
|
496
|
+
|
|
497
|
+
key = if val.is_a?(Array)
|
|
498
|
+
val.map do |v|
|
|
499
|
+
demongoize_with_field(fld, v, is_translation)
|
|
500
|
+
end
|
|
501
|
+
else
|
|
502
|
+
demongoize_with_field(fld, val, is_translation)
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
# The only time where a key will already exist in the tallies hash
|
|
506
|
+
# is when the values are stored differently in the database, but
|
|
507
|
+
# demongoize to the same value. A good example of when this happens
|
|
508
|
+
# is when using localized fields. While the server query won't group
|
|
509
|
+
# together hashes that have other values in different languages, the
|
|
510
|
+
# demongoized value is just the translation in the current locale,
|
|
511
|
+
# which can be the same across multiple of those unequal hashes.
|
|
512
|
+
tallies[key] ||= 0
|
|
513
|
+
tallies[key] += doc["counts"]
|
|
514
|
+
tallies
|
|
515
|
+
end
|
|
516
|
+
end
|
|
517
|
+
|
|
448
518
|
# Skips the provided number of documents.
|
|
449
519
|
#
|
|
450
520
|
# @example Skip the documents.
|
|
@@ -453,8 +523,6 @@ module Mongoid
|
|
|
453
523
|
# @param [ Integer ] value The number of documents to skip.
|
|
454
524
|
#
|
|
455
525
|
# @return [ Mongo ] The context.
|
|
456
|
-
#
|
|
457
|
-
# @since 3.0.0
|
|
458
526
|
def skip(value)
|
|
459
527
|
@view = view.skip(value) and self
|
|
460
528
|
end
|
|
@@ -468,8 +536,6 @@ module Mongoid
|
|
|
468
536
|
# pairs.
|
|
469
537
|
#
|
|
470
538
|
# @return [ Mongo ] The context.
|
|
471
|
-
#
|
|
472
|
-
# @since 3.0.0
|
|
473
539
|
def sort(values = nil, &block)
|
|
474
540
|
if block_given?
|
|
475
541
|
super(&block)
|
|
@@ -493,8 +559,6 @@ module Mongoid
|
|
|
493
559
|
# an update should apply.
|
|
494
560
|
#
|
|
495
561
|
# @return [ nil, false ] False if no attributes were provided.
|
|
496
|
-
#
|
|
497
|
-
# @since 3.0.0
|
|
498
562
|
def update(attributes = nil, opts = {})
|
|
499
563
|
update_documents(attributes, :update_one, opts)
|
|
500
564
|
end
|
|
@@ -511,32 +575,12 @@ module Mongoid
|
|
|
511
575
|
# an update should apply.
|
|
512
576
|
#
|
|
513
577
|
# @return [ nil, false ] False if no attributes were provided.
|
|
514
|
-
#
|
|
515
|
-
# @since 3.0.0
|
|
516
578
|
def update_all(attributes = nil, opts = {})
|
|
517
579
|
update_documents(attributes, :update_many, opts)
|
|
518
580
|
end
|
|
519
581
|
|
|
520
582
|
private
|
|
521
583
|
|
|
522
|
-
# yield the block given or return the cached value
|
|
523
|
-
#
|
|
524
|
-
# @param [ String, Symbol ] key The instance variable name
|
|
525
|
-
#
|
|
526
|
-
# @return the result of the block
|
|
527
|
-
#
|
|
528
|
-
# @since 3.1.4
|
|
529
|
-
def try_cache(key, &block)
|
|
530
|
-
unless cached?
|
|
531
|
-
yield
|
|
532
|
-
else
|
|
533
|
-
unless ret = instance_variable_get("@#{key}")
|
|
534
|
-
instance_variable_set("@#{key}", ret = yield)
|
|
535
|
-
end
|
|
536
|
-
ret
|
|
537
|
-
end
|
|
538
|
-
end
|
|
539
|
-
|
|
540
584
|
# Update the documents for the provided method.
|
|
541
585
|
#
|
|
542
586
|
# @api private
|
|
@@ -547,9 +591,7 @@ module Mongoid
|
|
|
547
591
|
# @param [ Hash ] attributes The updates.
|
|
548
592
|
# @param [ Symbol ] method The method to use.
|
|
549
593
|
#
|
|
550
|
-
# @return [ true
|
|
551
|
-
#
|
|
552
|
-
# @since 3.0.4
|
|
594
|
+
# @return [ true | false ] If the update succeeded.
|
|
553
595
|
def update_documents(attributes, method = :update_one, opts = {})
|
|
554
596
|
return false unless attributes
|
|
555
597
|
attributes = Hash[attributes.map { |k, v| [klass.database_field_name(k.to_s), v] }]
|
|
@@ -562,8 +604,6 @@ module Mongoid
|
|
|
562
604
|
#
|
|
563
605
|
# @example Apply the field limitations.
|
|
564
606
|
# context.apply_fields
|
|
565
|
-
#
|
|
566
|
-
# @since 3.0.0
|
|
567
607
|
def apply_fields
|
|
568
608
|
if spec = criteria.options[:fields]
|
|
569
609
|
@view = view.projection(spec)
|
|
@@ -576,8 +616,6 @@ module Mongoid
|
|
|
576
616
|
#
|
|
577
617
|
# @example Apply all options.
|
|
578
618
|
# context.apply_options
|
|
579
|
-
#
|
|
580
|
-
# @since 3.1.0
|
|
581
619
|
def apply_options
|
|
582
620
|
apply_fields
|
|
583
621
|
OPTIONS.each do |name|
|
|
@@ -594,8 +632,6 @@ module Mongoid
|
|
|
594
632
|
#
|
|
595
633
|
# @example Apply the skip option.
|
|
596
634
|
# context.apply_option(:skip)
|
|
597
|
-
#
|
|
598
|
-
# @since 3.1.0
|
|
599
635
|
def apply_option(name)
|
|
600
636
|
if spec = criteria.options[name]
|
|
601
637
|
@view = view.send(name, spec)
|
|
@@ -605,63 +641,9 @@ module Mongoid
|
|
|
605
641
|
# Map the inverse sort symbols to the correct MongoDB values.
|
|
606
642
|
#
|
|
607
643
|
# @api private
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
#
|
|
612
|
-
# @since 3.0.0
|
|
613
|
-
def with_inverse_sorting(opts = {})
|
|
614
|
-
begin
|
|
615
|
-
if sort = criteria.options[:sort] || ( { _id: 1 } unless opts[:id_sort] == :none )
|
|
616
|
-
@view = view.sort(Hash[sort.map{|k, v| [k, -1*v]}])
|
|
617
|
-
end
|
|
618
|
-
yield
|
|
619
|
-
ensure
|
|
620
|
-
apply_option(:sort)
|
|
621
|
-
end
|
|
622
|
-
end
|
|
623
|
-
|
|
624
|
-
# Is the cache able to be added to?
|
|
625
|
-
#
|
|
626
|
-
# @api private
|
|
627
|
-
#
|
|
628
|
-
# @example Is the context cacheable?
|
|
629
|
-
# context.cacheable?
|
|
630
|
-
#
|
|
631
|
-
# @return [ true, false ] If caching, and the cache isn't loaded.
|
|
632
|
-
#
|
|
633
|
-
# @since 3.0.0
|
|
634
|
-
def cacheable?
|
|
635
|
-
cached? && !cache_loaded?
|
|
636
|
-
end
|
|
637
|
-
|
|
638
|
-
# Is the cache fully loaded? Will be true if caching after one full
|
|
639
|
-
# iteration.
|
|
640
|
-
#
|
|
641
|
-
# @api private
|
|
642
|
-
#
|
|
643
|
-
# @example Is the cache loaded?
|
|
644
|
-
# context.cache_loaded?
|
|
645
|
-
#
|
|
646
|
-
# @return [ true, false ] If the cache is loaded.
|
|
647
|
-
#
|
|
648
|
-
# @since 3.0.0
|
|
649
|
-
def cache_loaded?
|
|
650
|
-
!!@cache_loaded
|
|
651
|
-
end
|
|
652
|
-
|
|
653
|
-
# Get the documents for cached queries.
|
|
654
|
-
#
|
|
655
|
-
# @api private
|
|
656
|
-
#
|
|
657
|
-
# @example Get the cached documents.
|
|
658
|
-
# context.documents
|
|
659
|
-
#
|
|
660
|
-
# @return [ Array<Document> ] The documents.
|
|
661
|
-
#
|
|
662
|
-
# @since 3.0.0
|
|
663
|
-
def documents
|
|
664
|
-
@documents ||= []
|
|
644
|
+
def inverse_sorting
|
|
645
|
+
sort = view.sort || { _id: 1 }
|
|
646
|
+
Hash[sort.map{|k, v| [k, -1*v]}]
|
|
665
647
|
end
|
|
666
648
|
|
|
667
649
|
# Get the documents the context should iterate. This follows 3 rules:
|
|
@@ -677,11 +659,8 @@ module Mongoid
|
|
|
677
659
|
# @example Get the documents for iteration.
|
|
678
660
|
# context.documents_for_iteration
|
|
679
661
|
#
|
|
680
|
-
# @return [ Array<Document
|
|
681
|
-
#
|
|
682
|
-
# @since 3.0.0
|
|
662
|
+
# @return [ Array<Document> | Mongo::Collection::View ] The docs to iterate.
|
|
683
663
|
def documents_for_iteration
|
|
684
|
-
return documents if cached? && !documents.empty?
|
|
685
664
|
return view unless eager_loadable?
|
|
686
665
|
docs = view.map{ |doc| Factory.from_db(klass, doc, criteria) }
|
|
687
666
|
eager_load(docs)
|
|
@@ -697,13 +676,10 @@ module Mongoid
|
|
|
697
676
|
# end
|
|
698
677
|
#
|
|
699
678
|
# @param [ Document ] document The document to yield to.
|
|
700
|
-
#
|
|
701
|
-
# @since 3.0.0
|
|
702
679
|
def yield_document(document, &block)
|
|
703
680
|
doc = document.respond_to?(:_id) ?
|
|
704
681
|
document : Factory.from_db(klass, document, criteria)
|
|
705
682
|
yield(doc)
|
|
706
|
-
documents.push(doc) if cacheable?
|
|
707
683
|
end
|
|
708
684
|
|
|
709
685
|
private
|
|
@@ -715,6 +691,151 @@ module Mongoid
|
|
|
715
691
|
def acknowledged_write?
|
|
716
692
|
collection.write_concern.nil? || collection.write_concern.acknowledged?
|
|
717
693
|
end
|
|
694
|
+
|
|
695
|
+
# Fetch the element from the given hash and demongoize it using the
|
|
696
|
+
# given field. If the obj is an array, map over it and call this method
|
|
697
|
+
# on all of its elements.
|
|
698
|
+
#
|
|
699
|
+
# @param [ Hash | Array<Hash> ] obj The hash or array of hashes to fetch from.
|
|
700
|
+
# @param [ String ] meth The key to fetch from the hash.
|
|
701
|
+
# @param [ Field ] field The field to use for demongoization.
|
|
702
|
+
#
|
|
703
|
+
# @return [ Object ] The demongoized value.
|
|
704
|
+
#
|
|
705
|
+
# @api private
|
|
706
|
+
def fetch_and_demongoize(obj, meth, field)
|
|
707
|
+
if obj.is_a?(Array)
|
|
708
|
+
obj.map { |doc| fetch_and_demongoize(doc, meth, field) }
|
|
709
|
+
else
|
|
710
|
+
res = obj.try(:fetch, meth, nil)
|
|
711
|
+
field ? field.demongoize(res) : res.class.demongoize(res)
|
|
712
|
+
end
|
|
713
|
+
end
|
|
714
|
+
|
|
715
|
+
# Extracts the value for the given field name from the given attribute
|
|
716
|
+
# hash.
|
|
717
|
+
#
|
|
718
|
+
# @param [ Hash ] attrs The attributes hash.
|
|
719
|
+
# @param [ String ] field_name The name of the field to extract.
|
|
720
|
+
#
|
|
721
|
+
# @param [ Object ] The value for the given field name
|
|
722
|
+
def extract_value(attrs, field_name)
|
|
723
|
+
i = 1
|
|
724
|
+
num_meths = field_name.count('.') + 1
|
|
725
|
+
curr = attrs.dup
|
|
726
|
+
|
|
727
|
+
klass.traverse_association_tree(field_name) do |meth, obj, is_field|
|
|
728
|
+
field = obj if is_field
|
|
729
|
+
is_translation = false
|
|
730
|
+
# If no association or field was found, check if the meth is an
|
|
731
|
+
# _translations field.
|
|
732
|
+
if obj.nil? & tr = meth.match(/(.*)_translations\z/)&.captures&.first
|
|
733
|
+
is_translation = true
|
|
734
|
+
meth = tr
|
|
735
|
+
end
|
|
736
|
+
|
|
737
|
+
# 1. If curr is an array fetch from all elements in the array.
|
|
738
|
+
# 2. If the field is localized, and is not an _translations field
|
|
739
|
+
# (_translations fields don't show up in the fields hash).
|
|
740
|
+
# - If this is the end of the methods, return the translation for
|
|
741
|
+
# the current locale.
|
|
742
|
+
# - Otherwise, return the whole translations hash so the next method
|
|
743
|
+
# can select the language it wants.
|
|
744
|
+
# 3. If the meth is an _translations field, do not demongoize the
|
|
745
|
+
# value so the full hash is returned.
|
|
746
|
+
# 4. Otherwise, fetch and demongoize the value for the key meth.
|
|
747
|
+
curr = if curr.is_a? Array
|
|
748
|
+
res = fetch_and_demongoize(curr, meth, field)
|
|
749
|
+
res.empty? ? nil : res
|
|
750
|
+
elsif !is_translation && field&.localized?
|
|
751
|
+
if i < num_meths
|
|
752
|
+
curr.try(:fetch, meth, nil)
|
|
753
|
+
else
|
|
754
|
+
fetch_and_demongoize(curr, meth, field)
|
|
755
|
+
end
|
|
756
|
+
elsif is_translation
|
|
757
|
+
curr.try(:fetch, meth, nil)
|
|
758
|
+
else
|
|
759
|
+
fetch_and_demongoize(curr, meth, field)
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
i += 1
|
|
763
|
+
end
|
|
764
|
+
curr
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
# Recursively demongoize the given value. This method recursively traverses
|
|
768
|
+
# the class tree to find the correct field to use to demongoize the value.
|
|
769
|
+
#
|
|
770
|
+
# @param [ String ] field_name The name of the field to demongoize.
|
|
771
|
+
# @param [ Object ] value The value to demongoize.
|
|
772
|
+
# @param [ true | false ] is_translation The field we are retrieving is an
|
|
773
|
+
# _translations field.
|
|
774
|
+
#
|
|
775
|
+
# @return [ Object ] The demongoized value.
|
|
776
|
+
def recursive_demongoize(field_name, value, is_translation)
|
|
777
|
+
field = klass.traverse_association_tree(field_name)
|
|
778
|
+
demongoize_with_field(field, value, is_translation)
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
# Demongoize the value for the given field. If the field is nil or the
|
|
782
|
+
# field is a translations field, the value is demongoized using its class.
|
|
783
|
+
#
|
|
784
|
+
# @param [ Field ] field The field to use to demongoize.
|
|
785
|
+
# @param [ Object ] value The value to demongoize.
|
|
786
|
+
# @param [ true | false ] is_translation The field we are retrieving is an
|
|
787
|
+
# _translations field.
|
|
788
|
+
#
|
|
789
|
+
# @return [ Object ] The demongoized value.
|
|
790
|
+
#
|
|
791
|
+
# @api private
|
|
792
|
+
def demongoize_with_field(field, value, is_translation)
|
|
793
|
+
if field
|
|
794
|
+
# If it's a localized field that's not a hash, don't demongoize
|
|
795
|
+
# again, we already have the translation. If it's an _translations
|
|
796
|
+
# field, don't demongoize, we want the full hash not just a
|
|
797
|
+
# specific translation.
|
|
798
|
+
# If it is a hash, and it's not a translations field, we need to
|
|
799
|
+
# demongoize to get the correct translation.
|
|
800
|
+
if field.localized? && (!value.is_a?(Hash) || is_translation)
|
|
801
|
+
value.class.demongoize(value)
|
|
802
|
+
else
|
|
803
|
+
field.demongoize(value)
|
|
804
|
+
end
|
|
805
|
+
else
|
|
806
|
+
value.class.demongoize(value)
|
|
807
|
+
end
|
|
808
|
+
end
|
|
809
|
+
|
|
810
|
+
# Process the raw documents retrieved for #first/#last.
|
|
811
|
+
#
|
|
812
|
+
# @return [ Array<Document> | Document ] The list of documents or a
|
|
813
|
+
# single document.
|
|
814
|
+
def process_raw_docs(raw_docs, limit)
|
|
815
|
+
docs = raw_docs.map do |d|
|
|
816
|
+
Factory.from_db(klass, d, criteria)
|
|
817
|
+
end
|
|
818
|
+
docs = eager_load(docs)
|
|
819
|
+
limit ? docs : docs.first
|
|
820
|
+
end
|
|
821
|
+
|
|
822
|
+
# Queries whether the current context is valid for use with
|
|
823
|
+
# the #count_documents? predicate. A context is valid if it
|
|
824
|
+
# does not include a `$where` operator.
|
|
825
|
+
#
|
|
826
|
+
# @return [ true | false ] whether or not the current context
|
|
827
|
+
# excludes a `$where` operator.
|
|
828
|
+
def valid_for_count_documents?(hash = view.filter)
|
|
829
|
+
# Note that `view.filter` is a BSON::Document, and all keys in a
|
|
830
|
+
# BSON::Document are strings; we don't need to worry about symbol
|
|
831
|
+
# representations of `$where`.
|
|
832
|
+
hash.keys.each do |key|
|
|
833
|
+
return false if key == '$where'
|
|
834
|
+
return false if hash[key].is_a?(Hash) && !valid_for_count_documents?(hash[key])
|
|
835
|
+
end
|
|
836
|
+
|
|
837
|
+
true
|
|
838
|
+
end
|
|
718
839
|
end
|
|
719
840
|
end
|
|
720
841
|
end
|