mongoid 7.1.0.rc0 → 7.2.0.rc1
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.tar.gz.sig +0 -0
- data/CHANGELOG.md +6 -6
- data/LICENSE +1 -1
- data/README.md +14 -7
- data/Rakefile +21 -0
- data/lib/config/locales/en.yml +42 -6
- data/lib/mongoid.rb +26 -2
- data/lib/mongoid/association/accessors.rb +37 -2
- data/lib/mongoid/association/depending.rb +1 -6
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
- data/lib/mongoid/association/many.rb +5 -4
- data/lib/mongoid/association/proxy.rb +6 -4
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
- data/lib/mongoid/association/referenced/eager.rb +29 -9
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -15
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/atomic.rb +13 -3
- data/lib/mongoid/atomic/modifiers.rb +1 -1
- data/lib/mongoid/attributes.rb +28 -20
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/clients/factory.rb +19 -2
- data/lib/mongoid/clients/options.rb +8 -8
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/clients/storage_options.rb +5 -5
- data/lib/mongoid/composable.rb +1 -0
- data/lib/mongoid/config.rb +45 -12
- data/lib/mongoid/config/options.rb +5 -2
- data/lib/mongoid/contextual.rb +5 -4
- data/lib/mongoid/contextual/geo_near.rb +3 -2
- data/lib/mongoid/contextual/map_reduce.rb +3 -2
- data/lib/mongoid/contextual/mongo.rb +25 -5
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria.rb +80 -11
- data/lib/mongoid/criteria/modifiable.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
- data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +141 -19
- data/lib/mongoid/criteria/queryable/selector.rb +3 -3
- data/lib/mongoid/criteria/queryable/storable.rb +106 -101
- data/lib/mongoid/document.rb +15 -3
- data/lib/mongoid/errors.rb +7 -0
- data/lib/mongoid/errors/eager_load.rb +2 -0
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
- data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
- data/lib/mongoid/errors/invalid_query.rb +41 -0
- data/lib/mongoid/errors/no_client_config.rb +2 -2
- data/lib/mongoid/errors/no_default_client.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +4 -2
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/factory.rb +27 -10
- data/lib/mongoid/fields.rb +2 -1
- data/lib/mongoid/fields/standard.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +26 -10
- data/lib/mongoid/findable.rb +55 -18
- data/lib/mongoid/indexable.rb +2 -2
- data/lib/mongoid/interceptable.rb +5 -1
- data/lib/mongoid/matchable.rb +1 -149
- data/lib/mongoid/matcher.rb +127 -0
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/elem_match.rb +35 -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 +32 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +40 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +63 -0
- data/lib/mongoid/matcher/field_operator.rb +52 -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/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/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/pushable.rb +11 -2
- data/lib/mongoid/persistence_context.rb +6 -6
- data/lib/mongoid/query_cache.rb +83 -38
- data/lib/mongoid/railties/database.rake +7 -0
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/serializable.rb +11 -3
- data/lib/mongoid/shardable.rb +56 -4
- data/lib/mongoid/tasks/database.rake +10 -5
- data/lib/mongoid/tasks/database.rb +83 -0
- data/lib/mongoid/timestamps/timeless.rb +3 -1
- data/lib/mongoid/traversable.rb +111 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/spec/integration/app_spec.rb +254 -0
- data/spec/integration/associations/embedded_spec.rb +148 -0
- data/spec/integration/associations/has_many_spec.rb +69 -0
- data/spec/integration/associations/has_one_spec.rb +69 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
- data/spec/integration/atomic/modifiers_spec.rb +117 -0
- data/spec/integration/bson_regexp_raw_spec.rb +20 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/criteria/logical_spec.rb +13 -0
- data/spec/integration/discriminator_key_spec.rb +354 -0
- data/spec/integration/discriminator_value_spec.rb +207 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
- 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/elem_match.yml +363 -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/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
- data/spec/integration/matcher_operator_data/in.yml +194 -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/lte.yml +132 -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/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_spec.rb +100 -0
- data/spec/integration/matcher_spec.rb +189 -0
- data/spec/integration/server_query_spec.rb +142 -0
- data/spec/integration/shardable_spec.rb +149 -0
- data/spec/lite_spec_helper.rb +15 -4
- data/spec/mongoid/association/accessors_spec.rb +238 -63
- data/spec/mongoid/association/depending_spec.rb +78 -26
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
- data/spec/mongoid/association/embedded/embeds_many_models.rb +20 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +146 -68
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +462 -187
- data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
- data/spec/mongoid/atomic_spec.rb +23 -0
- data/spec/mongoid/attributes/nested_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +19 -7
- data/spec/mongoid/changeable_spec.rb +23 -0
- data/spec/mongoid/clients/factory_spec.rb +45 -8
- data/spec/mongoid/clients/options_spec.rb +11 -11
- data/spec/mongoid/clients/sessions_spec.rb +9 -10
- data/spec/mongoid/clients/transactions_spec.rb +20 -8
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +28 -0
- data/spec/mongoid/contextual/atomic_spec.rb +22 -11
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
- data/spec/mongoid/contextual/mongo_spec.rb +146 -69
- data/spec/mongoid/copyable_spec.rb +153 -1
- data/spec/mongoid/copyable_spec_models.rb +14 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +136 -82
- data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
- data/spec/mongoid/criteria_spec.rb +240 -41
- data/spec/mongoid/document_fields_spec.rb +29 -0
- data/spec/mongoid/document_persistence_context_spec.rb +33 -0
- data/spec/mongoid/document_spec.rb +89 -15
- data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
- data/spec/mongoid/factory_spec.rb +261 -28
- data/spec/mongoid/fields_spec.rb +72 -3
- data/spec/mongoid/findable_spec.rb +32 -0
- data/spec/mongoid/indexable_spec.rb +34 -6
- data/spec/mongoid/inspectable_spec.rb +29 -2
- data/spec/mongoid/interceptable_spec.rb +64 -2
- data/spec/mongoid/interceptable_spec_models.rb +76 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
- data/spec/mongoid/persistable/creatable_spec.rb +108 -25
- data/spec/mongoid/persistable/deletable_spec.rb +86 -0
- data/spec/mongoid/persistable/pushable_spec.rb +55 -1
- data/spec/mongoid/persistable/savable_spec.rb +174 -16
- data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
- data/spec/mongoid/query_cache_spec.rb +498 -29
- data/spec/mongoid/relations/proxy_spec.rb +1 -1
- data/spec/mongoid/reloadable_spec.rb +72 -0
- data/spec/mongoid/scopable_spec.rb +2 -1
- data/spec/mongoid/serializable_spec.rb +149 -20
- data/spec/mongoid/shardable_models.rb +61 -0
- data/spec/mongoid/shardable_spec.rb +69 -16
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +1 -1
- data/spec/mongoid/traversable_spec.rb +1100 -0
- data/spec/spec_helper.rb +4 -33
- data/spec/support/child_process_helper.rb +79 -0
- data/spec/support/cluster_config.rb +3 -3
- data/spec/support/constraints.rb +50 -10
- data/spec/support/expectations.rb +3 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/lite_constraints.rb +22 -0
- data/spec/{app → support}/models/account.rb +0 -0
- data/spec/{app → support}/models/acolyte.rb +0 -0
- data/spec/{app → support}/models/actor.rb +1 -1
- data/spec/{app → support}/models/actress.rb +0 -0
- data/spec/{app → support}/models/address.rb +0 -0
- data/spec/{app → support}/models/address_component.rb +0 -0
- data/spec/{app → support}/models/address_number.rb +0 -0
- data/spec/{app → support}/models/agency.rb +0 -0
- data/spec/{app → support}/models/agent.rb +0 -0
- data/spec/{app → support}/models/album.rb +0 -0
- data/spec/{app → support}/models/alert.rb +0 -0
- data/spec/{app → support}/models/animal.rb +0 -0
- data/spec/{app → support}/models/answer.rb +0 -0
- data/spec/{app → support}/models/appointment.rb +0 -0
- data/spec/support/models/armrest.rb +10 -0
- data/spec/{app → support}/models/array_field.rb +0 -0
- data/spec/{app → support}/models/article.rb +0 -0
- data/spec/{app → support}/models/artist.rb +0 -0
- data/spec/{app → support}/models/artwork.rb +0 -0
- data/spec/{app → support}/models/audio.rb +0 -0
- data/spec/{app → support}/models/augmentation.rb +0 -0
- data/spec/{app → support}/models/author.rb +0 -0
- data/spec/{app → support}/models/baby.rb +0 -0
- data/spec/{app → support}/models/band.rb +0 -0
- data/spec/{app → support}/models/bar.rb +0 -0
- data/spec/{app → support}/models/basic.rb +0 -0
- data/spec/{app → support}/models/bed.rb +0 -0
- data/spec/{app → support}/models/big_palette.rb +0 -0
- data/spec/{app → support}/models/birthday.rb +0 -0
- data/spec/{app → support}/models/bomb.rb +0 -0
- data/spec/{app → support}/models/book.rb +0 -0
- data/spec/{app → support}/models/breed.rb +0 -0
- data/spec/{app → support}/models/browser.rb +1 -1
- data/spec/{app → support}/models/building.rb +0 -0
- data/spec/{app → support}/models/building_address.rb +0 -0
- data/spec/{app → support}/models/bus.rb +0 -0
- data/spec/{app → support}/models/business.rb +0 -0
- data/spec/{app → support}/models/callback_test.rb +0 -0
- data/spec/{app → support}/models/canvas.rb +1 -1
- data/spec/{app → support}/models/car.rb +0 -0
- data/spec/{app → support}/models/cat.rb +0 -0
- data/spec/{app → support}/models/category.rb +0 -0
- data/spec/{app → support}/models/child.rb +0 -0
- data/spec/{app → support}/models/child_doc.rb +0 -0
- data/spec/{app → support}/models/church.rb +0 -0
- data/spec/{app → support}/models/circle.rb +0 -0
- data/spec/{app → support}/models/circuit.rb +0 -0
- data/spec/{app → support}/models/circus.rb +0 -0
- data/spec/{app → support}/models/code.rb +0 -0
- data/spec/support/models/coding.rb +4 -0
- data/spec/support/models/coding/pull_request.rb +12 -0
- data/spec/{app → support}/models/comment.rb +0 -0
- data/spec/{app → support}/models/company.rb +0 -0
- data/spec/{app → support}/models/consumption_period.rb +0 -0
- data/spec/{app → support}/models/contextable_item.rb +0 -0
- data/spec/{app → support}/models/contractor.rb +0 -0
- data/spec/{app → support}/models/cookie.rb +0 -0
- data/spec/{app → support}/models/country_code.rb +0 -0
- data/spec/{app → support}/models/courier_job.rb +0 -0
- data/spec/support/models/crate.rb +13 -0
- data/spec/support/models/deed.rb +8 -0
- data/spec/{app → support}/models/definition.rb +0 -0
- data/spec/support/models/delegating_patient.rb +16 -0
- data/spec/{app → support}/models/description.rb +0 -0
- data/spec/{app → support}/models/dictionary.rb +0 -0
- data/spec/{app → support}/models/division.rb +0 -0
- data/spec/{app → support}/models/doctor.rb +0 -0
- data/spec/{app → support}/models/dog.rb +0 -0
- data/spec/{app → support}/models/dokument.rb +0 -0
- data/spec/{app → support}/models/draft.rb +0 -0
- data/spec/{app → support}/models/dragon.rb +0 -0
- data/spec/{app → support}/models/driver.rb +1 -1
- data/spec/{app → support}/models/drug.rb +0 -0
- data/spec/{app → support}/models/dungeon.rb +0 -0
- data/spec/{app → support}/models/edit.rb +0 -0
- data/spec/{app → support}/models/email.rb +0 -0
- data/spec/{app → support}/models/employer.rb +0 -0
- data/spec/{app → support}/models/entry.rb +0 -0
- data/spec/{app → support}/models/eraser.rb +0 -0
- data/spec/{app → support}/models/even.rb +0 -0
- data/spec/{app → support}/models/event.rb +0 -0
- data/spec/{app → support}/models/exhibition.rb +0 -0
- data/spec/{app → support}/models/exhibitor.rb +0 -0
- data/spec/{app → support}/models/explosion.rb +0 -0
- data/spec/{app → support}/models/eye.rb +0 -0
- data/spec/{app → support}/models/eye_bowl.rb +0 -0
- data/spec/{app → support}/models/face.rb +0 -0
- data/spec/{app → support}/models/favorite.rb +0 -0
- data/spec/{app → support}/models/filesystem.rb +0 -0
- data/spec/{app → support}/models/fire_hydrant.rb +0 -0
- data/spec/{app → support}/models/firefox.rb +0 -0
- data/spec/{app → support}/models/fish.rb +0 -0
- data/spec/{app → support}/models/folder.rb +0 -0
- data/spec/{app → support}/models/folder_item.rb +0 -0
- data/spec/{app → support}/models/fruits.rb +0 -0
- data/spec/{app → support}/models/game.rb +0 -0
- data/spec/{app → support}/models/ghost.rb +0 -0
- data/spec/support/models/guitar.rb +5 -0
- data/spec/{app → support}/models/home.rb +0 -0
- data/spec/{app → support}/models/house.rb +0 -0
- data/spec/{app → support}/models/html_writer.rb +0 -0
- data/spec/{app → support}/models/id_key.rb +0 -0
- data/spec/support/models/idnodef.rb +8 -0
- data/spec/{app → support}/models/image.rb +0 -0
- data/spec/{app → support}/models/implant.rb +0 -0
- data/spec/support/models/instrument.rb +9 -0
- data/spec/{app → support}/models/item.rb +1 -1
- data/spec/{app → support}/models/jar.rb +0 -0
- data/spec/{app → support}/models/kaleidoscope.rb +0 -0
- data/spec/{app → support}/models/kangaroo.rb +0 -0
- data/spec/{app → support}/models/label.rb +0 -0
- data/spec/{app → support}/models/language.rb +0 -0
- data/spec/{app → support}/models/lat_lng.rb +0 -0
- data/spec/{app → support}/models/league.rb +0 -0
- data/spec/{app → support}/models/learner.rb +0 -0
- data/spec/{app → support}/models/line_item.rb +0 -0
- data/spec/{app → support}/models/location.rb +0 -0
- data/spec/{app → support}/models/login.rb +0 -0
- data/spec/{app → support}/models/manufacturer.rb +0 -0
- data/spec/{app → support}/models/meat.rb +0 -0
- data/spec/{app → support}/models/membership.rb +0 -0
- data/spec/{app → support}/models/message.rb +0 -0
- data/spec/{app → support}/models/minim.rb +0 -0
- data/spec/{app → support}/models/mixed_drink.rb +0 -0
- data/spec/support/models/mop.rb +16 -0
- data/spec/{app → support}/models/movie.rb +0 -0
- data/spec/{app → support}/models/my_hash.rb +0 -0
- data/spec/{app → support}/models/name.rb +0 -0
- data/spec/{app → support}/models/name_only.rb +0 -0
- data/spec/{app → support}/models/node.rb +0 -0
- data/spec/{app → support}/models/note.rb +0 -0
- data/spec/{app → support}/models/odd.rb +0 -0
- data/spec/{app → support}/models/ordered_post.rb +0 -0
- data/spec/{app → support}/models/ordered_preference.rb +0 -0
- data/spec/{app → support}/models/oscar.rb +0 -0
- data/spec/{app → support}/models/other_owner_object.rb +0 -0
- data/spec/{app → support}/models/override.rb +0 -0
- data/spec/{app → support}/models/ownable.rb +0 -0
- data/spec/{app → support}/models/owner.rb +2 -0
- data/spec/{app → support}/models/pack.rb +0 -0
- data/spec/{app → support}/models/page.rb +0 -0
- data/spec/{app → support}/models/page_question.rb +0 -0
- data/spec/{app → support}/models/palette.rb +1 -1
- data/spec/{app → support}/models/parent.rb +0 -0
- data/spec/{app → support}/models/parent_doc.rb +0 -0
- data/spec/{app → support}/models/passport.rb +1 -0
- data/spec/{app → support}/models/patient.rb +0 -0
- data/spec/{app → support}/models/pdf_writer.rb +0 -0
- data/spec/{app → support}/models/pencil.rb +0 -0
- data/spec/{app → support}/models/person.rb +1 -1
- data/spec/{app → support}/models/pet.rb +0 -0
- data/spec/{app → support}/models/pet_owner.rb +0 -0
- data/spec/{app → support}/models/phone.rb +1 -0
- data/spec/support/models/piano.rb +5 -0
- data/spec/{app → support}/models/pizza.rb +0 -0
- data/spec/{app → support}/models/player.rb +0 -0
- data/spec/{app → support}/models/post.rb +0 -0
- data/spec/{app → support}/models/post_genre.rb +0 -0
- data/spec/{app → support}/models/powerup.rb +0 -0
- data/spec/{app → support}/models/preference.rb +0 -0
- data/spec/{app → support}/models/princess.rb +0 -0
- data/spec/{app → support}/models/product.rb +0 -0
- data/spec/support/models/profile.rb +18 -0
- data/spec/{app → support}/models/pronunciation.rb +0 -0
- data/spec/{app → support}/models/pub.rb +0 -0
- data/spec/support/models/publication.rb +5 -0
- data/spec/support/models/publication/encyclopedia.rb +12 -0
- data/spec/support/models/publication/review.rb +14 -0
- data/spec/{app → support}/models/purchase.rb +0 -0
- data/spec/{app → support}/models/question.rb +0 -0
- data/spec/{app → support}/models/quiz.rb +0 -0
- data/spec/{app → support}/models/rating.rb +0 -0
- data/spec/{app → support}/models/record.rb +0 -0
- data/spec/{app → support}/models/registry.rb +0 -0
- data/spec/{app → support}/models/role.rb +0 -0
- data/spec/{app → support}/models/root_category.rb +0 -0
- data/spec/{app → support}/models/sandwich.rb +0 -0
- data/spec/{app → support}/models/scheduler.rb +0 -0
- data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
- data/spec/support/models/seat.rb +25 -0
- data/spec/{app → support}/models/seo.rb +0 -0
- data/spec/{app → support}/models/series.rb +0 -0
- data/spec/{app → support}/models/server.rb +0 -0
- data/spec/{app → support}/models/service.rb +0 -0
- data/spec/{app → support}/models/shape.rb +2 -2
- data/spec/{app → support}/models/shelf.rb +0 -0
- data/spec/{app → support}/models/shipment_address.rb +0 -0
- data/spec/{app → support}/models/shipping_container.rb +0 -0
- data/spec/{app → support}/models/shipping_pack.rb +0 -0
- data/spec/{app → support}/models/shop.rb +0 -0
- data/spec/{app → support}/models/short_agent.rb +0 -0
- data/spec/{app → support}/models/short_quiz.rb +0 -0
- data/spec/{app → support}/models/simple.rb +0 -0
- data/spec/{app → support}/models/slave.rb +0 -0
- data/spec/{app → support}/models/song.rb +0 -0
- data/spec/{app → support}/models/sound.rb +0 -0
- data/spec/{app → support}/models/square.rb +0 -0
- data/spec/{app → support}/models/staff.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test2.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/strategy.rb +0 -0
- data/spec/{app → support}/models/sub_item.rb +0 -0
- data/spec/{app → support}/models/subscription.rb +0 -0
- data/spec/{app → support}/models/survey.rb +0 -0
- data/spec/{app → support}/models/symptom.rb +0 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +0 -0
- data/spec/{app → support}/models/target.rb +0 -0
- data/spec/{app → support}/models/template.rb +0 -0
- data/spec/{app → support}/models/thing.rb +0 -0
- data/spec/{app → support}/models/title.rb +0 -0
- data/spec/{app → support}/models/tool.rb +2 -2
- data/spec/{app → support}/models/topping.rb +0 -0
- data/spec/support/models/toy.rb +10 -0
- data/spec/{app → support}/models/track.rb +0 -0
- data/spec/{app → support}/models/translation.rb +0 -0
- data/spec/{app → support}/models/tree.rb +0 -0
- data/spec/{app → support}/models/truck.rb +2 -0
- data/spec/{app → support}/models/updatable.rb +0 -0
- data/spec/{app → support}/models/user.rb +0 -0
- data/spec/{app → support}/models/user_account.rb +0 -0
- data/spec/{app → support}/models/validation_callback.rb +0 -0
- data/spec/{app → support}/models/vehicle.rb +7 -2
- data/spec/{app → support}/models/version.rb +0 -0
- data/spec/{app → support}/models/vertex.rb +0 -0
- data/spec/{app → support}/models/vet_visit.rb +0 -0
- data/spec/{app → support}/models/video.rb +0 -0
- data/spec/{app → support}/models/video_game.rb +0 -0
- data/spec/{app → support}/models/weapon.rb +0 -0
- data/spec/{app → support}/models/wiki_page.rb +0 -0
- data/spec/{app → support}/models/word.rb +0 -0
- data/spec/{app → support}/models/word_origin.rb +0 -0
- data/spec/{app → support}/models/writer.rb +2 -2
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +13 -5
- data/spec/support/spec_organizer.rb +130 -0
- metadata +882 -752
- metadata.gz.sig +0 -0
- data/lib/mongoid/matchable/all.rb +0 -30
- data/lib/mongoid/matchable/and.rb +0 -32
- data/lib/mongoid/matchable/default.rb +0 -121
- data/lib/mongoid/matchable/elem_match.rb +0 -36
- data/lib/mongoid/matchable/eq.rb +0 -23
- data/lib/mongoid/matchable/exists.rb +0 -25
- data/lib/mongoid/matchable/gt.rb +0 -25
- data/lib/mongoid/matchable/gte.rb +0 -25
- data/lib/mongoid/matchable/in.rb +0 -26
- data/lib/mongoid/matchable/lt.rb +0 -25
- data/lib/mongoid/matchable/lte.rb +0 -25
- data/lib/mongoid/matchable/ne.rb +0 -23
- data/lib/mongoid/matchable/nin.rb +0 -24
- data/lib/mongoid/matchable/nor.rb +0 -38
- data/lib/mongoid/matchable/or.rb +0 -35
- data/lib/mongoid/matchable/regexp.rb +0 -30
- data/lib/mongoid/matchable/size.rb +0 -23
- data/spec/mongoid/matchable/all_spec.rb +0 -34
- data/spec/mongoid/matchable/and_spec.rb +0 -190
- data/spec/mongoid/matchable/default_spec.rb +0 -140
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
- data/spec/mongoid/matchable/eq_spec.rb +0 -49
- data/spec/mongoid/matchable/exists_spec.rb +0 -60
- data/spec/mongoid/matchable/gt_spec.rb +0 -89
- data/spec/mongoid/matchable/gte_spec.rb +0 -87
- data/spec/mongoid/matchable/in_spec.rb +0 -52
- data/spec/mongoid/matchable/lt_spec.rb +0 -88
- data/spec/mongoid/matchable/lte_spec.rb +0 -88
- data/spec/mongoid/matchable/ne_spec.rb +0 -49
- data/spec/mongoid/matchable/nin_spec.rb +0 -51
- data/spec/mongoid/matchable/nor_spec.rb +0 -210
- data/spec/mongoid/matchable/or_spec.rb +0 -134
- data/spec/mongoid/matchable/regexp_spec.rb +0 -62
- data/spec/mongoid/matchable/size_spec.rb +0 -28
- data/spec/mongoid/matchable_spec.rb +0 -856
@@ -60,13 +60,20 @@ namespace :db do
|
|
60
60
|
end
|
61
61
|
|
62
62
|
unless Rake::Task.task_defined?("db:create_indexes")
|
63
|
+
desc "Create indexes specified in Mongoid models"
|
63
64
|
task :create_indexes => "mongoid:create_indexes"
|
64
65
|
end
|
65
66
|
|
66
67
|
unless Rake::Task.task_defined?("db:remove_indexes")
|
68
|
+
desc "Remove indexes specified in Mongoid models"
|
67
69
|
task :remove_indexes => "mongoid:remove_indexes"
|
68
70
|
end
|
69
71
|
|
72
|
+
unless Rake::Task.task_defined?("db:shard_collections")
|
73
|
+
desc "Shard collections with shard keys specified in Mongoid models"
|
74
|
+
task :shard_collections => "mongoid:shard_collections"
|
75
|
+
end
|
76
|
+
|
70
77
|
namespace :mongoid do
|
71
78
|
task :load_models do
|
72
79
|
::Rails.application.eager_load! if defined?(::Rails)
|
data/lib/mongoid/reloadable.rb
CHANGED
@@ -60,7 +60,7 @@ module Mongoid
|
|
60
60
|
#
|
61
61
|
# @since 2.3.2
|
62
62
|
def reload_root_document
|
63
|
-
{}.merge(collection.find(
|
63
|
+
{}.merge(collection.find(atomic_selector, session: _session).read(mode: :primary).first || {})
|
64
64
|
end
|
65
65
|
|
66
66
|
# Reload the embedded document.
|
@@ -73,7 +73,7 @@ module Mongoid
|
|
73
73
|
# @since 2.3.2
|
74
74
|
def reload_embedded_document
|
75
75
|
extract_embedded_attributes({}.merge(
|
76
|
-
collection(_root).find(
|
76
|
+
collection(_root).find(_root.atomic_selector).read(mode: :primary).first
|
77
77
|
))
|
78
78
|
end
|
79
79
|
|
data/lib/mongoid/serializable.rb
CHANGED
@@ -13,8 +13,16 @@ module Mongoid
|
|
13
13
|
# We need to redefine where the JSON configuration is getting defined,
|
14
14
|
# similar to +ActiveRecord+.
|
15
15
|
included do
|
16
|
-
|
17
|
-
|
16
|
+
|
17
|
+
class << self
|
18
|
+
# Note that this intentionally only delegates :include_root_in_json
|
19
|
+
# and not :include_root_in_json? - delegating the latter produces
|
20
|
+
# wrong behavior.
|
21
|
+
# Also note that this intentionally uses the ActiveSupport delegation
|
22
|
+
# functionality and not the Ruby standard library one.
|
23
|
+
# See https://jira.mongodb.org/browse/MONGOID-4849.
|
24
|
+
delegate :include_root_in_json, to: ::Mongoid
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
28
|
# Gets the document as a serializable hash, used by ActiveModel's JSON
|
@@ -72,7 +80,7 @@ module Mongoid
|
|
72
80
|
|
73
81
|
only = Array.wrap(options[:only]).map(&:to_s)
|
74
82
|
except = Array.wrap(options[:except]).map(&:to_s)
|
75
|
-
except |= [
|
83
|
+
except |= [self.class.discriminator_key] unless Mongoid.include_type_for_serialization
|
76
84
|
|
77
85
|
if !only.empty?
|
78
86
|
names &= only
|
data/lib/mongoid/shardable.rb
CHANGED
@@ -10,8 +10,32 @@ module Mongoid
|
|
10
10
|
extend ActiveSupport::Concern
|
11
11
|
|
12
12
|
included do
|
13
|
+
# Returns the list of shard key fields, if shard key was declared on
|
14
|
+
# this model. If no shard key was declared, returns an empty array.
|
15
|
+
#
|
16
|
+
# @return [ Array<Symbol> ] List of shard key fields.
|
17
|
+
# @api public
|
13
18
|
cattr_accessor :shard_key_fields
|
14
19
|
self.shard_key_fields = []
|
20
|
+
|
21
|
+
# Returns the shard configuration, which is a hash with the following
|
22
|
+
# (symbol) keys:
|
23
|
+
#
|
24
|
+
# - keys: A hash mapping (symbol) field names to values, defining the
|
25
|
+
# shard key. Values can be either the integer 1 for ranged sharding
|
26
|
+
# or the string "hashed" for hashed sharding.
|
27
|
+
# - options: A hash containing options for shardCollections command.
|
28
|
+
#
|
29
|
+
# If shard key was not declared via the +shard_key+ macro, +shard_config+
|
30
|
+
# attribute is nil.
|
31
|
+
#
|
32
|
+
# @example Get the shard configuration.
|
33
|
+
# Model.shard_config
|
34
|
+
# # => {key: {foo: 1, bar: 1}, options: {unique: true}}
|
35
|
+
#
|
36
|
+
# @return [ Hash | nil ] Shard configuration.
|
37
|
+
# @api public
|
38
|
+
cattr_accessor :shard_config
|
15
39
|
end
|
16
40
|
|
17
41
|
# Get the shard key fields.
|
@@ -55,14 +79,42 @@ module Mongoid
|
|
55
79
|
# field :first_name, :type => String
|
56
80
|
# field :last_name, :type => String
|
57
81
|
#
|
58
|
-
# shard_key :
|
82
|
+
# shard_key first_name: 1, last_name: 1
|
59
83
|
# end
|
60
84
|
#
|
61
85
|
# @since 2.0.0
|
62
|
-
def shard_key(*
|
63
|
-
|
64
|
-
|
86
|
+
def shard_key(*args)
|
87
|
+
unless args.first.is_a?(Hash)
|
88
|
+
# Shorthand syntax
|
89
|
+
if args.last.is_a?(Hash)
|
90
|
+
raise ArgumentError, 'Shorthand shard_key syntax does not permit options'
|
91
|
+
end
|
92
|
+
|
93
|
+
spec = Hash[args.map do |name|
|
94
|
+
[name, 1]
|
95
|
+
end]
|
96
|
+
|
97
|
+
return shard_key(spec)
|
98
|
+
end
|
99
|
+
|
100
|
+
if args.length > 2
|
101
|
+
raise ArgumentError, 'Full shard_key syntax requires 1 or 2 arguments'
|
65
102
|
end
|
103
|
+
|
104
|
+
spec, options = args
|
105
|
+
|
106
|
+
spec = Hash[spec.map do |name, value|
|
107
|
+
if value.is_a?(Symbol)
|
108
|
+
value = value.to_s
|
109
|
+
end
|
110
|
+
[database_field_name(name).to_sym, value]
|
111
|
+
end]
|
112
|
+
|
113
|
+
self.shard_key_fields = spec.keys
|
114
|
+
self.shard_config = {
|
115
|
+
key: spec.freeze,
|
116
|
+
options: (options || {}).dup.freeze,
|
117
|
+
}.freeze
|
66
118
|
end
|
67
119
|
end
|
68
120
|
end
|
@@ -5,27 +5,32 @@ namespace :db do
|
|
5
5
|
task :load_models do
|
6
6
|
end
|
7
7
|
|
8
|
-
desc "Create
|
8
|
+
desc "Create indexes specified in Mongoid models"
|
9
9
|
task :create_indexes => [:environment, :load_models] do
|
10
10
|
::Mongoid::Tasks::Database.create_indexes
|
11
11
|
end
|
12
12
|
|
13
|
-
desc "Remove indexes that exist in the database but
|
13
|
+
desc "Remove indexes that exist in the database but are not specified in Mongoid models"
|
14
14
|
task :remove_undefined_indexes => [:environment, :load_models] do
|
15
15
|
::Mongoid::Tasks::Database.remove_undefined_indexes
|
16
16
|
end
|
17
17
|
|
18
|
-
desc "Remove
|
18
|
+
desc "Remove indexes specified in Mongoid models"
|
19
19
|
task :remove_indexes => [:environment, :load_models] do
|
20
20
|
::Mongoid::Tasks::Database.remove_indexes
|
21
21
|
end
|
22
22
|
|
23
|
-
desc "
|
23
|
+
desc "Shard collections with shard keys specified in Mongoid models"
|
24
|
+
task :shard_collections => [:environment, :load_models] do
|
25
|
+
::Mongoid::Tasks::Database.shard_collections
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Drop the database of the default Mongoid client"
|
24
29
|
task :drop => :environment do
|
25
30
|
::Mongoid::Clients.default.database.drop
|
26
31
|
end
|
27
32
|
|
28
|
-
desc "Drop all
|
33
|
+
desc "Drop all non-system collections"
|
29
34
|
task :purge => :environment do
|
30
35
|
::Mongoid.purge!
|
31
36
|
end
|
@@ -108,6 +108,89 @@ module Mongoid
|
|
108
108
|
end.compact
|
109
109
|
end
|
110
110
|
|
111
|
+
# Shard collections for models that declare shard keys.
|
112
|
+
#
|
113
|
+
# Returns the model classes that have had their collections sharded,
|
114
|
+
# including model classes whose collections had already been sharded
|
115
|
+
# prior to the invocation of this method.
|
116
|
+
#
|
117
|
+
# @example Shard all collections
|
118
|
+
# Mongoid::Tasks::Database.shard_collections
|
119
|
+
#
|
120
|
+
# @return [ Array<Class> ] The sharded models
|
121
|
+
def shard_collections(models = ::Mongoid.models)
|
122
|
+
models.map do |model|
|
123
|
+
next if model.shard_config.nil?
|
124
|
+
|
125
|
+
if model.embedded? && !model.cyclic?
|
126
|
+
logger.warn("MONGOID: #{model} has shard config but is emdedded")
|
127
|
+
next
|
128
|
+
end
|
129
|
+
|
130
|
+
unless model.collection.cluster.sharded?
|
131
|
+
logger.warn("MONGOID: #{model} has shard config but is not persisted in a sharded cluster: #{model.collection.cluster.summary}")
|
132
|
+
next
|
133
|
+
end
|
134
|
+
|
135
|
+
# Database of the collection must exist in order to run collStats.
|
136
|
+
# Depending on server version, the collection itself must also
|
137
|
+
# exist.
|
138
|
+
# MongoDB does not have a command to create the database; the best
|
139
|
+
# approximation of it is to create the collection we want.
|
140
|
+
# On older servers, creating a collection that already exists is
|
141
|
+
# an error.
|
142
|
+
# Additionally, 3.6 and potentially older servers do not provide
|
143
|
+
# the error code when they are asked to collStats a non-existent
|
144
|
+
# collection (https://jira.mongodb.org/browse/SERVER-50070).
|
145
|
+
begin
|
146
|
+
stats = model.collection.database.command(collStats: model.collection.name).first
|
147
|
+
rescue Mongo::Error::OperationFailure => exc
|
148
|
+
# Code 26 is database does not exist.
|
149
|
+
# Code 8 is collection does not exist, as of 4.0.
|
150
|
+
# On 3.6 and earlier match the text of exception message.
|
151
|
+
if exc.code == 26 || exc.code == 8 ||
|
152
|
+
exc.code.nil? && exc.message =~ /not found/
|
153
|
+
then
|
154
|
+
model.collection.create
|
155
|
+
|
156
|
+
stats = model.collection.database.command(collStats: model.collection.name).first
|
157
|
+
else
|
158
|
+
raise
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
stats = model.collection.database.command(collStats: model.collection.name).first
|
163
|
+
if stats[:sharded]
|
164
|
+
logger.info("MONGOID: #{model.collection.namespace} is already sharded for #{model}")
|
165
|
+
next model
|
166
|
+
end
|
167
|
+
|
168
|
+
admin_db = model.collection.client.use(:admin).database
|
169
|
+
|
170
|
+
begin
|
171
|
+
admin_db.command(enableSharding: model.collection.database.name)
|
172
|
+
rescue Mongo::Error::OperationFailure => exc
|
173
|
+
# Server 2.6 fails if sharding is already enabled
|
174
|
+
if exc.code == 23 || exc.code.nil? && exc.message =~ /already enabled/
|
175
|
+
# Nothing
|
176
|
+
else
|
177
|
+
raise
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
begin
|
182
|
+
admin_db.command(shardCollection: model.collection.namespace, **model.shard_config)
|
183
|
+
rescue Mongo::Error::OperationFailure => e
|
184
|
+
logger.error("MONGOID: Failed to shard collection #{model.collection.namespace} for #{model}: #{e.class}: #{e}")
|
185
|
+
next
|
186
|
+
end
|
187
|
+
|
188
|
+
logger.info("MONGOID: Sharded collection #{model.collection.namespace} for #{model}")
|
189
|
+
|
190
|
+
model
|
191
|
+
end.compact
|
192
|
+
end
|
193
|
+
|
111
194
|
private
|
112
195
|
|
113
196
|
def logger
|
@@ -44,11 +44,13 @@ module Mongoid
|
|
44
44
|
end
|
45
45
|
|
46
46
|
class << self
|
47
|
+
extend Forwardable
|
47
48
|
|
48
49
|
def timeless_table
|
49
50
|
Thread.current['[mongoid]:timeless'] ||= Hash.new
|
50
51
|
end
|
51
|
-
|
52
|
+
|
53
|
+
def_delegators :timeless_table, :[]=, :[]
|
52
54
|
end
|
53
55
|
|
54
56
|
private
|
data/lib/mongoid/traversable.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
+
require "mongoid/fields/validators/macro"
|
5
|
+
|
4
6
|
module Mongoid
|
5
7
|
|
6
8
|
# Provides behavior around traversing the document graph.
|
@@ -17,6 +19,105 @@ module Mongoid
|
|
17
19
|
@__parent = p
|
18
20
|
end
|
19
21
|
|
22
|
+
# Module used for prepending to the various discriminator_*= methods
|
23
|
+
#
|
24
|
+
# @api private
|
25
|
+
module DiscriminatorAssignment
|
26
|
+
def discriminator_key=(value)
|
27
|
+
if hereditary?
|
28
|
+
raise Errors::InvalidDiscriminatorKeyTarget.new(self, self.superclass)
|
29
|
+
end
|
30
|
+
|
31
|
+
_mongoid_clear_types
|
32
|
+
|
33
|
+
if value
|
34
|
+
Mongoid::Fields::Validators::Macro.validate_field_name(self, value)
|
35
|
+
value = value.to_s
|
36
|
+
super
|
37
|
+
else
|
38
|
+
# When discriminator key is set to nil, replace the class's definition
|
39
|
+
# of the discriminator key reader (provided by class_attribute earlier)
|
40
|
+
# and re-delegate to Mongoid.
|
41
|
+
class << self
|
42
|
+
delegate :discriminator_key, to: ::Mongoid
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# This condition checks if the new discriminator key would overwrite
|
47
|
+
# an existing field.
|
48
|
+
# This condition also checks if the class has any descendants, because
|
49
|
+
# if it doesn't then it doesn't need a discriminator key.
|
50
|
+
if !fields.has_key?(self.discriminator_key) && !descendants.empty?
|
51
|
+
default_proc = lambda { self.class.discriminator_value }
|
52
|
+
field(self.discriminator_key, default: default_proc, type: String)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def discriminator_value=(value)
|
57
|
+
value ||= self.name
|
58
|
+
_mongoid_clear_types
|
59
|
+
add_discriminator_mapping(value)
|
60
|
+
@discriminator_value = value
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Module used for prepending the discriminator_value method.
|
65
|
+
#
|
66
|
+
# A separate module was needed because the subclasses of this class
|
67
|
+
# need to be manually prepended with the discriminator_value and can't
|
68
|
+
# rely on being a class_attribute because the .discriminator_value
|
69
|
+
# method is overriden by every subclass in the inherited method.
|
70
|
+
#
|
71
|
+
# @api private
|
72
|
+
module DiscriminatorRetrieval
|
73
|
+
|
74
|
+
# Get the name on the reading side if the discriminator_value is nil
|
75
|
+
def discriminator_value
|
76
|
+
@discriminator_value || self.name
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
included do
|
81
|
+
class_attribute :discriminator_key, instance_accessor: false
|
82
|
+
|
83
|
+
class << self
|
84
|
+
delegate :discriminator_key, to: ::Mongoid
|
85
|
+
prepend DiscriminatorAssignment
|
86
|
+
include DiscriminatorRetrieval
|
87
|
+
|
88
|
+
# @api private
|
89
|
+
#
|
90
|
+
# @return [ Hash<String, Class> ] The current mapping of discriminator_values to classes
|
91
|
+
attr_accessor :discriminator_mapping
|
92
|
+
end
|
93
|
+
|
94
|
+
# Add a discriminator mapping to the parent class. This mapping is used when
|
95
|
+
# receiving a document to identify its class.
|
96
|
+
#
|
97
|
+
# @param [ String ] value The discriminator_value that was just set
|
98
|
+
# @param [ Class ] The class the discriminator_value was set on
|
99
|
+
#
|
100
|
+
# @api private
|
101
|
+
def self.add_discriminator_mapping(value, klass=self)
|
102
|
+
self.discriminator_mapping ||= {}
|
103
|
+
self.discriminator_mapping[value] = klass
|
104
|
+
superclass.add_discriminator_mapping(value, klass) if hereditary?
|
105
|
+
end
|
106
|
+
|
107
|
+
# Get the discriminator mapping from the parent class. This method returns nil if there
|
108
|
+
# is no mapping for the given value.
|
109
|
+
#
|
110
|
+
# @param [ String ] value The discriminator_value to retrieve
|
111
|
+
#
|
112
|
+
# @return [ Class | nil ] klass The class corresponding to the given discriminator_value. If
|
113
|
+
# the value is not in the mapping, this method returns nil.
|
114
|
+
#
|
115
|
+
# @api private
|
116
|
+
def self.get_discriminator_mapping(value)
|
117
|
+
self.discriminator_mapping[value] if self.discriminator_mapping
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
20
121
|
# Get all child +Documents+ to this +Document+, going n levels deep if
|
21
122
|
# necessary. This is used when calling update persistence operations from
|
22
123
|
# the root document, where changes in the entire tree need to be
|
@@ -201,14 +302,20 @@ module Mongoid
|
|
201
302
|
subclass.pre_processed_defaults = pre_processed_defaults.dup
|
202
303
|
subclass.post_processed_defaults = post_processed_defaults.dup
|
203
304
|
subclass._declared_scopes = Hash.new { |hash,key| self._declared_scopes[key] }
|
305
|
+
subclass.discriminator_value = subclass.name
|
306
|
+
|
307
|
+
# We need to do this here because the discriminator_value method is
|
308
|
+
# overriden in the subclass above.
|
309
|
+
class << subclass
|
310
|
+
include DiscriminatorRetrieval
|
311
|
+
end
|
204
312
|
|
205
313
|
# We only need the _type field if inheritance is in play, but need to
|
206
314
|
# add to the root class as well for backwards compatibility.
|
207
|
-
unless fields.has_key?(
|
208
|
-
|
315
|
+
unless fields.has_key?(self.discriminator_key)
|
316
|
+
default_proc = lambda { self.class.discriminator_value }
|
317
|
+
field(self.discriminator_key, default: default_proc, type: String)
|
209
318
|
end
|
210
|
-
subclass_default = subclass.name || ->{ self.class.name }
|
211
|
-
subclass.field(:_type, default: subclass_default, type: String, overwrite: true)
|
212
319
|
end
|
213
320
|
end
|
214
321
|
end
|
@@ -150,7 +150,7 @@ module Mongoid
|
|
150
150
|
#
|
151
151
|
# @since 2.3.0
|
152
152
|
def filter(value)
|
153
|
-
!case_sensitive? && value ? /\A#{Regexp.escape(value.to_s)}
|
153
|
+
!case_sensitive? && value ? /\A#{Regexp.escape(value.to_s)}\z/i : value
|
154
154
|
end
|
155
155
|
|
156
156
|
# Scope the criteria to the scope options provided.
|
data/lib/mongoid/version.rb
CHANGED