mongoid 3.1.7 → 4.0.0.alpha1
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
- data/CHANGELOG.md +317 -11
- data/README.md +4 -5
- data/lib/config/locales/en.yml +9 -12
- data/lib/mongoid.rb +6 -75
- data/lib/mongoid/atomic.rb +0 -11
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/attributes.rb +30 -108
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/{dirty.rb → changeable.rb} +5 -2
- data/lib/mongoid/composable.rb +104 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/command.rb +26 -0
- data/lib/mongoid/contextual/map_reduce.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +6 -5
- data/lib/mongoid/contextual/mongo.rb +59 -28
- data/lib/mongoid/contextual/text_search.rb +180 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +13 -33
- data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +1 -1
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/document.rb +28 -12
- data/lib/mongoid/errors.rb +1 -1
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/extensions.rb +2 -7
- data/lib/mongoid/extensions/array.rb +2 -2
- data/lib/mongoid/extensions/boolean.rb +14 -17
- data/lib/mongoid/extensions/float.rb +1 -0
- data/lib/mongoid/extensions/hash.rb +1 -1
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +8 -2
- data/lib/mongoid/extensions/string.rb +5 -17
- data/lib/mongoid/extensions/time.rb +2 -2
- data/lib/mongoid/factory.rb +3 -3
- data/lib/mongoid/fields.rb +9 -8
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/standard.rb +4 -16
- data/lib/mongoid/fields/validators/macro.rb +11 -3
- data/lib/mongoid/{finders.rb → findable.rb} +6 -2
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +3 -52
- data/lib/mongoid/log_subscriber.rb +22 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/persistable.rb +212 -0
- data/lib/mongoid/persistable/creatable.rb +188 -0
- data/lib/mongoid/persistable/deletable.rb +148 -0
- data/lib/mongoid/persistable/destroyable.rb +55 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +151 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +12 -6
- data/lib/mongoid/relations.rb +3 -3
- data/lib/mongoid/relations/accessors.rb +13 -46
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +0 -23
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager.rb +47 -0
- data/lib/mongoid/relations/eager/base.rb +57 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +30 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +40 -0
- data/lib/mongoid/relations/eager/has_many.rb +37 -0
- data/lib/mongoid/relations/eager/has_one.rb +29 -0
- data/lib/mongoid/relations/embedded/batchable.rb +3 -4
- data/lib/mongoid/relations/embedded/many.rb +7 -27
- data/lib/mongoid/relations/macros.rb +2 -4
- data/lib/mongoid/relations/many.rb +30 -31
- data/lib/mongoid/relations/metadata.rb +6 -75
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +10 -32
- data/lib/mongoid/relations/referenced/in.rb +2 -18
- data/lib/mongoid/relations/referenced/many.rb +9 -22
- data/lib/mongoid/relations/referenced/many_to_many.rb +10 -33
- data/lib/mongoid/relations/referenced/one.rb +2 -21
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +33 -0
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- data/lib/mongoid/{scoping.rb → scopable.rb} +26 -3
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +10 -1
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +176 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +15 -1
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/threaded.rb +0 -110
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -9
- data/lib/mongoid/{validations → validatable}/associated.rb +3 -1
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +3 -3
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +9 -13
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +59 -57
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +1 -0
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +6 -1
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +2 -2
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +0 -2
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +1 -1
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +13 -8
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +1 -1
- data/spec/app/models/post.rb +2 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +5 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +1 -1
- data/spec/app/models/video.rb +0 -4
- data/spec/app/models/wiki_page.rb +1 -4
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
- data/spec/mongoid/attributes/readonly_spec.rb +16 -16
- data/spec/mongoid/attributes_spec.rb +188 -434
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +117 -148
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
- data/spec/mongoid/contextual/atomic_spec.rb +60 -56
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +94 -94
- data/spec/mongoid/contextual/mongo_spec.rb +225 -139
- data/spec/mongoid/contextual/text_search_spec.rb +207 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +31 -31
- data/spec/mongoid/criteria_spec.rb +530 -2207
- data/spec/mongoid/document_spec.rb +166 -120
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +7 -7
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +9 -9
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +15 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +23 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +168 -209
- data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +62 -27
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +105 -105
- data/spec/mongoid/log_subscriber_spec.rb +74 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +205 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +432 -0
- data/spec/mongoid/persistable/settable_spec.rb +139 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +19 -14
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +36 -16
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +6 -6
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +2 -2
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +6 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +9 -9
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +6 -6
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +22 -33
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +11 -24
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +7 -7
- data/spec/mongoid/relations/cascading/destroy_spec.rb +2 -2
- data/spec/mongoid/relations/cascading/nullify_spec.rb +2 -2
- data/spec/mongoid/relations/cascading/restrict_spec.rb +3 -3
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +143 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +55 -56
- data/spec/mongoid/relations/embedded/many_spec.rb +357 -367
- data/spec/mongoid/relations/embedded/one_spec.rb +98 -139
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +147 -241
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +379 -522
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +345 -417
- data/spec/mongoid/relations/referenced/one_spec.rb +148 -263
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +116 -116
- data/spec/mongoid/relations/touchable_spec.rb +296 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +74 -126
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +111 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +92 -0
- data/spec/mongoid/sessions_spec.rb +288 -177
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/state_spec.rb +10 -10
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/updated/short_spec.rb +10 -10
- data/spec/mongoid/timestamps/updated_spec.rb +8 -12
- data/spec/mongoid/timestamps_spec.rb +7 -11
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +18 -18
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +7 -7
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +31 -38
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +126 -183
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +72 -87
- data/spec/spec_helper.rb +19 -17
- metadata +261 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/criterion/findable.rb +0 -179
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/draft.rb +0 -9
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/#atomic_spec.rb# +0 -365
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -11,7 +11,7 @@ module Mongoid
|
|
11
11
|
# @example Evolve the string.
|
12
12
|
# "test".__evolve_object_id__
|
13
13
|
#
|
14
|
-
# @return [ String,
|
14
|
+
# @return [ String, BSON::ObjectId ] The evolved string.
|
15
15
|
#
|
16
16
|
# @since 3.0.0
|
17
17
|
def __evolve_object_id__
|
@@ -23,7 +23,7 @@ module Mongoid
|
|
23
23
|
# @example Evolve the string.
|
24
24
|
# "test".__mongoize_object_id__
|
25
25
|
#
|
26
|
-
# @return [ String,
|
26
|
+
# @return [ String, BSON::ObjectId, nil ] The mongoized string.
|
27
27
|
#
|
28
28
|
# @since 3.0.0
|
29
29
|
def __mongoize_object_id__
|
@@ -96,18 +96,6 @@ module Mongoid
|
|
96
96
|
delete("=").sub(/\_before\_type\_cast$/, '')
|
97
97
|
end
|
98
98
|
|
99
|
-
# Convert the string to an array with the string in it.
|
100
|
-
#
|
101
|
-
# @example Convert the string to an array.
|
102
|
-
# "Testing".to_a
|
103
|
-
#
|
104
|
-
# @return [ Array ] An array with only the string in it.
|
105
|
-
#
|
106
|
-
# @since 1.0.0
|
107
|
-
def to_a
|
108
|
-
[ self ]
|
109
|
-
end
|
110
|
-
|
111
99
|
# Is this string a writer?
|
112
100
|
#
|
113
101
|
# @example Is the string a setter method?
|
@@ -129,7 +117,7 @@ module Mongoid
|
|
129
117
|
#
|
130
118
|
# @since 3.0.15
|
131
119
|
def valid_method_name?
|
132
|
-
/[@$"]/ !~
|
120
|
+
/[@$"]/ !~ self
|
133
121
|
end
|
134
122
|
|
135
123
|
# Does the string end with _before_type_cast?
|
@@ -165,11 +153,11 @@ module Mongoid
|
|
165
153
|
# @example Convert to the object id.
|
166
154
|
# string.convert_to_object_id
|
167
155
|
#
|
168
|
-
# @return [ String,
|
156
|
+
# @return [ String, BSON::ObjectId ] The string or the id.
|
169
157
|
#
|
170
158
|
# @since 3.0.0
|
171
159
|
def convert_to_object_id
|
172
|
-
|
160
|
+
BSON::ObjectId.legal?(self) ? BSON::ObjectId.from_string(self) : self
|
173
161
|
end
|
174
162
|
|
175
163
|
module ClassMethods
|
@@ -68,8 +68,8 @@ module Mongoid
|
|
68
68
|
return nil if object.blank?
|
69
69
|
begin
|
70
70
|
time = object.__mongoize_time__
|
71
|
-
if
|
72
|
-
::Time.at(time.to_i,
|
71
|
+
if object.respond_to?(:sec_fraction)
|
72
|
+
::Time.at(time.to_i, object.sec_fraction * 10**6).utc
|
73
73
|
elsif time.respond_to?(:subsec)
|
74
74
|
::Time.at(time.to_i, time.subsec * 10**6).utc
|
75
75
|
else
|
data/lib/mongoid/factory.rb
CHANGED
@@ -15,12 +15,12 @@ module Mongoid
|
|
15
15
|
# @param [ Hash ] options The mass assignment scoping options.
|
16
16
|
#
|
17
17
|
# @return [ Document ] The instantiated document.
|
18
|
-
def build(klass, attributes = nil
|
18
|
+
def build(klass, attributes = nil)
|
19
19
|
type = (attributes || {})["_type"]
|
20
20
|
if type && klass._types.include?(type)
|
21
|
-
type.constantize.new(attributes
|
21
|
+
type.constantize.new(attributes)
|
22
22
|
else
|
23
|
-
klass.new(attributes
|
23
|
+
klass.new(attributes)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
data/lib/mongoid/fields.rb
CHANGED
@@ -25,15 +25,13 @@ module Mongoid
|
|
25
25
|
|
26
26
|
field(
|
27
27
|
:_id,
|
28
|
-
default: ->{
|
28
|
+
default: ->{ BSON::ObjectId.new },
|
29
29
|
pre_processed: true,
|
30
|
-
type:
|
30
|
+
type: BSON::ObjectId
|
31
31
|
)
|
32
32
|
|
33
33
|
alias :id :_id
|
34
34
|
alias :id= :_id=
|
35
|
-
|
36
|
-
attr_protected(:id, :_id, :_type) if Mongoid.protect_sensitive_fields?
|
37
35
|
end
|
38
36
|
|
39
37
|
# Apply all default values to the document which are not procs.
|
@@ -264,13 +262,13 @@ module Mongoid
|
|
264
262
|
add_field(name, fields[name].options.merge(type: type))
|
265
263
|
end
|
266
264
|
|
267
|
-
# Convenience method for determining if we are using +
|
265
|
+
# Convenience method for determining if we are using +BSON::ObjectIds+ as
|
268
266
|
# our id.
|
269
267
|
#
|
270
268
|
# @example Does this class use object ids?
|
271
269
|
# person.using_object_ids?
|
272
270
|
#
|
273
|
-
# @return [ true, false ] If the class uses
|
271
|
+
# @return [ true, false ] If the class uses BSON::ObjectIds for the id.
|
274
272
|
#
|
275
273
|
# @since 1.0.0
|
276
274
|
def using_object_ids?
|
@@ -434,10 +432,11 @@ module Mongoid
|
|
434
432
|
def create_field_setter(name, meth, field)
|
435
433
|
generated_methods.module_eval do
|
436
434
|
re_define_method("#{meth}=") do |value|
|
437
|
-
write_attribute(name, value)
|
435
|
+
val = write_attribute(name, value)
|
438
436
|
if field.foreign_key?
|
439
437
|
remove_ivar(field.metadata.name)
|
440
438
|
end
|
439
|
+
val
|
441
440
|
end
|
442
441
|
end
|
443
442
|
end
|
@@ -472,8 +471,9 @@ module Mongoid
|
|
472
471
|
def create_translations_getter(name, meth)
|
473
472
|
generated_methods.module_eval do
|
474
473
|
re_define_method("#{meth}_translations") do
|
475
|
-
attributes[name] ||= {}
|
474
|
+
(attributes[name] ||= {}).with_indifferent_access
|
476
475
|
end
|
476
|
+
alias_method :"#{meth}_t", :"#{meth}_translations"
|
477
477
|
end
|
478
478
|
end
|
479
479
|
|
@@ -498,6 +498,7 @@ module Mongoid
|
|
498
498
|
end
|
499
499
|
attributes[name] = value
|
500
500
|
end
|
501
|
+
alias_method :"#{meth}_t=", :"#{meth}_translations="
|
501
502
|
end
|
502
503
|
end
|
503
504
|
|
@@ -99,12 +99,12 @@ module Mongoid
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
# Is the field a
|
102
|
+
# Is the field a BSON::ObjectId?
|
103
103
|
#
|
104
|
-
# @example Is the field a
|
104
|
+
# @example Is the field a BSON::ObjectId?
|
105
105
|
# field.object_id_field?
|
106
106
|
#
|
107
|
-
# @return [ true, false ] If the field is a
|
107
|
+
# @return [ true, false ] If the field is a BSON::ObjectId.
|
108
108
|
#
|
109
109
|
# @since 2.2.0
|
110
110
|
def object_id_field?
|
@@ -131,16 +131,16 @@ module Mongoid
|
|
131
131
|
@metadata ||= options[:metadata]
|
132
132
|
end
|
133
133
|
|
134
|
-
# Is the field a
|
134
|
+
# Is the field a BSON::ObjectId?
|
135
135
|
#
|
136
|
-
# @example Is the field a
|
136
|
+
# @example Is the field a BSON::ObjectId?
|
137
137
|
# field.object_id_field?
|
138
138
|
#
|
139
|
-
# @return [ true, false ] If the field is a
|
139
|
+
# @return [ true, false ] If the field is a BSON::ObjectId.
|
140
140
|
#
|
141
141
|
# @since 2.2.0
|
142
142
|
def object_id_field?
|
143
|
-
@object_id_field ||= (type ==
|
143
|
+
@object_id_field ||= (type == BSON::ObjectId)
|
144
144
|
end
|
145
145
|
|
146
146
|
# Does the field pre-process its default value?
|
@@ -168,18 +168,6 @@ module Mongoid
|
|
168
168
|
@type ||= options[:type] || Object
|
169
169
|
end
|
170
170
|
|
171
|
-
# Is this field included in versioned attributes?
|
172
|
-
#
|
173
|
-
# @example Is the field versioned?
|
174
|
-
# field.versioned?
|
175
|
-
#
|
176
|
-
# @return [ true, false ] If the field is included in versioning.
|
177
|
-
#
|
178
|
-
# @since 2.1.0
|
179
|
-
def versioned?
|
180
|
-
@versioned ||= (options[:versioned].nil? ? true : options[:versioned])
|
181
|
-
end
|
182
|
-
|
183
171
|
private
|
184
172
|
|
185
173
|
# Get the name of the default method for this field.
|
@@ -17,7 +17,7 @@ module Mongoid
|
|
17
17
|
:pre_processed,
|
18
18
|
:subtype,
|
19
19
|
:type,
|
20
|
-
:
|
20
|
+
:overwrite
|
21
21
|
]
|
22
22
|
|
23
23
|
# Validate the field definition.
|
@@ -31,7 +31,7 @@ module Mongoid
|
|
31
31
|
#
|
32
32
|
# @since 3.0.0
|
33
33
|
def validate(klass, name, options)
|
34
|
-
validate_name(klass, name)
|
34
|
+
validate_name(klass, name, options)
|
35
35
|
validate_options(klass, name, options)
|
36
36
|
end
|
37
37
|
|
@@ -50,10 +50,18 @@ module Mongoid
|
|
50
50
|
# @raise [ Errors::InvalidField ] If the name is not allowed.
|
51
51
|
#
|
52
52
|
# @since 3.0.0
|
53
|
-
def validate_name(klass, name)
|
53
|
+
def validate_name(klass, name, options)
|
54
54
|
if Mongoid.destructive_fields.include?(name)
|
55
55
|
raise Errors::InvalidField.new(klass, name)
|
56
56
|
end
|
57
|
+
|
58
|
+
if !options[:overwrite] && klass.fields.keys.include?(name.to_s)
|
59
|
+
if Mongoid.duplicate_fields_exception
|
60
|
+
raise Errors::InvalidField.new(klass, name)
|
61
|
+
else
|
62
|
+
Mongoid.logger.warn("Overwriting existing field #{name} in class #{klass.name}.") if Mongoid.logger
|
63
|
+
end
|
64
|
+
end
|
57
65
|
end
|
58
66
|
|
59
67
|
# Validate that the field options are allowed.
|
@@ -3,7 +3,9 @@ module Mongoid
|
|
3
3
|
|
4
4
|
# This module defines the finder methods that hang off the document at the
|
5
5
|
# class level.
|
6
|
-
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Findable
|
7
9
|
extend Origin::Forwardable
|
8
10
|
|
9
11
|
select_with :with_default_scope
|
@@ -31,6 +33,7 @@ module Mongoid
|
|
31
33
|
:min,
|
32
34
|
:pluck,
|
33
35
|
:sum,
|
36
|
+
:text_search,
|
34
37
|
:update,
|
35
38
|
:update_all, to: :with_default_scope
|
36
39
|
|
@@ -76,7 +79,7 @@ module Mongoid
|
|
76
79
|
# on the conditions provided and the first parameter.
|
77
80
|
#
|
78
81
|
# @example Find a single document by an id.
|
79
|
-
# Person.find(
|
82
|
+
# Person.find(BSON::ObjectId)
|
80
83
|
#
|
81
84
|
# @param [ Array ] args An assortment of finder options.
|
82
85
|
#
|
@@ -116,6 +119,7 @@ module Mongoid
|
|
116
119
|
def first
|
117
120
|
with_default_scope.first
|
118
121
|
end
|
122
|
+
alias :one :first
|
119
123
|
|
120
124
|
# Find the last +Document+ given the conditions.
|
121
125
|
#
|
@@ -1,13 +1,19 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require "mongoid/
|
2
|
+
require "mongoid/indexable/specification"
|
3
|
+
require "mongoid/indexable/validators/options"
|
4
|
+
require "ostruct"
|
3
5
|
|
4
6
|
module Mongoid
|
5
|
-
|
7
|
+
|
8
|
+
# Encapsulates behaviour around defining indexes.
|
9
|
+
#
|
10
|
+
# @since 4.0.0
|
11
|
+
module Indexable
|
6
12
|
extend ActiveSupport::Concern
|
7
13
|
|
8
14
|
included do
|
9
|
-
cattr_accessor :
|
10
|
-
self.
|
15
|
+
cattr_accessor :index_specifications
|
16
|
+
self.index_specifications = []
|
11
17
|
end
|
12
18
|
|
13
19
|
module ClassMethods
|
@@ -21,13 +27,14 @@ module Mongoid
|
|
21
27
|
#
|
22
28
|
# @since 1.0.0
|
23
29
|
def create_indexes
|
24
|
-
return unless
|
25
|
-
|
30
|
+
return unless index_specifications
|
31
|
+
index_specifications.each do |spec|
|
32
|
+
key, options = spec.key, spec.options
|
26
33
|
if database = options[:database]
|
27
|
-
with(
|
28
|
-
collection.indexes.create(
|
34
|
+
with(read: :primary, database: database).
|
35
|
+
collection.indexes.create(key, options.except(:database))
|
29
36
|
else
|
30
|
-
with(
|
37
|
+
with(read: :primary).collection.indexes.create(key, options)
|
31
38
|
end
|
32
39
|
end and true
|
33
40
|
end
|
@@ -43,7 +50,7 @@ module Mongoid
|
|
43
50
|
# @since 3.0.0
|
44
51
|
def remove_indexes
|
45
52
|
indexed_database_names.each do |database|
|
46
|
-
collection = with(
|
53
|
+
collection = with(read: :primary, database: database).collection
|
47
54
|
collection.indexes.each do |spec|
|
48
55
|
unless spec["name"] == "_id_"
|
49
56
|
collection.indexes.drop(spec["key"])
|
@@ -62,20 +69,18 @@ module Mongoid
|
|
62
69
|
#
|
63
70
|
# @since 1.0.0
|
64
71
|
def add_indexes
|
65
|
-
if hereditary? && !
|
66
|
-
index({ _type: 1 },
|
72
|
+
if hereditary? && !index_keys.include?(_type: 1)
|
73
|
+
index({ _type: 1 }, unique: false, background: true)
|
67
74
|
end
|
68
75
|
true
|
69
76
|
end
|
70
77
|
|
71
|
-
# Adds an index
|
72
|
-
# :unique => false. It will default to the latter.
|
78
|
+
# Adds an index definition for the provided single or compound keys.
|
73
79
|
#
|
74
80
|
# @example Create a basic index.
|
75
81
|
# class Person
|
76
82
|
# include Mongoid::Document
|
77
83
|
# field :name, type: String
|
78
|
-
|
79
84
|
# index({ name: 1 }, { background: true })
|
80
85
|
# end
|
81
86
|
#
|
@@ -86,53 +91,29 @@ module Mongoid
|
|
86
91
|
#
|
87
92
|
# @since 1.0.0
|
88
93
|
def index(spec, options = nil)
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
private
|
94
|
-
|
95
|
-
# Normalize the index options, if any are provided.
|
96
|
-
#
|
97
|
-
# @api private
|
98
|
-
#
|
99
|
-
# @example Normalize the index options.
|
100
|
-
# Model.normalize_index_options(drop_dups: true)
|
101
|
-
#
|
102
|
-
# @param [ Hash ] options The index options.
|
103
|
-
#
|
104
|
-
# @return [ Hash ] The normalized options.
|
105
|
-
#
|
106
|
-
# @since 3.0.0
|
107
|
-
def normalize_index_options(options)
|
108
|
-
opts = options || {}
|
109
|
-
opts[:dropDups] = opts.delete(:drop_dups) if opts.has_key?(:drop_dups)
|
110
|
-
opts[:bucketSize] = opts.delete(:bucket_size) if opts.has_key?(:bucket_size)
|
111
|
-
if opts.has_key?(:expire_after_seconds)
|
112
|
-
opts[:expireAfterSeconds] = opts.delete(:expire_after_seconds)
|
94
|
+
specification = Specification.new(self, spec, options)
|
95
|
+
if !index_specifications.include?(specification)
|
96
|
+
index_specifications.push(specification)
|
113
97
|
end
|
114
|
-
opts
|
115
98
|
end
|
116
99
|
|
117
|
-
#
|
118
|
-
#
|
119
|
-
# @api private
|
100
|
+
# Get an index specification for the provided key.
|
120
101
|
#
|
121
|
-
# @example
|
122
|
-
# Model.
|
102
|
+
# @example Get the index specification.
|
103
|
+
# Model.index_specification(name: 1)
|
123
104
|
#
|
124
|
-
# @param [ Hash ]
|
105
|
+
# @param [ Hash ] key The index key/direction pair.
|
125
106
|
#
|
126
|
-
# @return [
|
107
|
+
# @return [ Specification ] The found specification.
|
127
108
|
#
|
128
|
-
# @since
|
129
|
-
def
|
130
|
-
|
131
|
-
|
132
|
-
normalized
|
133
|
-
end
|
109
|
+
# @since 4.0.0
|
110
|
+
def index_specification(index_hash)
|
111
|
+
index = OpenStruct.new(fields: index_hash.keys, key: index_hash)
|
112
|
+
index_specifications.detect { |spec| spec == index }
|
134
113
|
end
|
135
114
|
|
115
|
+
private
|
116
|
+
|
136
117
|
# Get the names of all databases for this model that have index
|
137
118
|
# definitions.
|
138
119
|
#
|
@@ -145,10 +126,24 @@ module Mongoid
|
|
145
126
|
#
|
146
127
|
# @since 3.1.0
|
147
128
|
def indexed_database_names
|
148
|
-
|
149
|
-
options[:database] || database_name
|
129
|
+
index_specifications.map do |spec|
|
130
|
+
spec.options[:database] || database_name
|
150
131
|
end.uniq
|
151
132
|
end
|
133
|
+
|
134
|
+
# Gets a list of index specification keys.
|
135
|
+
#
|
136
|
+
# @api private
|
137
|
+
#
|
138
|
+
# @example Get the specification key list.
|
139
|
+
# Model.index_keys
|
140
|
+
#
|
141
|
+
# @return [ Array<Hash> ] The specification keys.
|
142
|
+
#
|
143
|
+
# @since 4.0.0
|
144
|
+
def index_keys
|
145
|
+
index_specifications.map{ |spec| spec.key }
|
146
|
+
end
|
152
147
|
end
|
153
148
|
end
|
154
149
|
end
|