mongoid 7.1.2 → 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.tar.gz.sig +0 -0
- data/README.md +9 -2
- data/Rakefile +45 -5
- data/lib/config/locales/en.yml +38 -2
- data/lib/mongoid.rb +23 -0
- data/lib/mongoid/association/accessors.rb +37 -2
- data/lib/mongoid/association/depending.rb +1 -6
- data/lib/mongoid/association/many.rb +3 -3
- 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/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +36 -1
- data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
- data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
- data/lib/mongoid/atomic/modifiers.rb +1 -1
- 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 +3 -0
- data/lib/mongoid/contextual/mongo.rb +23 -4
- data/lib/mongoid/copyable.rb +7 -3
- data/lib/mongoid/criteria.rb +57 -7
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- 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 +2 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
- data/lib/mongoid/criteria/queryable/selector.rb +3 -3
- data/lib/mongoid/criteria/queryable/storable.rb +3 -3
- data/lib/mongoid/document.rb +15 -3
- data/lib/mongoid/errors.rb +7 -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.rb +1 -0
- data/lib/mongoid/factory.rb +27 -10
- data/lib/mongoid/fields.rb +3 -0
- data/lib/mongoid/fields/validators/macro.rb +26 -10
- data/lib/mongoid/findable.rb +50 -14
- data/lib/mongoid/indexable.rb +2 -2
- 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/query_cache.rb +81 -37
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/stringified_symbol.rb +53 -0
- data/lib/mongoid/tasks/database.rb +38 -3
- data/lib/mongoid/traversable.rb +111 -4
- data/lib/mongoid/version.rb +1 -1
- data/spec/README.md +19 -4
- data/spec/integration/app_spec.rb +85 -23
- data/spec/integration/associations/embedded_spec.rb +94 -0
- data/spec/integration/associations/embeds_many_spec.rb +24 -0
- data/spec/integration/associations/embeds_one_spec.rb +24 -0
- data/spec/integration/associations/has_many_spec.rb +129 -0
- data/spec/integration/associations/has_one_spec.rb +129 -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/discriminator_key_spec.rb +354 -0
- data/spec/integration/discriminator_value_spec.rb +207 -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 +20 -4
- data/spec/integration/stringified_symbol_field_spec.rb +190 -0
- data/spec/lite_spec_helper.rb +4 -2
- 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 +1 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +138 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +105 -0
- 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_spec.rb +23 -0
- data/spec/mongoid/attributes/nested_spec.rb +1 -1
- data/spec/mongoid/clients/factory_spec.rb +45 -8
- data/spec/mongoid/clients/options_spec.rb +9 -9
- data/spec/mongoid/clients/sessions_spec.rb +1 -6
- data/spec/mongoid/config_spec.rb +28 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- 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/extensions/regexp_raw_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/selectable_spec.rb +84 -82
- data/spec/mongoid/criteria_spec.rb +204 -39
- data/spec/mongoid/document_spec.rb +89 -15
- data/spec/mongoid/equality_spec.rb +0 -1
- 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/extensions/stringified_symbol_spec.rb +85 -0
- 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 +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/query_cache_middleware_spec.rb +16 -3
- data/spec/mongoid/query_cache_spec.rb +496 -28
- 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/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +4 -2
- data/spec/support/constraints.rb +20 -222
- data/spec/support/helpers.rb +1 -1
- 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/{app → support}/models/coding.rb +1 -1
- 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/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/{app → support}/models/delegating_patient.rb +0 -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/support/models/order.rb +11 -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 +3 -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/{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/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 +1 -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 +1 -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 +1 -1
- metadata +857 -739
- 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/app/models/publication.rb +0 -5
- 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/support/child_process_helper.rb +0 -76
- data/spec/support/lite_constraints.rb +0 -22
|
@@ -40,9 +40,22 @@ describe Mongoid::QueryCache::Middleware do
|
|
|
40
40
|
expect(code).to eq(200)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
context 'with driver query cache' do
|
|
44
|
+
min_driver_version '2.14'
|
|
45
|
+
|
|
46
|
+
it "cleans the query cache after it responds" do
|
|
47
|
+
middleware.call({})
|
|
48
|
+
expect(Mongo::QueryCache.send(:cache_table)).to be_empty
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context 'with mongoid query cache' do
|
|
53
|
+
max_driver_version '2.13'
|
|
54
|
+
|
|
55
|
+
it "cleans the query cache after it responds" do
|
|
56
|
+
middleware.call({})
|
|
57
|
+
expect(Mongoid::QueryCache.cache_table).to be_empty
|
|
58
|
+
end
|
|
46
59
|
end
|
|
47
60
|
end
|
|
48
61
|
end
|
|
@@ -10,6 +10,224 @@ describe Mongoid::QueryCache do
|
|
|
10
10
|
Mongoid::QueryCache.cache { spec.run }
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
before(:all) do
|
|
14
|
+
# It is likely that there are other session leaks in the driver
|
|
15
|
+
# and/or Mongoid that are unrelated to the query cache. Clear the
|
|
16
|
+
# SessionRegistry at the start of these tests in order to detect leaks that
|
|
17
|
+
# occur only within the scope of these tests.
|
|
18
|
+
#
|
|
19
|
+
# Other session leaks will be detected and addressed as part of RUBY-2391.
|
|
20
|
+
SessionRegistry.instance.clear_registry
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
after do
|
|
24
|
+
SessionRegistry.instance.verify_sessions_ended!
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe '#cache' do
|
|
28
|
+
context 'with driver query cache' do
|
|
29
|
+
min_driver_version '2.14'
|
|
30
|
+
|
|
31
|
+
context 'when query cache is not enabled' do
|
|
32
|
+
before do
|
|
33
|
+
Mongoid::QueryCache.enabled = false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'turns on the query cache within the block' do
|
|
37
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
38
|
+
|
|
39
|
+
Mongoid::QueryCache.cache do
|
|
40
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context 'when query cache is enabled' do
|
|
48
|
+
before do
|
|
49
|
+
Mongoid::QueryCache.enabled = true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'keeps the query cache enabled within the block' do
|
|
53
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
54
|
+
|
|
55
|
+
Mongoid::QueryCache.cache do
|
|
56
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context 'nested inside #uncached' do
|
|
64
|
+
it 'turns on the query cache in the block' do
|
|
65
|
+
Mongoid::QueryCache.uncached do
|
|
66
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
67
|
+
|
|
68
|
+
Mongoid::QueryCache.cache do
|
|
69
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
context 'with mongoid query cache' do
|
|
79
|
+
max_driver_version '2.13'
|
|
80
|
+
|
|
81
|
+
context 'when query cache is not enabled' do
|
|
82
|
+
before do
|
|
83
|
+
Mongoid::QueryCache.enabled = false
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'turns on the query cache within the block' do
|
|
87
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
88
|
+
|
|
89
|
+
Mongoid::QueryCache.cache do
|
|
90
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context 'when query cache is enabled' do
|
|
98
|
+
before do
|
|
99
|
+
Mongoid::QueryCache.enabled = true
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'keeps the query cache enabled within the block' do
|
|
103
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
104
|
+
|
|
105
|
+
Mongoid::QueryCache.cache do
|
|
106
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context 'nested inside #uncached' do
|
|
114
|
+
it 'turns on the query cache in the block' do
|
|
115
|
+
Mongoid::QueryCache.uncached do
|
|
116
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
117
|
+
|
|
118
|
+
Mongoid::QueryCache.cache do
|
|
119
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
describe '#uncached' do
|
|
130
|
+
context 'with driver query cache' do
|
|
131
|
+
min_driver_version '2.14'
|
|
132
|
+
|
|
133
|
+
context 'when query cache is not enabled' do
|
|
134
|
+
before do
|
|
135
|
+
Mongoid::QueryCache.enabled = false
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it 'keeps the query cache turned off within the block' do
|
|
139
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
140
|
+
|
|
141
|
+
Mongoid::QueryCache.uncached do
|
|
142
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
context 'when query cache is enabled' do
|
|
150
|
+
before do
|
|
151
|
+
Mongoid::QueryCache.enabled = true
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'turns off the query cache within the block' do
|
|
155
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
156
|
+
|
|
157
|
+
Mongoid::QueryCache.uncached do
|
|
158
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context 'nested inside #cache' do
|
|
166
|
+
it 'turns on the query cache in the block' do
|
|
167
|
+
Mongoid::QueryCache.cache do
|
|
168
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
169
|
+
|
|
170
|
+
Mongoid::QueryCache.uncached do
|
|
171
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
context 'with mongoid query cache' do
|
|
181
|
+
max_driver_version '2.13'
|
|
182
|
+
|
|
183
|
+
context 'when query cache is not enabled' do
|
|
184
|
+
before do
|
|
185
|
+
Mongoid::QueryCache.enabled = false
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it 'keeps the query cache turned off within the block' do
|
|
189
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
190
|
+
|
|
191
|
+
Mongoid::QueryCache.uncached do
|
|
192
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
context 'when query cache is enabled' do
|
|
200
|
+
before do
|
|
201
|
+
Mongoid::QueryCache.enabled = true
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it 'turns off the query cache within the block' do
|
|
205
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
206
|
+
|
|
207
|
+
Mongoid::QueryCache.uncached do
|
|
208
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context 'nested inside #cache' do
|
|
216
|
+
it 'turns on the query cache in the block' do
|
|
217
|
+
Mongoid::QueryCache.cache do
|
|
218
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
219
|
+
|
|
220
|
+
Mongoid::QueryCache.uncached do
|
|
221
|
+
expect(Mongoid::QueryCache.enabled?).to be false
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
expect(Mongoid::QueryCache.enabled?).to be true
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
13
231
|
context 'when iterating over objects sharing the same base' do
|
|
14
232
|
|
|
15
233
|
let(:server) do
|
|
@@ -85,6 +303,111 @@ describe Mongoid::QueryCache do
|
|
|
85
303
|
end
|
|
86
304
|
end
|
|
87
305
|
|
|
306
|
+
context 'when driver query cache exists' do
|
|
307
|
+
min_driver_version '2.14'
|
|
308
|
+
|
|
309
|
+
before do
|
|
310
|
+
Band.all.to_a
|
|
311
|
+
Band.create!
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
it 'recognizes the driver query cache' do
|
|
315
|
+
expect(defined?(Mongo::QueryCache)).to_not be_nil
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
context 'when query cache enabled' do
|
|
319
|
+
|
|
320
|
+
it 'uses the driver query cache' do
|
|
321
|
+
expect(Mongo::QueryCache).to receive(:enabled=).and_call_original
|
|
322
|
+
Mongoid::QueryCache.enabled = true
|
|
323
|
+
|
|
324
|
+
expect(Mongoid::QueryCache.enabled?).to be(true)
|
|
325
|
+
expect(Mongo::QueryCache.enabled?).to be(true)
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
context 'when query cache disabled' do
|
|
330
|
+
|
|
331
|
+
it 'uses the driver query cache' do
|
|
332
|
+
expect(Mongo::QueryCache).to receive(:enabled=).and_call_original
|
|
333
|
+
Mongoid::QueryCache.enabled = false
|
|
334
|
+
|
|
335
|
+
expect(Mongoid::QueryCache.enabled?).to be(false)
|
|
336
|
+
expect(Mongo::QueryCache.enabled?).to be(false)
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
context 'when block is cached' do
|
|
341
|
+
|
|
342
|
+
before do
|
|
343
|
+
Mongoid::QueryCache.enabled = false
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
it 'uses the driver query cache' do
|
|
347
|
+
expect(Mongo::QueryCache).to receive(:cache).and_call_original
|
|
348
|
+
Mongoid::QueryCache.cache do
|
|
349
|
+
expect(Mongo::QueryCache).to receive(:enabled?).exactly(2).and_call_original
|
|
350
|
+
expect(Mongoid::QueryCache.enabled?).to be(true)
|
|
351
|
+
expect(Mongo::QueryCache.enabled?).to be(true)
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
context 'when block is uncached' do
|
|
357
|
+
|
|
358
|
+
before do
|
|
359
|
+
Mongoid::QueryCache.enabled = true
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
it 'uses the driver query cache' do
|
|
363
|
+
expect(Mongo::QueryCache).to receive(:uncached).and_call_original
|
|
364
|
+
Mongoid::QueryCache.uncached do
|
|
365
|
+
expect(Mongo::QueryCache).to receive(:enabled?).exactly(2).and_call_original
|
|
366
|
+
expect(Mongoid::QueryCache.enabled?).to be(false)
|
|
367
|
+
expect(Mongo::QueryCache.enabled?).to be(false)
|
|
368
|
+
end
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
context 'when clear_cache is used' do
|
|
373
|
+
|
|
374
|
+
before do
|
|
375
|
+
Band.all.to_a
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
it 'requires Mongoid to query again' do
|
|
379
|
+
expect_no_queries do
|
|
380
|
+
Band.all.to_a
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
Mongoid::QueryCache.clear_cache
|
|
384
|
+
|
|
385
|
+
expect_query(1) do
|
|
386
|
+
Band.all.to_a
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
context 'when query cache used and cleared' do
|
|
392
|
+
it 'uses the driver query cache' do
|
|
393
|
+
expect(Mongo::QueryCache).to receive(:set).once.and_call_original
|
|
394
|
+
|
|
395
|
+
expect_query(1) do
|
|
396
|
+
Band.all.to_a
|
|
397
|
+
Band.all.to_a
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
context 'when drivers query cache does not exist' do
|
|
404
|
+
max_driver_version '2.13'
|
|
405
|
+
|
|
406
|
+
it 'does not recognize the driver query cache' do
|
|
407
|
+
expect(defined?(Mongo::QueryCache)).to be_nil
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
|
|
88
411
|
context "when querying for a single document" do
|
|
89
412
|
|
|
90
413
|
[ :first, :one, :last ].each do |method|
|
|
@@ -134,24 +457,81 @@ describe Mongoid::QueryCache do
|
|
|
134
457
|
end
|
|
135
458
|
|
|
136
459
|
it 'returns all documents' do
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
460
|
+
# Mongoid adds a sort by _id to the Person.first call, which is why
|
|
461
|
+
# these commands issue two queries instead of one.
|
|
462
|
+
expect_query(2) do
|
|
463
|
+
expect(Person.all.to_a.count).to eq(3)
|
|
464
|
+
Person.first
|
|
465
|
+
expect(Person.all.to_a.count).to eq(3)
|
|
466
|
+
end
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
it 'caches the query when order is specified' do
|
|
470
|
+
expect_query(1) do
|
|
471
|
+
expect(Person.order(_id: 1).all.to_a.count).to eq(3)
|
|
472
|
+
Person.first
|
|
473
|
+
expect(Person.order(_id: 1).all.to_a.count).to eq(3)
|
|
474
|
+
end
|
|
140
475
|
end
|
|
141
476
|
|
|
142
477
|
context 'with conditions specified' do
|
|
143
478
|
it 'returns all documents' do
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
479
|
+
# Mongoid adds a sort by _id to the Person.first call, which is why
|
|
480
|
+
# these commands issue two queries instead of one.
|
|
481
|
+
expect_query(2) do
|
|
482
|
+
expect(Person.gt(age: 0).to_a.count).to eq(3)
|
|
483
|
+
Person.gt(age: 0).first
|
|
484
|
+
expect(Person.gt(age: 0).to_a.count).to eq(3)
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
it 'caches the query when order is specified' do
|
|
489
|
+
expect_query(1) do
|
|
490
|
+
expect(Person.order(_id: 1).gt(age: 0).to_a.count).to eq(3)
|
|
491
|
+
Person.gt(age: 0).first
|
|
492
|
+
expect(Person.order(_id: 1).gt(age: 0).to_a.count).to eq(3)
|
|
493
|
+
end
|
|
147
494
|
end
|
|
148
495
|
end
|
|
149
496
|
|
|
150
497
|
context 'with order specified' do
|
|
151
498
|
it 'returns all documents' do
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
499
|
+
expect_query(1) do
|
|
500
|
+
expect(Person.order_by(name: 1).to_a.count).to eq(3)
|
|
501
|
+
Person.order_by(name: 1).first
|
|
502
|
+
expect(Person.order_by(name: 1).to_a.count).to eq(3)
|
|
503
|
+
end
|
|
504
|
+
end
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
context 'when using a block API' do
|
|
509
|
+
before do
|
|
510
|
+
Band.destroy_all
|
|
511
|
+
5.times { Band.create }
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
context '#any? with no block' do
|
|
515
|
+
it 'doesn\'t leak sessions' do
|
|
516
|
+
Band.all.any?
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
context '#all? with no block' do
|
|
521
|
+
it 'doesn\'t leak sessions' do
|
|
522
|
+
Band.all.all?
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
context '#none? with no block' do
|
|
527
|
+
it 'doesn\'t leak sessions' do
|
|
528
|
+
Band.all.none?
|
|
529
|
+
end
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
context '#one? with no block' do
|
|
533
|
+
it 'doesn\'t leak sessions' do
|
|
534
|
+
Band.all.one?
|
|
155
535
|
end
|
|
156
536
|
end
|
|
157
537
|
end
|
|
@@ -225,6 +605,10 @@ describe Mongoid::QueryCache do
|
|
|
225
605
|
end
|
|
226
606
|
|
|
227
607
|
before do
|
|
608
|
+
10.times do |i|
|
|
609
|
+
game.ratings << Rating.create!(value: i+1)
|
|
610
|
+
end
|
|
611
|
+
|
|
228
612
|
game.ratings.where(:value.gt => 5).asc(:id).all.to_a
|
|
229
613
|
end
|
|
230
614
|
|
|
@@ -232,27 +616,54 @@ describe Mongoid::QueryCache do
|
|
|
232
616
|
|
|
233
617
|
it "uses the cache" do
|
|
234
618
|
expect_no_queries do
|
|
235
|
-
game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
619
|
+
result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
620
|
+
expect(result.length).to eq(2)
|
|
621
|
+
expect(result.map { |r| r['value'] }).to eq([6, 7])
|
|
236
622
|
end
|
|
237
623
|
end
|
|
238
624
|
end
|
|
239
625
|
end
|
|
240
626
|
|
|
241
627
|
context "when the first query has a limit" do
|
|
242
|
-
|
|
243
628
|
let(:game) do
|
|
244
629
|
Game.create!(name: "2048")
|
|
245
630
|
end
|
|
246
631
|
|
|
247
632
|
before do
|
|
633
|
+
10.times do |i|
|
|
634
|
+
game.ratings << Rating.create!(value: i+1)
|
|
635
|
+
end
|
|
636
|
+
|
|
248
637
|
game.ratings.where(:value.gt => 5).limit(3).asc(:id).all.to_a
|
|
249
638
|
end
|
|
250
639
|
|
|
251
640
|
context "when the next query has a limit" do
|
|
641
|
+
# Server versions older than 3.2 also perform a killCursors operation,
|
|
642
|
+
# which causes this test to fail.
|
|
643
|
+
min_server_version '3.2'
|
|
644
|
+
|
|
645
|
+
context 'with driver query cache' do
|
|
646
|
+
min_driver_version '2.14'
|
|
647
|
+
|
|
648
|
+
# The driver query cache re-uses results with a larger limit
|
|
649
|
+
it 'does not query again' do
|
|
650
|
+
expect_no_queries do
|
|
651
|
+
result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
652
|
+
expect(result.length).to eq(2)
|
|
653
|
+
expect(result.map { |r| r['value'] }).to eq([6, 7])
|
|
654
|
+
end
|
|
655
|
+
end
|
|
656
|
+
end
|
|
252
657
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
658
|
+
context 'with mongoid query cache' do
|
|
659
|
+
max_driver_version '2.13'
|
|
660
|
+
|
|
661
|
+
it 'queries again' do
|
|
662
|
+
expect_query(1) do
|
|
663
|
+
result = game.ratings.where(:value.gt => 5).limit(2).asc(:id).to_a
|
|
664
|
+
expect(result.length).to eq(2)
|
|
665
|
+
expect(result.map { |r| r['value'] }).to eq([6, 7])
|
|
666
|
+
end
|
|
256
667
|
end
|
|
257
668
|
end
|
|
258
669
|
end
|
|
@@ -261,7 +672,9 @@ describe Mongoid::QueryCache do
|
|
|
261
672
|
|
|
262
673
|
it "queries again" do
|
|
263
674
|
expect_query(1) do
|
|
264
|
-
game.ratings.where(:value.gt => 5).asc(:id).to_a
|
|
675
|
+
result = game.ratings.where(:value.gt => 5).asc(:id).to_a
|
|
676
|
+
expect(result.length).to eq(5)
|
|
677
|
+
expect(result.map { |r| r['value'] }).to eq([6, 7, 8, 9, 10])
|
|
265
678
|
end
|
|
266
679
|
end
|
|
267
680
|
end
|
|
@@ -274,21 +687,34 @@ describe Mongoid::QueryCache do
|
|
|
274
687
|
end
|
|
275
688
|
|
|
276
689
|
before do
|
|
690
|
+
10.times do |i|
|
|
691
|
+
game.ratings << Rating.create!(value: i+1)
|
|
692
|
+
end
|
|
693
|
+
|
|
277
694
|
game.ratings.where(:value.gt => 5).asc(:id).all.to_a
|
|
278
695
|
end
|
|
279
696
|
|
|
280
697
|
it "does not query again" do
|
|
281
698
|
expect_no_queries do
|
|
282
|
-
game.ratings.where(:value.gt => 5).asc(:id).first
|
|
699
|
+
result = game.ratings.where(:value.gt => 5).asc(:id).first
|
|
700
|
+
expect(result['value']).to eq(6)
|
|
283
701
|
end
|
|
284
702
|
end
|
|
285
703
|
end
|
|
286
704
|
|
|
287
705
|
context "when limiting the result" do
|
|
706
|
+
before do
|
|
707
|
+
Band.destroy_all
|
|
708
|
+
|
|
709
|
+
5.times { |i| Band.create!(name: "Band #{i}") }
|
|
710
|
+
Band.all.to_a
|
|
711
|
+
end
|
|
288
712
|
|
|
289
713
|
it "does not query again" do
|
|
290
714
|
expect_query(0) do
|
|
291
|
-
Band.limit(2).all.to_a
|
|
715
|
+
result = Band.limit(2).all.to_a
|
|
716
|
+
expect(result.length).to eq(2)
|
|
717
|
+
expect(result.map { |r| r["name"] }).to eq(["Band 0", "Band 1"])
|
|
292
718
|
end
|
|
293
719
|
end
|
|
294
720
|
end
|
|
@@ -296,12 +722,17 @@ describe Mongoid::QueryCache do
|
|
|
296
722
|
context "when specifying a different skip value" do
|
|
297
723
|
|
|
298
724
|
before do
|
|
725
|
+
Band.destroy_all
|
|
726
|
+
|
|
727
|
+
5.times { |i| Band.create!(name: "Band #{i}") }
|
|
299
728
|
Band.limit(2).skip(1).all.to_a
|
|
300
729
|
end
|
|
301
730
|
|
|
302
731
|
it "queries again" do
|
|
303
732
|
expect_query(1) do
|
|
304
|
-
Band.limit(2).skip(3).all.to_a
|
|
733
|
+
result = Band.limit(2).skip(3).all.to_a
|
|
734
|
+
expect(result.length).to eq(2)
|
|
735
|
+
expect(result.map { |r| r["name"] }).to eq(["Band 3", "Band 4"])
|
|
305
736
|
end
|
|
306
737
|
end
|
|
307
738
|
end
|
|
@@ -337,6 +768,25 @@ describe Mongoid::QueryCache do
|
|
|
337
768
|
end
|
|
338
769
|
end
|
|
339
770
|
|
|
771
|
+
context 'when querying colleciton larger than the batch size' do
|
|
772
|
+
before do
|
|
773
|
+
Band.destroy_all
|
|
774
|
+
101.times { |i| Band.create!(_id: i) }
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
it 'does not raise an exception when querying multiple times' do
|
|
778
|
+
expect do
|
|
779
|
+
results1 = Band.all.to_a
|
|
780
|
+
expect(results1.length).to eq(101)
|
|
781
|
+
expect(results1.map { |band| band["_id"] }).to eq([*0..100])
|
|
782
|
+
|
|
783
|
+
results2 = Band.all.to_a
|
|
784
|
+
expect(results2.length).to eq(101)
|
|
785
|
+
expect(results2.map { |band| band["_id"] }).to eq([*0..100])
|
|
786
|
+
end.not_to raise_error
|
|
787
|
+
end
|
|
788
|
+
end
|
|
789
|
+
|
|
340
790
|
context "when query caching is enabled and the batch_size is set" do
|
|
341
791
|
|
|
342
792
|
around(:each) do |example|
|
|
@@ -471,8 +921,10 @@ describe Mongoid::QueryCache do
|
|
|
471
921
|
end
|
|
472
922
|
end
|
|
473
923
|
|
|
474
|
-
it "returns the same count of objects when using #pluck" do
|
|
475
|
-
|
|
924
|
+
it "returns the same count of objects when using #pluck but doesn't cache" do
|
|
925
|
+
expect_query(1) do
|
|
926
|
+
expect(Band.pluck(:name).length).to eq(99)
|
|
927
|
+
end
|
|
476
928
|
end
|
|
477
929
|
end
|
|
478
930
|
end
|
|
@@ -490,20 +942,36 @@ describe Mongoid::QueryCache do
|
|
|
490
942
|
Mongoid::QueryCache.enabled = true
|
|
491
943
|
10.times { Band.create! }
|
|
492
944
|
|
|
493
|
-
Band.batch_size(4).
|
|
945
|
+
Band.batch_size(4).to_a
|
|
494
946
|
end
|
|
495
947
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
end
|
|
948
|
+
context 'with driver query cache' do
|
|
949
|
+
min_driver_version '2.14'
|
|
499
950
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
951
|
+
# The driver query cache caches multi-batch cursors
|
|
952
|
+
it 'does cache the result' do
|
|
953
|
+
expect_no_queries do
|
|
954
|
+
expect(Band.all.map(&:id).size).to eq(10)
|
|
955
|
+
end
|
|
503
956
|
end
|
|
957
|
+
end
|
|
958
|
+
|
|
959
|
+
context 'with mongoid query cache' do
|
|
960
|
+
max_driver_version '2.13'
|
|
504
961
|
|
|
505
962
|
it 'does not cache the result' do
|
|
506
|
-
|
|
963
|
+
expect_query(1) do
|
|
964
|
+
expect(Band.all.map(&:id).size).to eq(10)
|
|
965
|
+
end
|
|
966
|
+
end
|
|
967
|
+
end
|
|
968
|
+
end
|
|
969
|
+
|
|
970
|
+
context 'when storing in system collection' do
|
|
971
|
+
it 'does not cache the query' do
|
|
972
|
+
expect_query(2) do
|
|
973
|
+
SystemRole.all.to_a
|
|
974
|
+
SystemRole.all.to_a
|
|
507
975
|
end
|
|
508
976
|
end
|
|
509
977
|
end
|