mongoid 7.1.0.rc0 → 7.2.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +6 -6
- data/LICENSE +1 -1
- data/README.md +14 -7
- data/Rakefile +21 -0
- data/lib/config/locales/en.yml +42 -6
- data/lib/mongoid.rb +26 -2
- data/lib/mongoid/association/accessors.rb +37 -2
- data/lib/mongoid/association/depending.rb +1 -6
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
- data/lib/mongoid/association/many.rb +5 -4
- data/lib/mongoid/association/proxy.rb +6 -4
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
- data/lib/mongoid/association/referenced/eager.rb +29 -9
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -15
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/atomic.rb +13 -3
- data/lib/mongoid/atomic/modifiers.rb +1 -1
- data/lib/mongoid/attributes.rb +28 -20
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/clients/factory.rb +19 -2
- data/lib/mongoid/clients/options.rb +8 -8
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/clients/storage_options.rb +5 -5
- data/lib/mongoid/composable.rb +1 -0
- data/lib/mongoid/config.rb +45 -12
- data/lib/mongoid/config/options.rb +5 -2
- data/lib/mongoid/contextual.rb +5 -4
- data/lib/mongoid/contextual/geo_near.rb +3 -2
- data/lib/mongoid/contextual/map_reduce.rb +3 -2
- data/lib/mongoid/contextual/mongo.rb +25 -5
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria.rb +80 -11
- data/lib/mongoid/criteria/modifiable.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
- data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +141 -19
- data/lib/mongoid/criteria/queryable/selector.rb +3 -3
- data/lib/mongoid/criteria/queryable/storable.rb +106 -101
- data/lib/mongoid/document.rb +15 -3
- data/lib/mongoid/errors.rb +7 -0
- data/lib/mongoid/errors/eager_load.rb +2 -0
- data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
- data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
- data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
- data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
- data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
- data/lib/mongoid/errors/invalid_query.rb +41 -0
- data/lib/mongoid/errors/no_client_config.rb +2 -2
- data/lib/mongoid/errors/no_default_client.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +4 -2
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/factory.rb +27 -10
- data/lib/mongoid/fields.rb +2 -1
- data/lib/mongoid/fields/standard.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +26 -10
- data/lib/mongoid/findable.rb +55 -18
- data/lib/mongoid/indexable.rb +2 -2
- data/lib/mongoid/interceptable.rb +5 -1
- data/lib/mongoid/matchable.rb +1 -149
- data/lib/mongoid/matcher.rb +127 -0
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/elem_match.rb +35 -0
- data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
- data/lib/mongoid/matcher/eq.rb +11 -0
- data/lib/mongoid/matcher/eq_impl.rb +32 -0
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
- data/lib/mongoid/matcher/exists.rb +15 -0
- data/lib/mongoid/matcher/expression.rb +40 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +63 -0
- data/lib/mongoid/matcher/field_operator.rb +52 -0
- data/lib/mongoid/matcher/gt.rb +17 -0
- data/lib/mongoid/matcher/gte.rb +17 -0
- data/lib/mongoid/matcher/in.rb +25 -0
- data/lib/mongoid/matcher/lt.rb +17 -0
- data/lib/mongoid/matcher/lte.rb +17 -0
- data/lib/mongoid/matcher/ne.rb +16 -0
- data/lib/mongoid/matcher/nin.rb +11 -0
- data/lib/mongoid/matcher/nor.rb +25 -0
- data/lib/mongoid/matcher/not.rb +29 -0
- data/lib/mongoid/matcher/or.rb +21 -0
- data/lib/mongoid/matcher/regex.rb +41 -0
- data/lib/mongoid/matcher/size.rb +26 -0
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/pushable.rb +11 -2
- data/lib/mongoid/persistence_context.rb +6 -6
- data/lib/mongoid/query_cache.rb +83 -38
- data/lib/mongoid/railties/database.rake +7 -0
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/serializable.rb +11 -3
- data/lib/mongoid/shardable.rb +56 -4
- data/lib/mongoid/tasks/database.rake +10 -5
- data/lib/mongoid/tasks/database.rb +83 -0
- data/lib/mongoid/timestamps/timeless.rb +3 -1
- data/lib/mongoid/traversable.rb +111 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/spec/integration/app_spec.rb +254 -0
- data/spec/integration/associations/embedded_spec.rb +148 -0
- data/spec/integration/associations/has_many_spec.rb +69 -0
- data/spec/integration/associations/has_one_spec.rb +69 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
- data/spec/integration/atomic/modifiers_spec.rb +117 -0
- data/spec/integration/bson_regexp_raw_spec.rb +20 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/criteria/logical_spec.rb +13 -0
- data/spec/integration/discriminator_key_spec.rb +354 -0
- data/spec/integration/discriminator_value_spec.rb +207 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
- data/spec/integration/matcher_operator_data/all.yml +140 -0
- data/spec/integration/matcher_operator_data/and.yml +93 -0
- data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
- data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
- data/spec/integration/matcher_operator_data/eq.yml +191 -0
- data/spec/integration/matcher_operator_data/exists.yml +213 -0
- data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
- data/spec/integration/matcher_operator_data/gt.yml +132 -0
- data/spec/integration/matcher_operator_data/gte.yml +132 -0
- data/spec/integration/matcher_operator_data/implicit.yml +331 -0
- data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
- data/spec/integration/matcher_operator_data/in.yml +194 -0
- data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
- data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
- data/spec/integration/matcher_operator_data/lt.yml +132 -0
- data/spec/integration/matcher_operator_data/lte.yml +132 -0
- data/spec/integration/matcher_operator_data/multiple.yml +29 -0
- data/spec/integration/matcher_operator_data/ne.yml +150 -0
- data/spec/integration/matcher_operator_data/nin.yml +114 -0
- data/spec/integration/matcher_operator_data/nor.yml +126 -0
- data/spec/integration/matcher_operator_data/not.yml +196 -0
- data/spec/integration/matcher_operator_data/or.yml +137 -0
- data/spec/integration/matcher_operator_data/regex.yml +174 -0
- data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
- data/spec/integration/matcher_operator_data/size.yml +174 -0
- data/spec/integration/matcher_operator_spec.rb +100 -0
- data/spec/integration/matcher_spec.rb +189 -0
- data/spec/integration/server_query_spec.rb +142 -0
- data/spec/integration/shardable_spec.rb +149 -0
- data/spec/lite_spec_helper.rb +15 -4
- data/spec/mongoid/association/accessors_spec.rb +238 -63
- data/spec/mongoid/association/depending_spec.rb +78 -26
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
- data/spec/mongoid/association/embedded/embeds_many_models.rb +20 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +146 -68
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +462 -187
- data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
- data/spec/mongoid/atomic_spec.rb +23 -0
- data/spec/mongoid/attributes/nested_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +19 -7
- data/spec/mongoid/changeable_spec.rb +23 -0
- data/spec/mongoid/clients/factory_spec.rb +45 -8
- data/spec/mongoid/clients/options_spec.rb +11 -11
- data/spec/mongoid/clients/sessions_spec.rb +9 -10
- data/spec/mongoid/clients/transactions_spec.rb +20 -8
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +28 -0
- data/spec/mongoid/contextual/atomic_spec.rb +22 -11
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
- data/spec/mongoid/contextual/mongo_spec.rb +146 -69
- data/spec/mongoid/copyable_spec.rb +153 -1
- data/spec/mongoid/copyable_spec_models.rb +14 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +136 -82
- data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
- data/spec/mongoid/criteria_spec.rb +240 -41
- data/spec/mongoid/document_fields_spec.rb +29 -0
- data/spec/mongoid/document_persistence_context_spec.rb +33 -0
- data/spec/mongoid/document_spec.rb +89 -15
- data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
- data/spec/mongoid/factory_spec.rb +261 -28
- data/spec/mongoid/fields_spec.rb +72 -3
- data/spec/mongoid/findable_spec.rb +32 -0
- data/spec/mongoid/indexable_spec.rb +34 -6
- data/spec/mongoid/inspectable_spec.rb +29 -2
- data/spec/mongoid/interceptable_spec.rb +64 -2
- data/spec/mongoid/interceptable_spec_models.rb +76 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
- data/spec/mongoid/persistable/creatable_spec.rb +108 -25
- data/spec/mongoid/persistable/deletable_spec.rb +86 -0
- data/spec/mongoid/persistable/pushable_spec.rb +55 -1
- data/spec/mongoid/persistable/savable_spec.rb +174 -16
- data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
- data/spec/mongoid/query_cache_spec.rb +498 -29
- data/spec/mongoid/relations/proxy_spec.rb +1 -1
- data/spec/mongoid/reloadable_spec.rb +72 -0
- data/spec/mongoid/scopable_spec.rb +2 -1
- data/spec/mongoid/serializable_spec.rb +149 -20
- data/spec/mongoid/shardable_models.rb +61 -0
- data/spec/mongoid/shardable_spec.rb +69 -16
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +1 -1
- data/spec/mongoid/traversable_spec.rb +1100 -0
- data/spec/spec_helper.rb +4 -33
- data/spec/support/child_process_helper.rb +79 -0
- data/spec/support/cluster_config.rb +3 -3
- data/spec/support/constraints.rb +50 -10
- data/spec/support/expectations.rb +3 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/lite_constraints.rb +22 -0
- data/spec/{app → support}/models/account.rb +0 -0
- data/spec/{app → support}/models/acolyte.rb +0 -0
- data/spec/{app → support}/models/actor.rb +1 -1
- data/spec/{app → support}/models/actress.rb +0 -0
- data/spec/{app → support}/models/address.rb +0 -0
- data/spec/{app → support}/models/address_component.rb +0 -0
- data/spec/{app → support}/models/address_number.rb +0 -0
- data/spec/{app → support}/models/agency.rb +0 -0
- data/spec/{app → support}/models/agent.rb +0 -0
- data/spec/{app → support}/models/album.rb +0 -0
- data/spec/{app → support}/models/alert.rb +0 -0
- data/spec/{app → support}/models/animal.rb +0 -0
- data/spec/{app → support}/models/answer.rb +0 -0
- data/spec/{app → support}/models/appointment.rb +0 -0
- data/spec/support/models/armrest.rb +10 -0
- data/spec/{app → support}/models/array_field.rb +0 -0
- data/spec/{app → support}/models/article.rb +0 -0
- data/spec/{app → support}/models/artist.rb +0 -0
- data/spec/{app → support}/models/artwork.rb +0 -0
- data/spec/{app → support}/models/audio.rb +0 -0
- data/spec/{app → support}/models/augmentation.rb +0 -0
- data/spec/{app → support}/models/author.rb +0 -0
- data/spec/{app → support}/models/baby.rb +0 -0
- data/spec/{app → support}/models/band.rb +0 -0
- data/spec/{app → support}/models/bar.rb +0 -0
- data/spec/{app → support}/models/basic.rb +0 -0
- data/spec/{app → support}/models/bed.rb +0 -0
- data/spec/{app → support}/models/big_palette.rb +0 -0
- data/spec/{app → support}/models/birthday.rb +0 -0
- data/spec/{app → support}/models/bomb.rb +0 -0
- data/spec/{app → support}/models/book.rb +0 -0
- data/spec/{app → support}/models/breed.rb +0 -0
- data/spec/{app → support}/models/browser.rb +1 -1
- data/spec/{app → support}/models/building.rb +0 -0
- data/spec/{app → support}/models/building_address.rb +0 -0
- data/spec/{app → support}/models/bus.rb +0 -0
- data/spec/{app → support}/models/business.rb +0 -0
- data/spec/{app → support}/models/callback_test.rb +0 -0
- data/spec/{app → support}/models/canvas.rb +1 -1
- data/spec/{app → support}/models/car.rb +0 -0
- data/spec/{app → support}/models/cat.rb +0 -0
- data/spec/{app → support}/models/category.rb +0 -0
- data/spec/{app → support}/models/child.rb +0 -0
- data/spec/{app → support}/models/child_doc.rb +0 -0
- data/spec/{app → support}/models/church.rb +0 -0
- data/spec/{app → support}/models/circle.rb +0 -0
- data/spec/{app → support}/models/circuit.rb +0 -0
- data/spec/{app → support}/models/circus.rb +0 -0
- data/spec/{app → support}/models/code.rb +0 -0
- data/spec/support/models/coding.rb +4 -0
- data/spec/support/models/coding/pull_request.rb +12 -0
- data/spec/{app → support}/models/comment.rb +0 -0
- data/spec/{app → support}/models/company.rb +0 -0
- data/spec/{app → support}/models/consumption_period.rb +0 -0
- data/spec/{app → support}/models/contextable_item.rb +0 -0
- data/spec/{app → support}/models/contractor.rb +0 -0
- data/spec/{app → support}/models/cookie.rb +0 -0
- data/spec/{app → support}/models/country_code.rb +0 -0
- data/spec/{app → support}/models/courier_job.rb +0 -0
- data/spec/support/models/crate.rb +13 -0
- data/spec/support/models/deed.rb +8 -0
- data/spec/{app → support}/models/definition.rb +0 -0
- data/spec/support/models/delegating_patient.rb +16 -0
- data/spec/{app → support}/models/description.rb +0 -0
- data/spec/{app → support}/models/dictionary.rb +0 -0
- data/spec/{app → support}/models/division.rb +0 -0
- data/spec/{app → support}/models/doctor.rb +0 -0
- data/spec/{app → support}/models/dog.rb +0 -0
- data/spec/{app → support}/models/dokument.rb +0 -0
- data/spec/{app → support}/models/draft.rb +0 -0
- data/spec/{app → support}/models/dragon.rb +0 -0
- data/spec/{app → support}/models/driver.rb +1 -1
- data/spec/{app → support}/models/drug.rb +0 -0
- data/spec/{app → support}/models/dungeon.rb +0 -0
- data/spec/{app → support}/models/edit.rb +0 -0
- data/spec/{app → support}/models/email.rb +0 -0
- data/spec/{app → support}/models/employer.rb +0 -0
- data/spec/{app → support}/models/entry.rb +0 -0
- data/spec/{app → support}/models/eraser.rb +0 -0
- data/spec/{app → support}/models/even.rb +0 -0
- data/spec/{app → support}/models/event.rb +0 -0
- data/spec/{app → support}/models/exhibition.rb +0 -0
- data/spec/{app → support}/models/exhibitor.rb +0 -0
- data/spec/{app → support}/models/explosion.rb +0 -0
- data/spec/{app → support}/models/eye.rb +0 -0
- data/spec/{app → support}/models/eye_bowl.rb +0 -0
- data/spec/{app → support}/models/face.rb +0 -0
- data/spec/{app → support}/models/favorite.rb +0 -0
- data/spec/{app → support}/models/filesystem.rb +0 -0
- data/spec/{app → support}/models/fire_hydrant.rb +0 -0
- data/spec/{app → support}/models/firefox.rb +0 -0
- data/spec/{app → support}/models/fish.rb +0 -0
- data/spec/{app → support}/models/folder.rb +0 -0
- data/spec/{app → support}/models/folder_item.rb +0 -0
- data/spec/{app → support}/models/fruits.rb +0 -0
- data/spec/{app → support}/models/game.rb +0 -0
- data/spec/{app → support}/models/ghost.rb +0 -0
- data/spec/support/models/guitar.rb +5 -0
- data/spec/{app → support}/models/home.rb +0 -0
- data/spec/{app → support}/models/house.rb +0 -0
- data/spec/{app → support}/models/html_writer.rb +0 -0
- data/spec/{app → support}/models/id_key.rb +0 -0
- data/spec/support/models/idnodef.rb +8 -0
- data/spec/{app → support}/models/image.rb +0 -0
- data/spec/{app → support}/models/implant.rb +0 -0
- data/spec/support/models/instrument.rb +9 -0
- data/spec/{app → support}/models/item.rb +1 -1
- data/spec/{app → support}/models/jar.rb +0 -0
- data/spec/{app → support}/models/kaleidoscope.rb +0 -0
- data/spec/{app → support}/models/kangaroo.rb +0 -0
- data/spec/{app → support}/models/label.rb +0 -0
- data/spec/{app → support}/models/language.rb +0 -0
- data/spec/{app → support}/models/lat_lng.rb +0 -0
- data/spec/{app → support}/models/league.rb +0 -0
- data/spec/{app → support}/models/learner.rb +0 -0
- data/spec/{app → support}/models/line_item.rb +0 -0
- data/spec/{app → support}/models/location.rb +0 -0
- data/spec/{app → support}/models/login.rb +0 -0
- data/spec/{app → support}/models/manufacturer.rb +0 -0
- data/spec/{app → support}/models/meat.rb +0 -0
- data/spec/{app → support}/models/membership.rb +0 -0
- data/spec/{app → support}/models/message.rb +0 -0
- data/spec/{app → support}/models/minim.rb +0 -0
- data/spec/{app → support}/models/mixed_drink.rb +0 -0
- data/spec/support/models/mop.rb +16 -0
- data/spec/{app → support}/models/movie.rb +0 -0
- data/spec/{app → support}/models/my_hash.rb +0 -0
- data/spec/{app → support}/models/name.rb +0 -0
- data/spec/{app → support}/models/name_only.rb +0 -0
- data/spec/{app → support}/models/node.rb +0 -0
- data/spec/{app → support}/models/note.rb +0 -0
- data/spec/{app → support}/models/odd.rb +0 -0
- data/spec/{app → support}/models/ordered_post.rb +0 -0
- data/spec/{app → support}/models/ordered_preference.rb +0 -0
- data/spec/{app → support}/models/oscar.rb +0 -0
- data/spec/{app → support}/models/other_owner_object.rb +0 -0
- data/spec/{app → support}/models/override.rb +0 -0
- data/spec/{app → support}/models/ownable.rb +0 -0
- data/spec/{app → support}/models/owner.rb +2 -0
- data/spec/{app → support}/models/pack.rb +0 -0
- data/spec/{app → support}/models/page.rb +0 -0
- data/spec/{app → support}/models/page_question.rb +0 -0
- data/spec/{app → support}/models/palette.rb +1 -1
- data/spec/{app → support}/models/parent.rb +0 -0
- data/spec/{app → support}/models/parent_doc.rb +0 -0
- data/spec/{app → support}/models/passport.rb +1 -0
- data/spec/{app → support}/models/patient.rb +0 -0
- data/spec/{app → support}/models/pdf_writer.rb +0 -0
- data/spec/{app → support}/models/pencil.rb +0 -0
- data/spec/{app → support}/models/person.rb +1 -1
- data/spec/{app → support}/models/pet.rb +0 -0
- data/spec/{app → support}/models/pet_owner.rb +0 -0
- data/spec/{app → support}/models/phone.rb +1 -0
- data/spec/support/models/piano.rb +5 -0
- data/spec/{app → support}/models/pizza.rb +0 -0
- data/spec/{app → support}/models/player.rb +0 -0
- data/spec/{app → support}/models/post.rb +0 -0
- data/spec/{app → support}/models/post_genre.rb +0 -0
- data/spec/{app → support}/models/powerup.rb +0 -0
- data/spec/{app → support}/models/preference.rb +0 -0
- data/spec/{app → support}/models/princess.rb +0 -0
- data/spec/{app → support}/models/product.rb +0 -0
- data/spec/support/models/profile.rb +18 -0
- data/spec/{app → support}/models/pronunciation.rb +0 -0
- data/spec/{app → support}/models/pub.rb +0 -0
- data/spec/support/models/publication.rb +5 -0
- data/spec/support/models/publication/encyclopedia.rb +12 -0
- data/spec/support/models/publication/review.rb +14 -0
- data/spec/{app → support}/models/purchase.rb +0 -0
- data/spec/{app → support}/models/question.rb +0 -0
- data/spec/{app → support}/models/quiz.rb +0 -0
- data/spec/{app → support}/models/rating.rb +0 -0
- data/spec/{app → support}/models/record.rb +0 -0
- data/spec/{app → support}/models/registry.rb +0 -0
- data/spec/{app → support}/models/role.rb +0 -0
- data/spec/{app → support}/models/root_category.rb +0 -0
- data/spec/{app → support}/models/sandwich.rb +0 -0
- data/spec/{app → support}/models/scheduler.rb +0 -0
- data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
- data/spec/support/models/seat.rb +25 -0
- data/spec/{app → support}/models/seo.rb +0 -0
- data/spec/{app → support}/models/series.rb +0 -0
- data/spec/{app → support}/models/server.rb +0 -0
- data/spec/{app → support}/models/service.rb +0 -0
- data/spec/{app → support}/models/shape.rb +2 -2
- data/spec/{app → support}/models/shelf.rb +0 -0
- data/spec/{app → support}/models/shipment_address.rb +0 -0
- data/spec/{app → support}/models/shipping_container.rb +0 -0
- data/spec/{app → support}/models/shipping_pack.rb +0 -0
- data/spec/{app → support}/models/shop.rb +0 -0
- data/spec/{app → support}/models/short_agent.rb +0 -0
- data/spec/{app → support}/models/short_quiz.rb +0 -0
- data/spec/{app → support}/models/simple.rb +0 -0
- data/spec/{app → support}/models/slave.rb +0 -0
- data/spec/{app → support}/models/song.rb +0 -0
- data/spec/{app → support}/models/sound.rb +0 -0
- data/spec/{app → support}/models/square.rb +0 -0
- data/spec/{app → support}/models/staff.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
- data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
- data/spec/{app → support}/models/strategy.rb +0 -0
- data/spec/{app → support}/models/sub_item.rb +0 -0
- data/spec/{app → support}/models/subscription.rb +0 -0
- data/spec/{app → support}/models/survey.rb +0 -0
- data/spec/{app → support}/models/symptom.rb +0 -0
- data/spec/support/models/system_role.rb +7 -0
- data/spec/{app → support}/models/tag.rb +0 -0
- data/spec/{app → support}/models/target.rb +0 -0
- data/spec/{app → support}/models/template.rb +0 -0
- data/spec/{app → support}/models/thing.rb +0 -0
- data/spec/{app → support}/models/title.rb +0 -0
- data/spec/{app → support}/models/tool.rb +2 -2
- data/spec/{app → support}/models/topping.rb +0 -0
- data/spec/support/models/toy.rb +10 -0
- data/spec/{app → support}/models/track.rb +0 -0
- data/spec/{app → support}/models/translation.rb +0 -0
- data/spec/{app → support}/models/tree.rb +0 -0
- data/spec/{app → support}/models/truck.rb +2 -0
- data/spec/{app → support}/models/updatable.rb +0 -0
- data/spec/{app → support}/models/user.rb +0 -0
- data/spec/{app → support}/models/user_account.rb +0 -0
- data/spec/{app → support}/models/validation_callback.rb +0 -0
- data/spec/{app → support}/models/vehicle.rb +7 -2
- data/spec/{app → support}/models/version.rb +0 -0
- data/spec/{app → support}/models/vertex.rb +0 -0
- data/spec/{app → support}/models/vet_visit.rb +0 -0
- data/spec/{app → support}/models/video.rb +0 -0
- data/spec/{app → support}/models/video_game.rb +0 -0
- data/spec/{app → support}/models/weapon.rb +0 -0
- data/spec/{app → support}/models/wiki_page.rb +0 -0
- data/spec/{app → support}/models/word.rb +0 -0
- data/spec/{app → support}/models/word_origin.rb +0 -0
- data/spec/{app → support}/models/writer.rb +2 -2
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +13 -5
- data/spec/support/spec_organizer.rb +130 -0
- metadata +882 -752
- metadata.gz.sig +0 -0
- data/lib/mongoid/matchable/all.rb +0 -30
- data/lib/mongoid/matchable/and.rb +0 -32
- data/lib/mongoid/matchable/default.rb +0 -121
- data/lib/mongoid/matchable/elem_match.rb +0 -36
- data/lib/mongoid/matchable/eq.rb +0 -23
- data/lib/mongoid/matchable/exists.rb +0 -25
- data/lib/mongoid/matchable/gt.rb +0 -25
- data/lib/mongoid/matchable/gte.rb +0 -25
- data/lib/mongoid/matchable/in.rb +0 -26
- data/lib/mongoid/matchable/lt.rb +0 -25
- data/lib/mongoid/matchable/lte.rb +0 -25
- data/lib/mongoid/matchable/ne.rb +0 -23
- data/lib/mongoid/matchable/nin.rb +0 -24
- data/lib/mongoid/matchable/nor.rb +0 -38
- data/lib/mongoid/matchable/or.rb +0 -35
- data/lib/mongoid/matchable/regexp.rb +0 -30
- data/lib/mongoid/matchable/size.rb +0 -23
- data/spec/mongoid/matchable/all_spec.rb +0 -34
- data/spec/mongoid/matchable/and_spec.rb +0 -190
- data/spec/mongoid/matchable/default_spec.rb +0 -140
- data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
- data/spec/mongoid/matchable/eq_spec.rb +0 -49
- data/spec/mongoid/matchable/exists_spec.rb +0 -60
- data/spec/mongoid/matchable/gt_spec.rb +0 -89
- data/spec/mongoid/matchable/gte_spec.rb +0 -87
- data/spec/mongoid/matchable/in_spec.rb +0 -52
- data/spec/mongoid/matchable/lt_spec.rb +0 -88
- data/spec/mongoid/matchable/lte_spec.rb +0 -88
- data/spec/mongoid/matchable/ne_spec.rb +0 -49
- data/spec/mongoid/matchable/nin_spec.rb +0 -51
- data/spec/mongoid/matchable/nor_spec.rb +0 -210
- data/spec/mongoid/matchable/or_spec.rb +0 -134
- data/spec/mongoid/matchable/regexp_spec.rb +0 -62
- data/spec/mongoid/matchable/size_spec.rb +0 -28
- data/spec/mongoid/matchable_spec.rb +0 -856
@@ -732,108 +732,89 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
732
732
|
end
|
733
733
|
end
|
734
734
|
|
735
|
-
|
735
|
+
%i(geo_spatial geo_spacial).each do |meth|
|
736
|
+
describe "#geo_spacial" do
|
736
737
|
|
737
|
-
|
738
|
+
let(:query_method) { meth }
|
738
739
|
|
739
|
-
|
740
|
-
|
740
|
+
it_behaves_like 'requires an argument'
|
741
|
+
it_behaves_like 'requires a non-nil argument'
|
741
742
|
|
742
|
-
|
743
|
+
context "when provided a criterion" do
|
743
744
|
|
744
|
-
|
745
|
+
context "when the geometry is a point intersection" do
|
745
746
|
|
746
|
-
|
747
|
-
|
748
|
-
|
747
|
+
let(:selection) do
|
748
|
+
query.public_send(query_method, :location.intersects_point => [ 1, 10 ])
|
749
|
+
end
|
749
750
|
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
751
|
+
it "adds the $geoIntersects expression" do
|
752
|
+
expect(selection.selector).to eq({
|
753
|
+
"location" => {
|
754
|
+
"$geoIntersects" => {
|
755
|
+
"$geometry" => {
|
756
|
+
"type" => "Point",
|
757
|
+
"coordinates" => [ 1, 10 ]
|
758
|
+
}
|
757
759
|
}
|
758
760
|
}
|
759
|
-
}
|
760
|
-
|
761
|
-
end
|
761
|
+
})
|
762
|
+
end
|
762
763
|
|
763
|
-
|
764
|
-
|
764
|
+
it_behaves_like "returns a cloned query"
|
765
|
+
end
|
765
766
|
|
766
|
-
|
767
|
+
context "when the geometry is a line intersection" do
|
767
768
|
|
768
|
-
|
769
|
-
|
770
|
-
|
769
|
+
let(:selection) do
|
770
|
+
query.public_send(query_method, :location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
|
771
|
+
end
|
771
772
|
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
773
|
+
it "adds the $geoIntersects expression" do
|
774
|
+
expect(selection.selector).to eq({
|
775
|
+
"location" => {
|
776
|
+
"$geoIntersects" => {
|
777
|
+
"$geometry" => {
|
778
|
+
"type" => "LineString",
|
779
|
+
"coordinates" => [[ 1, 10 ], [ 2, 10 ]]
|
780
|
+
}
|
779
781
|
}
|
780
782
|
}
|
781
|
-
}
|
782
|
-
|
783
|
-
end
|
783
|
+
})
|
784
|
+
end
|
784
785
|
|
785
|
-
|
786
|
-
|
786
|
+
it_behaves_like "returns a cloned query"
|
787
|
+
end
|
787
788
|
|
788
|
-
|
789
|
+
context "when the geometry is a polygon intersection" do
|
789
790
|
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
791
|
+
let(:selection) do
|
792
|
+
query.public_send(query_method,
|
793
|
+
:location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
794
|
+
)
|
795
|
+
end
|
795
796
|
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
797
|
+
it "adds the $geoIntersects expression" do
|
798
|
+
expect(selection.selector).to eq({
|
799
|
+
"location" => {
|
800
|
+
"$geoIntersects" => {
|
801
|
+
"$geometry" => {
|
802
|
+
"type" => "Polygon",
|
803
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
804
|
+
}
|
803
805
|
}
|
804
806
|
}
|
805
|
-
}
|
806
|
-
|
807
|
-
end
|
808
|
-
|
809
|
-
it_behaves_like "returns a cloned query"
|
810
|
-
end
|
811
|
-
|
812
|
-
context "when the geometry is within a polygon" do
|
807
|
+
})
|
808
|
+
end
|
813
809
|
|
814
|
-
|
815
|
-
query.geo_spacial(
|
816
|
-
:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
817
|
-
)
|
810
|
+
it_behaves_like "returns a cloned query"
|
818
811
|
end
|
819
812
|
|
820
|
-
|
821
|
-
expect(selection.selector).to eq({
|
822
|
-
"location" => {
|
823
|
-
"$geoWithin" => {
|
824
|
-
"$geometry" => {
|
825
|
-
"type" => "Polygon",
|
826
|
-
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
827
|
-
}
|
828
|
-
}
|
829
|
-
}
|
830
|
-
})
|
831
|
-
end
|
813
|
+
context "when the geometry is within a polygon" do
|
832
814
|
|
833
|
-
context "when used with the $box operator ($geoWithin query) " do
|
834
815
|
let(:selection) do
|
835
|
-
query.
|
836
|
-
:location.
|
816
|
+
query.public_send(query_method,
|
817
|
+
:location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
837
818
|
)
|
838
819
|
end
|
839
820
|
|
@@ -841,16 +822,37 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
841
822
|
expect(selection.selector).to eq({
|
842
823
|
"location" => {
|
843
824
|
"$geoWithin" => {
|
844
|
-
"$
|
845
|
-
|
846
|
-
|
825
|
+
"$geometry" => {
|
826
|
+
"type" => "Polygon",
|
827
|
+
"coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
|
828
|
+
}
|
847
829
|
}
|
848
830
|
}
|
849
831
|
})
|
850
832
|
end
|
851
|
-
end
|
852
833
|
|
853
|
-
|
834
|
+
context "when used with the $box operator ($geoWithin query) " do
|
835
|
+
let(:selection) do
|
836
|
+
query.public_send(query_method,
|
837
|
+
:location.within_box => [[ 1, 10 ], [ 2, 10 ]]
|
838
|
+
)
|
839
|
+
end
|
840
|
+
|
841
|
+
it "adds the $geoIntersects expression" do
|
842
|
+
expect(selection.selector).to eq({
|
843
|
+
"location" => {
|
844
|
+
"$geoWithin" => {
|
845
|
+
"$box" => [
|
846
|
+
[ 1, 10 ], [ 2, 10 ]
|
847
|
+
]
|
848
|
+
}
|
849
|
+
}
|
850
|
+
})
|
851
|
+
end
|
852
|
+
end
|
853
|
+
|
854
|
+
it_behaves_like "returns a cloned query"
|
855
|
+
end
|
854
856
|
end
|
855
857
|
end
|
856
858
|
end
|
@@ -2450,6 +2452,58 @@ describe Mongoid::Criteria::Queryable::Selectable do
|
|
2450
2452
|
end
|
2451
2453
|
end
|
2452
2454
|
end
|
2455
|
+
|
2456
|
+
context 'when using an MQL logical operator manually' do
|
2457
|
+
let(:base_query) do
|
2458
|
+
query.where(test: 1)
|
2459
|
+
end
|
2460
|
+
|
2461
|
+
let(:selection) do
|
2462
|
+
base_query.where(mql_operator => ['hello' => 'world'])
|
2463
|
+
end
|
2464
|
+
|
2465
|
+
shared_examples_for 'adds conditions to existing query' do
|
2466
|
+
it 'adds conditions to existing query' do
|
2467
|
+
selection.selector.should == {
|
2468
|
+
'test' => 1,
|
2469
|
+
mql_operator => ['hello' => 'world'],
|
2470
|
+
}
|
2471
|
+
end
|
2472
|
+
end
|
2473
|
+
|
2474
|
+
shared_examples_for 'adds conditions to existing query with an extra $and' do
|
2475
|
+
it 'adds conditions to existing query' do
|
2476
|
+
selection.selector.should == {
|
2477
|
+
'test' => 1,
|
2478
|
+
mql_operator => ['hello' => 'world'],
|
2479
|
+
}
|
2480
|
+
end
|
2481
|
+
end
|
2482
|
+
|
2483
|
+
context '$or' do
|
2484
|
+
let(:mql_operator) { '$or' }
|
2485
|
+
|
2486
|
+
it_behaves_like 'adds conditions to existing query with an extra $and'
|
2487
|
+
end
|
2488
|
+
|
2489
|
+
context '$nor' do
|
2490
|
+
let(:mql_operator) { '$nor' }
|
2491
|
+
|
2492
|
+
it_behaves_like 'adds conditions to existing query with an extra $and'
|
2493
|
+
end
|
2494
|
+
|
2495
|
+
context '$not' do
|
2496
|
+
let(:mql_operator) { '$not' }
|
2497
|
+
|
2498
|
+
it_behaves_like 'adds conditions to existing query'
|
2499
|
+
end
|
2500
|
+
|
2501
|
+
context '$and' do
|
2502
|
+
let(:mql_operator) { '$and' }
|
2503
|
+
|
2504
|
+
it_behaves_like 'adds conditions to existing query'
|
2505
|
+
end
|
2506
|
+
end
|
2453
2507
|
end
|
2454
2508
|
|
2455
2509
|
describe Symbol do
|
@@ -52,6 +52,22 @@ describe Mongoid::Criteria::Queryable::Storable do
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
context '$and to query with $and which already has the given key' do
|
56
|
+
let(:query) do
|
57
|
+
Mongoid::Query.new.where('$and' => [{foo: 'zoom'}])
|
58
|
+
end
|
59
|
+
|
60
|
+
let(:modified) do
|
61
|
+
query.send(query_method, '$and', [{'foo' => 'bar'}])
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'adds to existing $and' do
|
65
|
+
modified.selector.should == {
|
66
|
+
'$and' => [{'foo' => 'zoom'}, {'foo' => 'bar'}],
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
55
71
|
end
|
56
72
|
|
57
73
|
context '$or operator' do
|
@@ -74,9 +90,11 @@ describe Mongoid::Criteria::Queryable::Storable do
|
|
74
90
|
query.send(query_method, '$or', [{'foo' => 'bar'}])
|
75
91
|
end
|
76
92
|
|
77
|
-
it '
|
93
|
+
it 'adds the new conditions' do
|
78
94
|
modified.selector.should == {
|
79
|
-
'
|
95
|
+
'zoom' => 'zoom',
|
96
|
+
'$or' => ['foo' => 'bar'],
|
97
|
+
}
|
80
98
|
end
|
81
99
|
end
|
82
100
|
|
@@ -98,6 +116,66 @@ describe Mongoid::Criteria::Queryable::Storable do
|
|
98
116
|
end
|
99
117
|
end
|
100
118
|
|
119
|
+
describe '#add_field_expression' do
|
120
|
+
context 'simple field and value write' do
|
121
|
+
let(:modified) do
|
122
|
+
query.add_field_expression('foo', 'bar')
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'adds the condition' do
|
126
|
+
modified.selector.should == {
|
127
|
+
'foo' => 'bar'
|
128
|
+
}
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'an operator write' do
|
133
|
+
let(:modified) do
|
134
|
+
query.add_field_expression('$eq', {'foo' => 'bar'})
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'is not allowed' do
|
138
|
+
lambda do
|
139
|
+
modified
|
140
|
+
end.should raise_error(ArgumentError, /Field cannot be an operator/)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'when another field exists in destination' do
|
145
|
+
let(:base) do
|
146
|
+
query.add_field_expression('foo', 'bar')
|
147
|
+
end
|
148
|
+
|
149
|
+
let(:modified) do
|
150
|
+
base.add_field_expression('zoom', 'zoom')
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'adds the condition' do
|
154
|
+
modified.selector.should == {
|
155
|
+
'foo' => 'bar',
|
156
|
+
'zoom' => 'zoom',
|
157
|
+
}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'when field being added already exists in destination' do
|
162
|
+
let(:base) do
|
163
|
+
query.add_field_expression('foo', 'bar')
|
164
|
+
end
|
165
|
+
|
166
|
+
let(:modified) do
|
167
|
+
base.add_field_expression('foo', 'zoom')
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'adds the new condition using $and' do
|
171
|
+
modified.selector.should == {
|
172
|
+
'foo' => 'bar',
|
173
|
+
'$and' => ['foo' => 'zoom'],
|
174
|
+
}
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
101
179
|
describe '#add_operator_expression' do
|
102
180
|
let(:query_method) { :add_operator_expression }
|
103
181
|
|
@@ -786,12 +786,72 @@ describe Mongoid::Criteria do
|
|
786
786
|
|
787
787
|
describe "#field_list" do
|
788
788
|
|
789
|
+
context "when using the default discriminator key" do
|
790
|
+
let(:criteria) do
|
791
|
+
Doctor.only(:_id)
|
792
|
+
end
|
793
|
+
|
794
|
+
it "returns the fields with required _id minus type" do
|
795
|
+
expect(criteria.field_list).to eq([ "_id" ])
|
796
|
+
end
|
797
|
+
end
|
798
|
+
|
799
|
+
context "when using a custom discriminator key" do
|
800
|
+
before do
|
801
|
+
Person.discriminator_key = "dkey"
|
802
|
+
end
|
803
|
+
|
804
|
+
after do
|
805
|
+
Person.discriminator_key = nil
|
806
|
+
end
|
807
|
+
|
808
|
+
let(:criteria) do
|
809
|
+
Doctor.only(:_id, :_type)
|
810
|
+
end
|
811
|
+
|
812
|
+
it "returns the fields with type without dkey" do
|
813
|
+
expect(criteria.field_list).to eq([ "_id", "_type" ])
|
814
|
+
end
|
815
|
+
end
|
816
|
+
end
|
817
|
+
|
818
|
+
describe "#find" do
|
819
|
+
let!(:depeche) do
|
820
|
+
Band.create!(name: "Depeche Mode")
|
821
|
+
end
|
822
|
+
|
789
823
|
let(:criteria) do
|
790
|
-
Band.
|
824
|
+
Band.where(name: "Depeche Mode")
|
825
|
+
end
|
826
|
+
|
827
|
+
context "when given a block" do
|
828
|
+
it "behaves as Enumerable" do
|
829
|
+
result = criteria.find { |c| c.name == "Depeche Mode" }
|
830
|
+
expect(result).to eq(depeche)
|
831
|
+
end
|
832
|
+
end
|
833
|
+
|
834
|
+
context "when given a Proc and a block" do
|
835
|
+
it "behaves as Enumerable" do
|
836
|
+
result = criteria.find(-> {"default"}) { |c| c.name == "Not Depeche Mode" }
|
837
|
+
expect(result).to eq("default")
|
838
|
+
end
|
839
|
+
end
|
840
|
+
|
841
|
+
context "when given a Proc" do
|
842
|
+
it "behaves as Enumerable" do
|
843
|
+
lambda do
|
844
|
+
criteria.find(-> {"default"})
|
845
|
+
# Proc is not serializable to a BSON type
|
846
|
+
end.should raise_error(BSON::Error::UnserializableClass)
|
847
|
+
end
|
791
848
|
end
|
792
849
|
|
793
|
-
|
794
|
-
|
850
|
+
context "when given an id" do
|
851
|
+
it "behaves as Findable" do
|
852
|
+
result = criteria.find(depeche.id)
|
853
|
+
expect(result).to eq(depeche)
|
854
|
+
end
|
795
855
|
end
|
796
856
|
end
|
797
857
|
|
@@ -2337,7 +2397,7 @@ describe Mongoid::Criteria do
|
|
2337
2397
|
end
|
2338
2398
|
|
2339
2399
|
it "returns the map/reduce results" do
|
2340
|
-
expect(map_reduce).to eq([
|
2400
|
+
expect(map_reduce.sort_by { |doc| doc['_id'] }).to eq([
|
2341
2401
|
{ "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
|
2342
2402
|
{ "_id" => "Tool", "value" => { "likes" => 100 }}
|
2343
2403
|
])
|
@@ -2804,13 +2864,36 @@ describe Mongoid::Criteria do
|
|
2804
2864
|
end
|
2805
2865
|
|
2806
2866
|
context "when using inheritance" do
|
2867
|
+
context "when using the default discriminator key" do
|
2868
|
+
let(:criteria) do
|
2869
|
+
Doctor.only(:_id)
|
2870
|
+
end
|
2807
2871
|
|
2808
|
-
|
2809
|
-
|
2872
|
+
it "adds _type to the fields" do
|
2873
|
+
expect(criteria.options[:fields]).to include("_type")
|
2874
|
+
end
|
2810
2875
|
end
|
2811
2876
|
|
2812
|
-
|
2813
|
-
|
2877
|
+
context "when setting a custom discriminator key" do
|
2878
|
+
before do
|
2879
|
+
Person.discriminator_key = "dkey"
|
2880
|
+
end
|
2881
|
+
|
2882
|
+
after do
|
2883
|
+
Person.discriminator_key = nil
|
2884
|
+
end
|
2885
|
+
|
2886
|
+
let(:criteria) do
|
2887
|
+
Doctor.only(:_id)
|
2888
|
+
end
|
2889
|
+
|
2890
|
+
it "adds custom discriminator key to the fields" do
|
2891
|
+
expect(criteria.options[:fields]).to include("dkey")
|
2892
|
+
end
|
2893
|
+
|
2894
|
+
it "does not add _type to the fields" do
|
2895
|
+
expect(criteria.options[:fields]).to_not include("_type")
|
2896
|
+
end
|
2814
2897
|
end
|
2815
2898
|
end
|
2816
2899
|
|
@@ -3386,34 +3469,75 @@ describe Mongoid::Criteria do
|
|
3386
3469
|
end
|
3387
3470
|
|
3388
3471
|
describe "#type" do
|
3472
|
+
context "when using the default discriminator_key" do
|
3473
|
+
context "when the type is a string" do
|
3389
3474
|
|
3390
|
-
|
3475
|
+
let!(:browser) do
|
3476
|
+
Browser.create
|
3477
|
+
end
|
3391
3478
|
|
3392
|
-
|
3393
|
-
|
3394
|
-
|
3479
|
+
let(:criteria) do
|
3480
|
+
Canvas.all.type("Browser")
|
3481
|
+
end
|
3395
3482
|
|
3396
|
-
|
3397
|
-
|
3483
|
+
it "returns documents with the provided type" do
|
3484
|
+
expect(criteria).to eq([ browser ])
|
3485
|
+
end
|
3398
3486
|
end
|
3399
3487
|
|
3400
|
-
|
3401
|
-
|
3488
|
+
context "when the type is an Array of type" do
|
3489
|
+
|
3490
|
+
let!(:browser) do
|
3491
|
+
Firefox.create
|
3492
|
+
end
|
3493
|
+
|
3494
|
+
let(:criteria) do
|
3495
|
+
Canvas.all.type([ "Browser", "Firefox" ])
|
3496
|
+
end
|
3497
|
+
|
3498
|
+
it "returns documents with the provided types" do
|
3499
|
+
expect(criteria).to eq([ browser ])
|
3500
|
+
end
|
3402
3501
|
end
|
3403
3502
|
end
|
3404
3503
|
|
3405
|
-
context "when
|
3504
|
+
context "when using a custom discriminator_key" do
|
3505
|
+
before do
|
3506
|
+
Canvas.discriminator_key = "dkey"
|
3507
|
+
end
|
3406
3508
|
|
3407
|
-
|
3408
|
-
|
3509
|
+
after do
|
3510
|
+
Canvas.discriminator_key = nil
|
3409
3511
|
end
|
3410
3512
|
|
3411
|
-
|
3412
|
-
|
3513
|
+
context "when the type is a string" do
|
3514
|
+
|
3515
|
+
let!(:browser) do
|
3516
|
+
Browser.create
|
3517
|
+
end
|
3518
|
+
|
3519
|
+
let(:criteria) do
|
3520
|
+
Canvas.all.type("Browser")
|
3521
|
+
end
|
3522
|
+
|
3523
|
+
it "returns documents with the provided type" do
|
3524
|
+
expect(criteria).to eq([ browser ])
|
3525
|
+
end
|
3413
3526
|
end
|
3414
3527
|
|
3415
|
-
|
3416
|
-
|
3528
|
+
context "when the type is an Array of type" do
|
3529
|
+
|
3530
|
+
let!(:browser) do
|
3531
|
+
Firefox.create
|
3532
|
+
end
|
3533
|
+
|
3534
|
+
let(:criteria) do
|
3535
|
+
Canvas.all.type([ "Browser", "Firefox" ])
|
3536
|
+
end
|
3537
|
+
|
3538
|
+
it "returns documents with the provided types" do
|
3539
|
+
expect(criteria).to eq([ browser ])
|
3540
|
+
end
|
3417
3541
|
end
|
3418
3542
|
end
|
3419
3543
|
end
|
@@ -3428,6 +3552,38 @@ describe Mongoid::Criteria do
|
|
3428
3552
|
Band.create(name: "Tool")
|
3429
3553
|
end
|
3430
3554
|
|
3555
|
+
context 'when provided no arguments' do
|
3556
|
+
context 'on a model class' do
|
3557
|
+
it 'returns an empty criteria' do
|
3558
|
+
Band.where.selector.should == {}
|
3559
|
+
end
|
3560
|
+
end
|
3561
|
+
|
3562
|
+
context 'on an association' do
|
3563
|
+
it 'returns an empty criteria' do
|
3564
|
+
match.records.where.selector.should == {}
|
3565
|
+
end
|
3566
|
+
end
|
3567
|
+
end
|
3568
|
+
|
3569
|
+
context 'when provided multiple arguments' do
|
3570
|
+
context 'on a model class' do
|
3571
|
+
it 'raises ArgumentError' do
|
3572
|
+
lambda do
|
3573
|
+
Band.where({foo: 1}, {bar: 2})
|
3574
|
+
end.should raise_error(ArgumentError, /where requires zero or one arguments/)
|
3575
|
+
end
|
3576
|
+
end
|
3577
|
+
|
3578
|
+
context 'on an association' do
|
3579
|
+
it 'raises ArgumentError' do
|
3580
|
+
lambda do
|
3581
|
+
match.records.where({foo: 1}, {bar: 2})
|
3582
|
+
end.should raise_error(ArgumentError, /where requires zero or one arguments/)
|
3583
|
+
end
|
3584
|
+
end
|
3585
|
+
end
|
3586
|
+
|
3431
3587
|
context "when provided a string" do
|
3432
3588
|
|
3433
3589
|
context "when the criteria is embedded" do
|
@@ -3502,7 +3658,8 @@ describe Mongoid::Criteria do
|
|
3502
3658
|
end
|
3503
3659
|
end
|
3504
3660
|
|
3505
|
-
context "when querying on a BSON::Decimal128"
|
3661
|
+
context "when querying on a BSON::Decimal128" do
|
3662
|
+
min_server_version '3.4'
|
3506
3663
|
|
3507
3664
|
let(:decimal) do
|
3508
3665
|
BSON::Decimal128.new("0.0005")
|
@@ -3590,6 +3747,7 @@ describe Mongoid::Criteria do
|
|
3590
3747
|
end
|
3591
3748
|
|
3592
3749
|
context "when the code has scope" do
|
3750
|
+
max_server_version '4.2'
|
3593
3751
|
|
3594
3752
|
let(:criteria) do
|
3595
3753
|
Band.for_js("this.name == param", param: "Depeche Mode")
|
@@ -3701,7 +3859,7 @@ describe Mongoid::Criteria do
|
|
3701
3859
|
end
|
3702
3860
|
end
|
3703
3861
|
|
3704
|
-
describe "#
|
3862
|
+
describe "#geo_spatial" do
|
3705
3863
|
|
3706
3864
|
context "when checking within a polygon" do
|
3707
3865
|
|
@@ -3714,7 +3872,7 @@ describe Mongoid::Criteria do
|
|
3714
3872
|
end
|
3715
3873
|
|
3716
3874
|
let(:criteria) do
|
3717
|
-
Bar.
|
3875
|
+
Bar.geo_spatial(
|
3718
3876
|
:location.within_polygon => [[[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ], [ 50, 10 ]]]
|
3719
3877
|
)
|
3720
3878
|
end
|
@@ -3798,34 +3956,75 @@ describe Mongoid::Criteria do
|
|
3798
3956
|
end
|
3799
3957
|
|
3800
3958
|
describe "#type_selection" do
|
3959
|
+
context "when using the default discriminator_key" do
|
3960
|
+
context "when only one subclass exists" do
|
3801
3961
|
|
3802
|
-
|
3962
|
+
let(:criteria) do
|
3963
|
+
described_class.new(Firefox)
|
3964
|
+
end
|
3803
3965
|
|
3804
|
-
|
3805
|
-
|
3806
|
-
|
3966
|
+
let(:selection) do
|
3967
|
+
criteria.send(:type_selection)
|
3968
|
+
end
|
3807
3969
|
|
3808
|
-
|
3809
|
-
|
3970
|
+
it "does not use an $in query" do
|
3971
|
+
expect(selection).to eq({ _type: "Firefox" })
|
3972
|
+
end
|
3810
3973
|
end
|
3811
3974
|
|
3812
|
-
|
3813
|
-
|
3975
|
+
context "when more than one subclass exists" do
|
3976
|
+
|
3977
|
+
let(:criteria) do
|
3978
|
+
described_class.new(Browser)
|
3979
|
+
end
|
3980
|
+
|
3981
|
+
let(:selection) do
|
3982
|
+
criteria.send(:type_selection)
|
3983
|
+
end
|
3984
|
+
|
3985
|
+
it "does not use an $in query" do
|
3986
|
+
expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
|
3987
|
+
end
|
3814
3988
|
end
|
3815
3989
|
end
|
3816
3990
|
|
3817
|
-
context "when
|
3991
|
+
context "when using a custom discriminator_key" do
|
3992
|
+
before do
|
3993
|
+
Canvas.discriminator_key = "dkey"
|
3994
|
+
end
|
3818
3995
|
|
3819
|
-
|
3820
|
-
|
3996
|
+
after do
|
3997
|
+
Canvas.discriminator_key = nil
|
3821
3998
|
end
|
3822
3999
|
|
3823
|
-
|
3824
|
-
|
4000
|
+
context "when only one subclass exists" do
|
4001
|
+
|
4002
|
+
let(:criteria) do
|
4003
|
+
described_class.new(Firefox)
|
4004
|
+
end
|
4005
|
+
|
4006
|
+
let(:selection) do
|
4007
|
+
criteria.send(:type_selection)
|
4008
|
+
end
|
4009
|
+
|
4010
|
+
it "does not use an $in query" do
|
4011
|
+
expect(selection).to eq({ dkey: "Firefox" })
|
4012
|
+
end
|
3825
4013
|
end
|
3826
4014
|
|
3827
|
-
|
3828
|
-
|
4015
|
+
context "when more than one subclass exists" do
|
4016
|
+
|
4017
|
+
let(:criteria) do
|
4018
|
+
described_class.new(Browser)
|
4019
|
+
end
|
4020
|
+
|
4021
|
+
let(:selection) do
|
4022
|
+
criteria.send(:type_selection)
|
4023
|
+
end
|
4024
|
+
|
4025
|
+
it "does not use an $in query" do
|
4026
|
+
expect(selection).to eq({ dkey: { "$in" => [ "Firefox", "Browser" ]}})
|
4027
|
+
end
|
3829
4028
|
end
|
3830
4029
|
end
|
3831
4030
|
end
|