mongoid 7.1.11 → 7.2.0
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/README.md +10 -3
- data/lib/config/locales/en.yml +37 -14
- data/lib/mongoid/association/depending.rb +1 -6
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
- data/lib/mongoid/association/many.rb +3 -3
- data/lib/mongoid/association/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +37 -2
- data/lib/mongoid/association/referenced/has_many/proxy.rb +9 -2
- data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
- data/lib/mongoid/atomic/modifiers.rb +1 -1
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/attributes.rb +1 -8
- data/lib/mongoid/clients/factory.rb +17 -0
- data/lib/mongoid/composable.rb +1 -0
- data/lib/mongoid/config/environment.rb +1 -9
- data/lib/mongoid/config.rb +3 -0
- data/lib/mongoid/contextual/atomic.rb +2 -7
- data/lib/mongoid/contextual/mongo.rb +23 -4
- data/lib/mongoid/contextual/none.rb +0 -3
- data/lib/mongoid/copyable.rb +7 -3
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +23 -8
- data/lib/mongoid/criteria/queryable/selector.rb +7 -3
- data/lib/mongoid/criteria/queryable/storable.rb +7 -7
- data/lib/mongoid/criteria.rb +58 -8
- data/lib/mongoid/document.rb +19 -9
- 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/mongoid_error.rb +1 -1
- data/lib/mongoid/errors.rb +7 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +27 -10
- data/lib/mongoid/fields/validators/macro.rb +22 -9
- data/lib/mongoid/fields.rb +3 -0
- data/lib/mongoid/findable.rb +50 -14
- data/lib/mongoid/indexable.rb +2 -2
- data/lib/mongoid/interceptable.rb +2 -4
- data/lib/mongoid/matchable.rb +1 -149
- 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/matcher.rb +127 -0
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +1 -3
- data/lib/mongoid/query_cache.rb +64 -62
- data/lib/mongoid/reloadable.rb +2 -7
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/stringified_symbol.rb +53 -0
- data/lib/mongoid/tasks/database.rb +1 -1
- data/lib/mongoid/traversable.rb +111 -4
- data/lib/mongoid/validatable/associated.rb +1 -1
- data/lib/mongoid/validatable/presence.rb +3 -3
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +23 -1
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -8
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
- data/spec/README.md +19 -4
- data/spec/integration/app_spec.rb +84 -174
- data/spec/integration/associations/embedded_spec.rb +94 -0
- data/spec/integration/associations/has_many_spec.rb +67 -14
- data/spec/integration/associations/has_one_spec.rb +67 -14
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
- data/spec/integration/atomic/modifiers_spec.rb +117 -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 +0 -21
- 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/stringified_symbol_field_spec.rb +190 -0
- data/spec/lite_spec_helper.rb +4 -3
- data/spec/mongoid/association/depending_spec.rb +78 -26
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +0 -50
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +37 -17
- data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +0 -17
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
- data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
- data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
- data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -41
- data/spec/mongoid/atomic_spec.rb +23 -0
- data/spec/mongoid/attributes/nested_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +0 -241
- data/spec/mongoid/clients/factory_spec.rb +35 -9
- data/spec/mongoid/clients/options_spec.rb +3 -11
- data/spec/mongoid/clients/sessions_spec.rb +1 -6
- data/spec/mongoid/config/environment_spec.rb +8 -86
- data/spec/mongoid/config_spec.rb +28 -0
- data/spec/mongoid/contextual/atomic_spec.rb +29 -81
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -1
- data/spec/mongoid/contextual/mongo_spec.rb +70 -16
- data/spec/mongoid/copyable_spec.rb +197 -18
- data/spec/mongoid/copyable_spec_models.rb +28 -0
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -36
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
- data/spec/mongoid/criteria_spec.rb +204 -43
- data/spec/mongoid/document_query_spec.rb +0 -51
- data/spec/mongoid/document_spec.rb +90 -36
- data/spec/mongoid/equality_spec.rb +0 -1
- data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -20
- data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
- data/spec/mongoid/factory_spec.rb +261 -28
- data/spec/mongoid/fields_spec.rb +48 -2
- data/spec/mongoid/findable_spec.rb +32 -0
- data/spec/mongoid/indexable_spec.rb +28 -2
- data/spec/mongoid/inspectable_spec.rb +29 -2
- data/spec/mongoid/interceptable_spec.rb +2 -2
- 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/savable_spec.rb +174 -16
- data/spec/mongoid/persistable/settable_spec.rb +0 -30
- data/spec/mongoid/persistable/updatable_spec.rb +0 -2
- data/spec/mongoid/persistable_spec.rb +2 -2
- data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
- data/spec/mongoid/query_cache_spec.rb +442 -41
- data/spec/mongoid/reloadable_spec.rb +72 -0
- data/spec/mongoid/serializable_spec.rb +21 -3
- data/spec/mongoid/traversable_spec.rb +1100 -0
- data/spec/shared/lib/mrss/constraints.rb +10 -92
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -16
- data/spec/shared/lib/mrss/spec_organizer.rb +2 -32
- data/spec/spec_helper.rb +3 -3
- data/spec/support/constraints.rb +24 -0
- data/spec/support/helpers.rb +1 -1
- data/spec/{app → support}/models/actor.rb +1 -1
- data/spec/{app → support}/models/address.rb +0 -4
- data/spec/support/models/armrest.rb +10 -0
- data/spec/{app → support}/models/browser.rb +1 -1
- data/spec/{app → support}/models/canvas.rb +1 -1
- data/spec/{app → support}/models/coding.rb +1 -1
- data/spec/support/models/crate.rb +13 -0
- data/spec/support/models/deed.rb +8 -0
- data/spec/{app → support}/models/dictionary.rb +0 -6
- data/spec/{app → support}/models/driver.rb +1 -1
- data/spec/support/models/guitar.rb +5 -0
- data/spec/support/models/idnodef.rb +8 -0
- data/spec/support/models/instrument.rb +9 -0
- data/spec/{app → support}/models/item.rb +1 -1
- data/spec/{app → support}/models/mop.rb +0 -10
- data/spec/support/models/order.rb +11 -0
- data/spec/{app → support}/models/owner.rb +2 -0
- data/spec/{app → support}/models/palette.rb +1 -1
- data/spec/{app → support}/models/person.rb +1 -10
- data/spec/support/models/piano.rb +5 -0
- data/spec/support/models/profile.rb +18 -0
- data/spec/support/models/publication.rb +5 -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/shape.rb +2 -2
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tool.rb +2 -2
- data/spec/support/models/toy.rb +10 -0
- data/spec/{app → support}/models/truck.rb +2 -0
- data/spec/{app → support}/models/vehicle.rb +7 -2
- data/spec/{app → support}/models/writer.rb +2 -2
- data/spec/support/spec_config.rb +1 -9
- data.tar.gz.sig +0 -0
- metadata +839 -820
- metadata.gz.sig +2 -2
- data/lib/mongoid/errors/empty_config_file.rb +0 -26
- data/lib/mongoid/errors/invalid_config_file.rb +0 -26
- 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/app/models/customer.rb +0 -11
- data/spec/app/models/customer_address.rb +0 -12
- data/spec/app/models/publication.rb +0 -5
- data/spec/integration/callbacks_models.rb +0 -49
- data/spec/integration/callbacks_spec.rb +0 -216
- data/spec/integration/contextual/empty_spec.rb +0 -142
- data/spec/mongoid/errors/invalid_config_file_spec.rb +0 -32
- 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
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/cluster_config.rb +0 -226
- data/spec/shared/lib/mrss/docker_runner.rb +0 -271
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -200
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -323
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/distro.sh +0 -73
- data/spec/shared/shlib/server.sh +0 -367
- data/spec/shared/shlib/set_env.sh +0 -131
- /data/spec/{app → support}/models/account.rb +0 -0
- /data/spec/{app → support}/models/acolyte.rb +0 -0
- /data/spec/{app → support}/models/actress.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/{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/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/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/{app → support}/models/coding/pull_request.rb +0 -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/{app → support}/models/definition.rb +0 -0
- /data/spec/{app → support}/models/delegating_patient.rb +0 -0
- /data/spec/{app → support}/models/description.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/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/{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/{app → support}/models/image.rb +0 -0
- /data/spec/{app → support}/models/implant.rb +0 -0
- /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/{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/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/parent.rb +0 -0
- /data/spec/{app → support}/models/parent_doc.rb +0 -0
- /data/spec/{app → support}/models/passport.rb +0 -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/pet.rb +0 -0
- /data/spec/{app → support}/models/pet_owner.rb +0 -0
- /data/spec/{app → support}/models/phone.rb +0 -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/{app → support}/models/pronunciation.rb +0 -0
- /data/spec/{app → support}/models/pub.rb +0 -0
- /data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
- /data/spec/{app → support}/models/publication/review.rb +0 -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 → 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/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/{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/topping.rb +0 -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/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/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/lib/mongoid/query_cache.rb
CHANGED
|
@@ -17,8 +17,13 @@ module Mongoid
|
|
|
17
17
|
# @return [ Hash ] The hash of cached queries.
|
|
18
18
|
#
|
|
19
19
|
# @since 4.0.0
|
|
20
|
+
# @api private
|
|
20
21
|
def cache_table
|
|
21
|
-
|
|
22
|
+
if defined?(Mongo::QueryCache)
|
|
23
|
+
raise NotImplementedError, "Mongoid does not expose driver's query cache table"
|
|
24
|
+
else
|
|
25
|
+
Thread.current["[mongoid]:query_cache"] ||= {}
|
|
26
|
+
end
|
|
22
27
|
end
|
|
23
28
|
|
|
24
29
|
# Clear the query cache.
|
|
@@ -30,7 +35,11 @@ module Mongoid
|
|
|
30
35
|
#
|
|
31
36
|
# @since 4.0.0
|
|
32
37
|
def clear_cache
|
|
33
|
-
|
|
38
|
+
if defined?(Mongo::QueryCache)
|
|
39
|
+
Mongo::QueryCache.clear
|
|
40
|
+
else
|
|
41
|
+
Thread.current["[mongoid]:query_cache"] = nil
|
|
42
|
+
end
|
|
34
43
|
end
|
|
35
44
|
|
|
36
45
|
# Set whether the cache is enabled.
|
|
@@ -42,7 +51,11 @@ module Mongoid
|
|
|
42
51
|
#
|
|
43
52
|
# @since 4.0.0
|
|
44
53
|
def enabled=(value)
|
|
45
|
-
|
|
54
|
+
if defined?(Mongo::QueryCache)
|
|
55
|
+
Mongo::QueryCache.enabled = value
|
|
56
|
+
else
|
|
57
|
+
Thread.current["[mongoid]:query_cache:enabled"] = value
|
|
58
|
+
end
|
|
46
59
|
end
|
|
47
60
|
|
|
48
61
|
# Is the query cache enabled on the current thread?
|
|
@@ -54,7 +67,11 @@ module Mongoid
|
|
|
54
67
|
#
|
|
55
68
|
# @since 4.0.0
|
|
56
69
|
def enabled?
|
|
57
|
-
|
|
70
|
+
if defined?(Mongo::QueryCache)
|
|
71
|
+
Mongo::QueryCache.enabled?
|
|
72
|
+
else
|
|
73
|
+
!!Thread.current["[mongoid]:query_cache:enabled"]
|
|
74
|
+
end
|
|
58
75
|
end
|
|
59
76
|
|
|
60
77
|
# Execute the block while using the query cache.
|
|
@@ -65,12 +82,18 @@ module Mongoid
|
|
|
65
82
|
# @return [ Object ] The result of the block.
|
|
66
83
|
#
|
|
67
84
|
# @since 4.0.0
|
|
68
|
-
def cache
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
def cache(&block)
|
|
86
|
+
if defined?(Mongo::QueryCache)
|
|
87
|
+
Mongo::QueryCache.cache(&block)
|
|
88
|
+
else
|
|
89
|
+
enabled = QueryCache.enabled?
|
|
90
|
+
QueryCache.enabled = true
|
|
91
|
+
begin
|
|
92
|
+
yield
|
|
93
|
+
ensure
|
|
94
|
+
QueryCache.enabled = enabled
|
|
95
|
+
end
|
|
96
|
+
end
|
|
74
97
|
end
|
|
75
98
|
|
|
76
99
|
# Execute the block with the query cache disabled.
|
|
@@ -79,12 +102,18 @@ module Mongoid
|
|
|
79
102
|
# QueryCache.uncached { collection.find }
|
|
80
103
|
#
|
|
81
104
|
# @return [ Object ] The result of the block.
|
|
82
|
-
def uncached
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
105
|
+
def uncached(&block)
|
|
106
|
+
if defined?(Mongo::QueryCache)
|
|
107
|
+
Mongo::QueryCache.uncached(&block)
|
|
108
|
+
else
|
|
109
|
+
enabled = QueryCache.enabled?
|
|
110
|
+
QueryCache.enabled = false
|
|
111
|
+
begin
|
|
112
|
+
yield
|
|
113
|
+
ensure
|
|
114
|
+
QueryCache.enabled = enabled
|
|
115
|
+
end
|
|
116
|
+
end
|
|
88
117
|
end
|
|
89
118
|
end
|
|
90
119
|
|
|
@@ -127,6 +156,7 @@ module Mongoid
|
|
|
127
156
|
# the database if the same query has already been executed.
|
|
128
157
|
#
|
|
129
158
|
# @since 5.0.0
|
|
159
|
+
# @deprecated This class is only used with driver versions 2.13 and lower.
|
|
130
160
|
class CachedCursor < Mongo::Cursor
|
|
131
161
|
|
|
132
162
|
# We iterate over the cached documents if they exist already in the
|
|
@@ -164,12 +194,10 @@ module Mongoid
|
|
|
164
194
|
|
|
165
195
|
def process(result)
|
|
166
196
|
documents = super
|
|
167
|
-
|
|
168
197
|
if @cursor_id.zero? && !@after_first_batch
|
|
169
198
|
@cached_documents ||= []
|
|
170
199
|
@cached_documents.concat(documents)
|
|
171
200
|
end
|
|
172
|
-
|
|
173
201
|
@after_first_batch = true
|
|
174
202
|
documents
|
|
175
203
|
end
|
|
@@ -179,6 +207,7 @@ module Mongoid
|
|
|
179
207
|
# operations.
|
|
180
208
|
#
|
|
181
209
|
# @since 4.0.0
|
|
210
|
+
# @deprecated This module is only used with driver versions 2.13 and lower.
|
|
182
211
|
module Base
|
|
183
212
|
|
|
184
213
|
def alias_query_cache_clear(*method_names)
|
|
@@ -198,6 +227,7 @@ module Mongoid
|
|
|
198
227
|
# cached cursor or a regular cursor on iteration.
|
|
199
228
|
#
|
|
200
229
|
# @since 5.0.0
|
|
230
|
+
# @deprecated This module is only used with driver versions 2.13 and lower.
|
|
201
231
|
module View
|
|
202
232
|
extend ActiveSupport::Concern
|
|
203
233
|
|
|
@@ -228,24 +258,19 @@ module Mongoid
|
|
|
228
258
|
else
|
|
229
259
|
@cursor = nil
|
|
230
260
|
unless @cursor = cached_cursor
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
read_with_retry do
|
|
240
|
-
server = server_selector.select_server(cluster)
|
|
241
|
-
result = send_initial_query(server)
|
|
242
|
-
@cursor = get_cursor(result, server)
|
|
261
|
+
session = client.send(:get_session, @options)
|
|
262
|
+
read_with_retry(session, server_selector) do |server|
|
|
263
|
+
result = send_initial_query(server, session)
|
|
264
|
+
if result.cursor_id == 0 || result.cursor_id.nil?
|
|
265
|
+
@cursor = CachedCursor.new(view, result, server, session: session)
|
|
266
|
+
QueryCache.cache_table[cache_key] = @cursor
|
|
267
|
+
else
|
|
268
|
+
@cursor = Mongo::Cursor.new(view, result, server, session: session)
|
|
243
269
|
end
|
|
244
270
|
end
|
|
245
271
|
end
|
|
246
|
-
|
|
247
272
|
if block_given?
|
|
248
|
-
if limit
|
|
273
|
+
if limit
|
|
249
274
|
@cursor.to_a[0...limit].each do |doc|
|
|
250
275
|
yield doc
|
|
251
276
|
end
|
|
@@ -270,44 +295,19 @@ module Mongoid
|
|
|
270
295
|
cursor || QueryCache.cache_table[cache_key]
|
|
271
296
|
end
|
|
272
297
|
|
|
273
|
-
def get_cursor(result, server, session = nil)
|
|
274
|
-
if result.cursor_id == 0 || result.cursor_id.nil?
|
|
275
|
-
cursor = if session
|
|
276
|
-
CachedCursor.new(view, result, server, session: session)
|
|
277
|
-
else
|
|
278
|
-
CachedCursor.new(view, result, server)
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
QueryCache.cache_table[cache_key] = cursor
|
|
282
|
-
else
|
|
283
|
-
cursor = if session
|
|
284
|
-
Mongo::Cursor.new(view, result, server, session: session)
|
|
285
|
-
else
|
|
286
|
-
Mongo::Cursor.new(view, result, server)
|
|
287
|
-
end
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
cursor
|
|
291
|
-
end
|
|
292
|
-
|
|
293
298
|
def cache_key
|
|
294
299
|
[ collection.namespace, selector, limit, skip, sort, projection, collation ]
|
|
295
300
|
end
|
|
296
301
|
|
|
297
302
|
def system_collection?
|
|
298
|
-
collection.
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
def driver_supports_cursor_sessions?
|
|
302
|
-
# Driver versions 2.9 and newer support passing in a session to the
|
|
303
|
-
# cursor object.
|
|
304
|
-
(Mongo::VERSION.split('.').map(&:to_i) <=> [2, 9, 0]) > 0
|
|
303
|
+
collection.name.start_with?('system.')
|
|
305
304
|
end
|
|
306
305
|
end
|
|
307
306
|
|
|
308
307
|
# Adds behavior to the query cache for collections.
|
|
309
308
|
#
|
|
310
309
|
# @since 5.0.0
|
|
310
|
+
# @deprecated This module is only used with driver versions 2.13 and lower.
|
|
311
311
|
module Collection
|
|
312
312
|
extend ActiveSupport::Concern
|
|
313
313
|
|
|
@@ -326,6 +326,8 @@ module Mongoid
|
|
|
326
326
|
end
|
|
327
327
|
end
|
|
328
328
|
|
|
329
|
-
Mongo::
|
|
330
|
-
Mongo::Collection
|
|
331
|
-
|
|
329
|
+
unless defined?(Mongo::QueryCache)
|
|
330
|
+
Mongo::Collection.__send__(:include, Mongoid::QueryCache::Collection)
|
|
331
|
+
Mongo::Collection::View.__send__(:include, Mongoid::QueryCache::View)
|
|
332
|
+
Mongoid::Document.__send__(:include, Mongoid::QueryCache::Document)
|
|
333
|
+
end
|
data/lib/mongoid/reloadable.rb
CHANGED
|
@@ -21,11 +21,6 @@ module Mongoid
|
|
|
21
21
|
#
|
|
22
22
|
# @since 1.0.0
|
|
23
23
|
def reload
|
|
24
|
-
if @atomic_selector
|
|
25
|
-
# Clear atomic_selector cache for sharded clusters. MONGOID-5076
|
|
26
|
-
remove_instance_variable('@atomic_selector')
|
|
27
|
-
end
|
|
28
|
-
|
|
29
24
|
reloaded = _reload
|
|
30
25
|
if Mongoid.raise_not_found_error && reloaded.empty?
|
|
31
26
|
raise Errors::DocumentNotFound.new(self.class, _id, _id)
|
|
@@ -65,7 +60,7 @@ module Mongoid
|
|
|
65
60
|
#
|
|
66
61
|
# @since 2.3.2
|
|
67
62
|
def reload_root_document
|
|
68
|
-
{}.merge(collection.find(
|
|
63
|
+
{}.merge(collection.find(atomic_selector, session: _session).read(mode: :primary).first || {})
|
|
69
64
|
end
|
|
70
65
|
|
|
71
66
|
# Reload the embedded document.
|
|
@@ -78,7 +73,7 @@ module Mongoid
|
|
|
78
73
|
# @since 2.3.2
|
|
79
74
|
def reload_embedded_document
|
|
80
75
|
extract_embedded_attributes({}.merge(
|
|
81
|
-
collection(_root).find(
|
|
76
|
+
collection(_root).find(_root.atomic_selector).read(mode: :primary).first
|
|
82
77
|
))
|
|
83
78
|
end
|
|
84
79
|
|
data/lib/mongoid/serializable.rb
CHANGED
|
@@ -80,7 +80,7 @@ module Mongoid
|
|
|
80
80
|
|
|
81
81
|
only = Array.wrap(options[:only]).map(&:to_s)
|
|
82
82
|
except = Array.wrap(options[:except]).map(&:to_s)
|
|
83
|
-
except |= [
|
|
83
|
+
except |= [self.class.discriminator_key] unless Mongoid.include_type_for_serialization
|
|
84
84
|
|
|
85
85
|
if !only.empty?
|
|
86
86
|
names &= only
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# A class which sends values to the database as Strings but returns them to the user as Symbols.
|
|
5
|
+
module Mongoid
|
|
6
|
+
class StringifiedSymbol
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
|
|
10
|
+
# Convert the object from its mongo friendly ruby type to this type.
|
|
11
|
+
#
|
|
12
|
+
# @example Demongoize the object.
|
|
13
|
+
# Symbol.demongoize(object)
|
|
14
|
+
#
|
|
15
|
+
# @param [ Object ] object The object to demongoize.
|
|
16
|
+
#
|
|
17
|
+
# @return [ Symbol ] The object.
|
|
18
|
+
#
|
|
19
|
+
# @api private
|
|
20
|
+
def demongoize(object)
|
|
21
|
+
if object.nil?
|
|
22
|
+
object
|
|
23
|
+
else
|
|
24
|
+
object.to_s.to_sym
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Turn the object from the ruby type we deal with to a Mongo friendly
|
|
29
|
+
# type.
|
|
30
|
+
#
|
|
31
|
+
# @example Mongoize the object.
|
|
32
|
+
# Symbol.mongoize("123.11")
|
|
33
|
+
#
|
|
34
|
+
# @param [ Object ] object The object to mongoize.
|
|
35
|
+
#
|
|
36
|
+
# @return [ Symbol ] The object mongoized.
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
def mongoize(object)
|
|
40
|
+
if object.nil?
|
|
41
|
+
object
|
|
42
|
+
else
|
|
43
|
+
object.to_s
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @api private
|
|
48
|
+
def evolve(object)
|
|
49
|
+
mongoize(object)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -123,7 +123,7 @@ module Mongoid
|
|
|
123
123
|
next if model.shard_config.nil?
|
|
124
124
|
|
|
125
125
|
if model.embedded? && !model.cyclic?
|
|
126
|
-
logger.warn("MONGOID: #{model} has shard config but is
|
|
126
|
+
logger.warn("MONGOID: #{model} has shard config but is emdedded")
|
|
127
127
|
next
|
|
128
128
|
end
|
|
129
129
|
|
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
|
|
@@ -34,15 +34,15 @@ module Mongoid
|
|
|
34
34
|
document.errors.add(
|
|
35
35
|
attribute,
|
|
36
36
|
:blank_in_locale,
|
|
37
|
-
|
|
37
|
+
options.merge(location: _locale)
|
|
38
38
|
) if not_present?(_value)
|
|
39
39
|
end
|
|
40
40
|
elsif document.relations.has_key?(attribute.to_s)
|
|
41
41
|
if relation_or_fk_missing?(document, attribute, value)
|
|
42
|
-
document.errors.add(attribute, :blank,
|
|
42
|
+
document.errors.add(attribute, :blank, options)
|
|
43
43
|
end
|
|
44
44
|
else
|
|
45
|
-
document.errors.add(attribute, :blank,
|
|
45
|
+
document.errors.add(attribute, :blank, options) if not_present?(value)
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
@@ -68,7 +68,7 @@ module Mongoid
|
|
|
68
68
|
# @since 2.4.10
|
|
69
69
|
def add_error(document, attribute, value)
|
|
70
70
|
document.errors.add(
|
|
71
|
-
attribute, :taken,
|
|
71
|
+
attribute, :taken, options.except(:case_sensitive, :scope).merge(value: value)
|
|
72
72
|
)
|
|
73
73
|
end
|
|
74
74
|
|
data/lib/mongoid/version.rb
CHANGED
data/lib/mongoid.rb
CHANGED
|
@@ -6,7 +6,6 @@ require "support/ruby_version"
|
|
|
6
6
|
require "forwardable"
|
|
7
7
|
require "time"
|
|
8
8
|
require "set"
|
|
9
|
-
require "ruby2_keywords"
|
|
10
9
|
|
|
11
10
|
require "active_support"
|
|
12
11
|
require "active_support/core_ext"
|
|
@@ -112,4 +111,27 @@ module Mongoid
|
|
|
112
111
|
#
|
|
113
112
|
# @since 1.0.0
|
|
114
113
|
def_delegators Config, *(Config.public_instance_methods(false) - [ :logger=, :logger ])
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# Module used to prepend the discriminator key assignment function to change
|
|
117
|
+
# the value assigned to the discriminator key to a string.
|
|
118
|
+
#
|
|
119
|
+
# @api private
|
|
120
|
+
module GlobalDiscriminatorKeyAssignment
|
|
121
|
+
# This class is used for obtaining the method definition location for
|
|
122
|
+
# Mongoid methods.
|
|
123
|
+
class InvalidFieldHost
|
|
124
|
+
include Mongoid::Document
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def discriminator_key=(value)
|
|
128
|
+
Mongoid::Fields::Validators::Macro.validate_field_name(InvalidFieldHost, value)
|
|
129
|
+
value = value.to_s
|
|
130
|
+
super
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
class << self
|
|
135
|
+
prepend GlobalDiscriminatorKeyAssignment
|
|
136
|
+
end
|
|
115
137
|
end
|
|
@@ -15,14 +15,7 @@ module Mongoid
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def app_name
|
|
18
|
-
|
|
19
|
-
parent = begin
|
|
20
|
-
# Rails 6.1+
|
|
21
|
-
app_cls.module_parent_name
|
|
22
|
-
rescue NoMethodError
|
|
23
|
-
app_cls.parent.to_s
|
|
24
|
-
end
|
|
25
|
-
parent.underscore
|
|
18
|
+
Rails::Application.subclasses.first.parent.to_s.underscore
|
|
26
19
|
end
|
|
27
20
|
|
|
28
21
|
def create_config_file
|
|
@@ -57,7 +57,7 @@ development:
|
|
|
57
57
|
# connect: :direct
|
|
58
58
|
|
|
59
59
|
# Changes the default time in seconds the server monitors refresh their status
|
|
60
|
-
# via
|
|
60
|
+
# via ismaster commands. (default: 10)
|
|
61
61
|
# heartbeat_frequency: 10
|
|
62
62
|
|
|
63
63
|
# The time in seconds for selecting servers for a near read preference. (default: 0.015)
|
data/spec/README.md
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
# Running Mongoid Tests
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
## Quick Start
|
|
4
|
+
|
|
5
|
+
The test suite requires shared tooling that is stored in a separate repository
|
|
6
|
+
and is referenced as a submodule. After checking out the desired driver
|
|
7
|
+
branch, check out the matching submodules:
|
|
8
|
+
|
|
9
|
+
git submodule init
|
|
10
|
+
git submodule update
|
|
11
|
+
|
|
12
|
+
Spin up a MongoDB deployment against which to run the Mongoid specs.
|
|
13
|
+
Mongoid specs support a variety of MongoDB topologies, but the simplest is
|
|
14
|
+
a single MongoDB instance:
|
|
6
15
|
|
|
7
16
|
# Launch mongod in one terminal
|
|
8
17
|
mkdir /tmp/mdb
|
|
@@ -14,5 +23,11 @@ Run the test suite in a separate terminal:
|
|
|
14
23
|
|
|
15
24
|
|
|
16
25
|
## Caveats
|
|
26
|
+
|
|
17
27
|
### "Too many open files" error
|
|
18
|
-
|
|
28
|
+
|
|
29
|
+
On MacOS, you may encounter a "Too many open files" error on the MongoDB server
|
|
30
|
+
when running the tests. If this happens, stop the server, run the command
|
|
31
|
+
`ulimit -n 10000` in the same terminal session as the server, and restart
|
|
32
|
+
the server. This will increase the number of files that can be opened.
|
|
33
|
+
Then, re-run the tests.
|