mongoid 7.5.0 → 8.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +3 -3
- data/lib/config/locales/en.yml +47 -30
- data/lib/mongoid/association/accessors.rb +38 -9
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +53 -13
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +50 -28
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +2 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +5 -5
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +14 -3
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +66 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -28
- data/lib/mongoid/association/referenced/has_many/proxy.rb +24 -18
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/attributes/dynamic.rb +3 -3
- data/lib/mongoid/attributes/nested.rb +5 -5
- data/lib/mongoid/attributes/processing.rb +10 -3
- data/lib/mongoid/attributes/projector.rb +1 -1
- data/lib/mongoid/attributes/readonly.rb +2 -2
- data/lib/mongoid/attributes.rb +43 -40
- data/lib/mongoid/changeable.rb +42 -7
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/validators/storage.rb +3 -3
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config.rb +27 -17
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +59 -32
- data/lib/mongoid/contextual/mongo.rb +184 -256
- data/lib/mongoid/contextual/none.rb +34 -16
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +7 -4
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -2
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/key.rb +3 -3
- data/lib/mongoid/criteria/queryable/optional.rb +5 -11
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +5 -27
- data/lib/mongoid/criteria/queryable/selector.rb +92 -7
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria.rb +15 -37
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +98 -36
- data/lib/mongoid/equality.rb +12 -12
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +9 -7
- data/lib/mongoid/extensions/big_decimal.rb +29 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +13 -6
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +8 -6
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +2 -2
- data/lib/mongoid/fields/standard.rb +7 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +57 -15
- data/lib/mongoid/findable.rb +28 -22
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +73 -13
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher.rb +12 -7
- data/lib/mongoid/persistable/creatable.rb +18 -9
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +2 -2
- data/lib/mongoid/persistable/unsettable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +19 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistable.rb +3 -3
- data/lib/mongoid/persistence_context.rb +22 -5
- data/lib/mongoid/query_cache.rb +8 -260
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/scopable.rb +17 -15
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +10 -6
- data/lib/mongoid/stateful.rb +35 -9
- data/lib/mongoid/tasks/database.rb +0 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +9 -9
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +4 -3
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +6 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +3 -4
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -12
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +1 -15
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +524 -27
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +32 -2
- data/spec/mongoid/config_spec.rb +58 -13
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +521 -14
- data/spec/mongoid/contextual/mongo_spec.rb +564 -394
- data/spec/mongoid/contextual/none_spec.rb +11 -19
- data/spec/mongoid/copyable_spec.rb +451 -1
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
- data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
- data/spec/mongoid/criteria_spec.rb +469 -1201
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/equality_spec.rb +12 -12
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -0
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +64 -29
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +39 -20
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +54 -16
- data/spec/mongoid/shardable_spec.rb +14 -0
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +30 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +0 -0
- metadata +49 -13
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -44,39 +44,6 @@ describe Mongoid::Contextual::Mongo do
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
describe "#cached?" do
|
48
|
-
|
49
|
-
context "when the criteria is cached" do
|
50
|
-
|
51
|
-
let(:criteria) do
|
52
|
-
Band.all.cache
|
53
|
-
end
|
54
|
-
|
55
|
-
let(:context) do
|
56
|
-
described_class.new(criteria)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "returns true" do
|
60
|
-
expect(context).to be_cached
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context "when the criteria is not cached" do
|
65
|
-
|
66
|
-
let(:criteria) do
|
67
|
-
Band.all
|
68
|
-
end
|
69
|
-
|
70
|
-
let(:context) do
|
71
|
-
described_class.new(criteria)
|
72
|
-
end
|
73
|
-
|
74
|
-
it "returns false" do
|
75
|
-
expect(context).to_not be_cached
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
47
|
describe "#count" do
|
81
48
|
|
82
49
|
let!(:depeche) do
|
@@ -102,15 +69,17 @@ describe Mongoid::Contextual::Mongo do
|
|
102
69
|
end
|
103
70
|
end
|
104
71
|
|
105
|
-
context "when
|
72
|
+
context "when the query cache is enabled" do
|
73
|
+
query_cache_enabled
|
106
74
|
|
107
75
|
let(:context) do
|
108
|
-
described_class.new(criteria
|
76
|
+
described_class.new(criteria)
|
109
77
|
end
|
110
78
|
|
111
|
-
it "
|
112
|
-
|
113
|
-
|
79
|
+
it "only executes the count query once" do
|
80
|
+
expect_query(1) do
|
81
|
+
2.times { expect(context.count).to eq(1) }
|
82
|
+
end
|
114
83
|
end
|
115
84
|
end
|
116
85
|
|
@@ -217,16 +186,18 @@ describe Mongoid::Contextual::Mongo do
|
|
217
186
|
end
|
218
187
|
end
|
219
188
|
|
220
|
-
context "when
|
189
|
+
context "when the query cache is enabled" do
|
190
|
+
query_cache_enabled
|
221
191
|
|
222
192
|
let(:context) do
|
223
|
-
described_class.new(criteria
|
193
|
+
described_class.new(criteria)
|
224
194
|
end
|
225
195
|
|
226
|
-
it "
|
227
|
-
|
228
|
-
|
229
|
-
|
196
|
+
it "the results are not cached" do
|
197
|
+
expect_query(2) do
|
198
|
+
2.times do
|
199
|
+
context.estimated_count
|
200
|
+
end
|
230
201
|
end
|
231
202
|
end
|
232
203
|
end
|
@@ -561,8 +532,22 @@ describe Mongoid::Contextual::Mongo do
|
|
561
532
|
context "when legacy_pluck_distinct is set" do
|
562
533
|
config_override :legacy_pluck_distinct, true
|
563
534
|
|
564
|
-
|
565
|
-
|
535
|
+
context 'when storing BigDecimal as string' do
|
536
|
+
config_override :map_big_decimal_to_decimal128, false
|
537
|
+
|
538
|
+
it "returns the non-demongoized distinct field values" do
|
539
|
+
expect(context.distinct(:sales).sort).to eq([ "1E2", "2E3" ])
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
context 'when storing BigDecimal as decimal128' do
|
544
|
+
config_override :map_big_decimal_to_decimal128, true
|
545
|
+
min_bson_version '4.15.0'
|
546
|
+
max_bson_version '4.99.99'
|
547
|
+
|
548
|
+
it "returns the non-demongoized distinct field values" do
|
549
|
+
expect(context.distinct(:sales).sort).to eq([ BSON::Decimal128.new("1E2"), BSON::Decimal128.new("2E3") ])
|
550
|
+
end
|
566
551
|
end
|
567
552
|
end
|
568
553
|
|
@@ -584,10 +569,6 @@ describe Mongoid::Contextual::Mongo do
|
|
584
569
|
d.save!
|
585
570
|
end
|
586
571
|
|
587
|
-
after do
|
588
|
-
I18n.locale = :en
|
589
|
-
end
|
590
|
-
|
591
572
|
let(:criteria) do
|
592
573
|
Dictionary.criteria
|
593
574
|
end
|
@@ -688,10 +669,6 @@ describe Mongoid::Contextual::Mongo do
|
|
688
669
|
I18n.fallbacks = prev_fallbacks
|
689
670
|
end
|
690
671
|
|
691
|
-
after do
|
692
|
-
I18n.locale = :en
|
693
|
-
end
|
694
|
-
|
695
672
|
let(:distinct) do
|
696
673
|
context.distinct(:description).first
|
697
674
|
end
|
@@ -727,10 +704,6 @@ describe Mongoid::Contextual::Mongo do
|
|
727
704
|
Person.create!(passport: p, employer_id: 12345)
|
728
705
|
end
|
729
706
|
|
730
|
-
after do
|
731
|
-
I18n.locale = :en
|
732
|
-
end
|
733
|
-
|
734
707
|
let(:criteria) do
|
735
708
|
Person.where(employer_id: 12345)
|
736
709
|
end
|
@@ -794,9 +767,11 @@ describe Mongoid::Contextual::Mongo do
|
|
794
767
|
|
795
768
|
context "when legacy_pluck_distinct is set" do
|
796
769
|
config_override :legacy_pluck_distinct, true
|
770
|
+
config_override :map_big_decimal_to_decimal128, true
|
771
|
+
max_bson_version '4.99.99'
|
797
772
|
|
798
773
|
it "returns the distinct matching fields" do
|
799
|
-
expect(context.distinct("label.sales")).to eq([
|
774
|
+
expect(context.distinct("label.sales")).to eq([ BSON::Decimal128.new('1E+2') ])
|
800
775
|
end
|
801
776
|
end
|
802
777
|
|
@@ -809,6 +784,435 @@ describe Mongoid::Contextual::Mongo do
|
|
809
784
|
end
|
810
785
|
end
|
811
786
|
|
787
|
+
describe "#tally" do
|
788
|
+
let(:fans1) { [ Fanatic.new(age:1), Fanatic.new(age:2) ] }
|
789
|
+
let(:fans2) { [ Fanatic.new(age:1), Fanatic.new(age:2) ] }
|
790
|
+
let(:fans3) { [ Fanatic.new(age:1), Fanatic.new(age:3) ] }
|
791
|
+
|
792
|
+
let(:genres1) { [ { x: 1, y: { z: 1 } }, { x: 2, y: { z: 2 } }, { y: 3 } ]}
|
793
|
+
let(:genres2) { [ { x: 1, y: { z: 1 } }, { x: 2, y: { z: 2 } }, { y: 4 } ]}
|
794
|
+
let(:genres3) { [ { x: 1, y: { z: 1 } }, { x: 3, y: { z: 3 } }, { y: 5 } ]}
|
795
|
+
|
796
|
+
let(:label1) { Label.new(name: "Atlantic") }
|
797
|
+
let(:label2) { Label.new(name: "Atlantic") }
|
798
|
+
let(:label3) { Label.new(name: "Columbia") }
|
799
|
+
|
800
|
+
before do
|
801
|
+
Band.create!(origin: "tally", name: "Depeche Mode", years: 30, sales: "1E2", label: label1, genres: genres1)
|
802
|
+
Band.create!(origin: "tally", name: "New Order", years: 30, sales: "2E3", label: label2, genres: genres2)
|
803
|
+
Band.create!(origin: "tally", name: "10,000 Maniacs", years: 30, sales: "1E2", label: label3, genres: genres3)
|
804
|
+
Band.create!(origin: "tally2", fanatics: fans1, genres: [1, 2])
|
805
|
+
Band.create!(origin: "tally2", fanatics: fans2, genres: [1, 2])
|
806
|
+
Band.create!(origin: "tally2", fanatics: fans3, genres: [1, 3])
|
807
|
+
end
|
808
|
+
|
809
|
+
let(:criteria) { Band.where(origin: "tally") }
|
810
|
+
|
811
|
+
context "when tallying a string" do
|
812
|
+
let(:tally) do
|
813
|
+
criteria.tally(:name)
|
814
|
+
end
|
815
|
+
|
816
|
+
it "returns the correct hash" do
|
817
|
+
expect(tally).to eq("Depeche Mode" => 1, "New Order" => 1, "10,000 Maniacs" => 1)
|
818
|
+
end
|
819
|
+
end
|
820
|
+
|
821
|
+
context "using an aliased field" do
|
822
|
+
let(:tally) do
|
823
|
+
criteria.tally(:years)
|
824
|
+
end
|
825
|
+
|
826
|
+
it "returns the correct hash" do
|
827
|
+
expect(tally).to eq(30 => 3)
|
828
|
+
end
|
829
|
+
end
|
830
|
+
|
831
|
+
context "when tallying a demongoizable field" do
|
832
|
+
let(:tally) do
|
833
|
+
criteria.tally(:sales)
|
834
|
+
end
|
835
|
+
|
836
|
+
it "returns the correct hash" do
|
837
|
+
expect(tally).to eq(BigDecimal("1E2") => 2, BigDecimal("2E3") => 1)
|
838
|
+
end
|
839
|
+
end
|
840
|
+
|
841
|
+
context "when tallying a localized field" do
|
842
|
+
before do
|
843
|
+
I18n.locale = :en
|
844
|
+
d1 = Dictionary.create!(description: 'en1')
|
845
|
+
d2 = Dictionary.create!(description: 'en1')
|
846
|
+
d3 = Dictionary.create!(description: 'en1')
|
847
|
+
d4 = Dictionary.create!(description: 'en2')
|
848
|
+
I18n.locale = :de
|
849
|
+
d1.description = 'de1'
|
850
|
+
d2.description = 'de1'
|
851
|
+
d3.description = 'de2'
|
852
|
+
d4.description = 'de3'
|
853
|
+
d1.save!
|
854
|
+
d2.save!
|
855
|
+
d3.save!
|
856
|
+
d4.save!
|
857
|
+
|
858
|
+
I18n.locale = :en
|
859
|
+
end
|
860
|
+
|
861
|
+
context "when getting the demongoized field" do
|
862
|
+
let(:tallied) do
|
863
|
+
Dictionary.tally(:description)
|
864
|
+
end
|
865
|
+
|
866
|
+
it "returns the translation for the current locale" do
|
867
|
+
expect(tallied).to eq("en1" => 3, "en2" => 1)
|
868
|
+
end
|
869
|
+
end
|
870
|
+
|
871
|
+
context "when getting a specific locale" do
|
872
|
+
let(:tallied) do
|
873
|
+
Dictionary.tally("description.de")
|
874
|
+
end
|
875
|
+
|
876
|
+
it "returns the translation for the the specific locale" do
|
877
|
+
expect(tallied).to eq("de1" => 2, "de2" => 1, "de3" => 1)
|
878
|
+
end
|
879
|
+
end
|
880
|
+
|
881
|
+
context "when getting the full hash" do
|
882
|
+
let(:tallied) do
|
883
|
+
Dictionary.tally("description_translations")
|
884
|
+
end
|
885
|
+
|
886
|
+
it "returns the correct hash" do
|
887
|
+
expect(tallied).to eq(
|
888
|
+
{"de" => "de1", "en" => "en1" } => 2,
|
889
|
+
{"de" => "de2", "en" => "en1" } => 1,
|
890
|
+
{"de" => "de3", "en" => "en2" } => 1
|
891
|
+
)
|
892
|
+
end
|
893
|
+
end
|
894
|
+
end
|
895
|
+
|
896
|
+
context "when tallying an embedded localized field" do
|
897
|
+
|
898
|
+
before do
|
899
|
+
I18n.locale = :en
|
900
|
+
address1a = Address.new(name: "en1")
|
901
|
+
address1b = Address.new(name: "en2")
|
902
|
+
address2a = Address.new(name: "en1")
|
903
|
+
address2b = Address.new(name: "en3")
|
904
|
+
I18n.locale = :de
|
905
|
+
address1a.name = "de1"
|
906
|
+
address1b.name = "de2"
|
907
|
+
address2a.name = "de1"
|
908
|
+
address2b.name = "de3"
|
909
|
+
Person.create!(addresses: [ address1a, address1b ])
|
910
|
+
Person.create!(addresses: [ address2a, address2b ])
|
911
|
+
|
912
|
+
I18n.locale = :en
|
913
|
+
end
|
914
|
+
|
915
|
+
context "when getting the demongoized field" do
|
916
|
+
let(:tallied) do
|
917
|
+
Person.tally("addresses.name")
|
918
|
+
end
|
919
|
+
|
920
|
+
it "returns the translation for the current locale" do
|
921
|
+
expect(tallied).to eq(
|
922
|
+
[ "en1", "en2" ] => 1,
|
923
|
+
[ "en1", "en3" ] => 1,
|
924
|
+
)
|
925
|
+
end
|
926
|
+
end
|
927
|
+
|
928
|
+
context "when getting a specific locale" do
|
929
|
+
let(:tallied) do
|
930
|
+
Person.tally("addresses.name.de")
|
931
|
+
end
|
932
|
+
|
933
|
+
it "returns the translation for the the specific locale" do
|
934
|
+
expect(tallied).to eq(
|
935
|
+
[ "de1", "de2" ] => 1,
|
936
|
+
[ "de1", "de3" ] => 1,
|
937
|
+
)
|
938
|
+
end
|
939
|
+
end
|
940
|
+
|
941
|
+
context "when getting the full hash" do
|
942
|
+
let(:tallied) do
|
943
|
+
Person.tally("addresses.name_translations")
|
944
|
+
end
|
945
|
+
|
946
|
+
it "returns the correct hash" do
|
947
|
+
expect(tallied).to eq(
|
948
|
+
[{ "de" => "de1", "en" => "en1" }, { "de" => "de2", "en" => "en2" }] => 1,
|
949
|
+
[{ "de" => "de1", "en" => "en1" }, { "de" => "de3", "en" => "en3" }] => 1,
|
950
|
+
)
|
951
|
+
end
|
952
|
+
end
|
953
|
+
|
954
|
+
end
|
955
|
+
|
956
|
+
context "when tallying an embedded field" do
|
957
|
+
let(:tally) do
|
958
|
+
criteria.tally("label.name")
|
959
|
+
end
|
960
|
+
|
961
|
+
it "returns the correct hash" do
|
962
|
+
expect(tally).to eq("Atlantic" => 2, "Columbia" => 1)
|
963
|
+
end
|
964
|
+
end
|
965
|
+
|
966
|
+
context "when tallying an element in an embeds_many field" do
|
967
|
+
let(:criteria) { Band.where(origin: "tally2") }
|
968
|
+
|
969
|
+
let(:tally) do
|
970
|
+
criteria.tally("fanatics.age")
|
971
|
+
end
|
972
|
+
|
973
|
+
it "returns the correct hash" do
|
974
|
+
expect(tally).to eq(
|
975
|
+
[1, 2] => 2,
|
976
|
+
[1, 3] => 1
|
977
|
+
)
|
978
|
+
end
|
979
|
+
end
|
980
|
+
|
981
|
+
context "when tallying an embeds_many field" do
|
982
|
+
let(:criteria) { Band.where(origin: "tally2") }
|
983
|
+
|
984
|
+
let(:tally) do
|
985
|
+
criteria.tally("fanatics")
|
986
|
+
end
|
987
|
+
|
988
|
+
it "returns the correct hash" do
|
989
|
+
expect(tally).to eq(
|
990
|
+
fans1.map(&:attributes) => 1,
|
991
|
+
fans2.map(&:attributes) => 1,
|
992
|
+
fans3.map(&:attributes) => 1,
|
993
|
+
)
|
994
|
+
end
|
995
|
+
end
|
996
|
+
|
997
|
+
context "when tallying a field of type array" do
|
998
|
+
let(:criteria) { Band.where(origin: "tally2") }
|
999
|
+
|
1000
|
+
let(:tally) do
|
1001
|
+
criteria.tally("genres")
|
1002
|
+
end
|
1003
|
+
|
1004
|
+
it "returns the correct hash" do
|
1005
|
+
expect(tally).to eq(
|
1006
|
+
[1, 2] => 2,
|
1007
|
+
[1, 3] => 1
|
1008
|
+
)
|
1009
|
+
end
|
1010
|
+
end
|
1011
|
+
|
1012
|
+
context "when tallying an element from an array of hashes" do
|
1013
|
+
let(:criteria) { Band.where(origin: "tally") }
|
1014
|
+
|
1015
|
+
let(:tally) do
|
1016
|
+
criteria.tally("genres.x")
|
1017
|
+
end
|
1018
|
+
|
1019
|
+
it "returns the correct hash without the nil keys" do
|
1020
|
+
expect(tally).to eq(
|
1021
|
+
[1, 2] => 2,
|
1022
|
+
[1, 3] => 1
|
1023
|
+
)
|
1024
|
+
end
|
1025
|
+
end
|
1026
|
+
|
1027
|
+
context "when tallying an element from an array of hashes; with duplicate" do
|
1028
|
+
|
1029
|
+
before do
|
1030
|
+
Band.create!(origin: "tally", genres: [ { x: 1 }, {x: 1} ] )
|
1031
|
+
end
|
1032
|
+
|
1033
|
+
let(:criteria) { Band.where(origin: "tally") }
|
1034
|
+
|
1035
|
+
let(:tally) do
|
1036
|
+
criteria.tally("genres.x")
|
1037
|
+
end
|
1038
|
+
|
1039
|
+
it "returns the correct hash without the nil keys" do
|
1040
|
+
expect(tally).to eq(
|
1041
|
+
[1, 2] => 2,
|
1042
|
+
[1, 3] => 1,
|
1043
|
+
[1, 1] => 1,
|
1044
|
+
)
|
1045
|
+
end
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
context "when tallying an aliased field of type array" do
|
1049
|
+
|
1050
|
+
before do
|
1051
|
+
Person.create!(array: [ 1, 2 ])
|
1052
|
+
Person.create!(array: [ 1, 3 ])
|
1053
|
+
end
|
1054
|
+
|
1055
|
+
let(:tally) do
|
1056
|
+
Person.tally("array")
|
1057
|
+
end
|
1058
|
+
|
1059
|
+
it "returns the correct hash" do
|
1060
|
+
expect(tally).to eq(
|
1061
|
+
[1, 2] => 1,
|
1062
|
+
[1, 3] => 1
|
1063
|
+
)
|
1064
|
+
end
|
1065
|
+
end
|
1066
|
+
|
1067
|
+
context "when going multiple levels deep in arrays" do
|
1068
|
+
let(:criteria) { Band.where(origin: "tally") }
|
1069
|
+
|
1070
|
+
let(:tally) do
|
1071
|
+
criteria.tally("genres.y.z")
|
1072
|
+
end
|
1073
|
+
|
1074
|
+
it "returns the correct hash" do
|
1075
|
+
expect(tally).to eq(
|
1076
|
+
[1, 2] => 2,
|
1077
|
+
[1, 3] => 1
|
1078
|
+
)
|
1079
|
+
end
|
1080
|
+
end
|
1081
|
+
|
1082
|
+
context "when going multiple levels deep in an array" do
|
1083
|
+
let(:criteria) { Band.where(origin: "tally") }
|
1084
|
+
|
1085
|
+
let(:tally) do
|
1086
|
+
criteria.tally("genres.y.z")
|
1087
|
+
end
|
1088
|
+
|
1089
|
+
it "returns the correct hash" do
|
1090
|
+
expect(tally).to eq(
|
1091
|
+
[1, 2] => 2,
|
1092
|
+
[1, 3] => 1
|
1093
|
+
)
|
1094
|
+
end
|
1095
|
+
end
|
1096
|
+
|
1097
|
+
context "when tallying deeply nested arrays/embedded associations" do
|
1098
|
+
|
1099
|
+
before do
|
1100
|
+
Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ])
|
1101
|
+
Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ])
|
1102
|
+
Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))) ])
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
let(:tally) do
|
1106
|
+
Person.tally("addresses.code.deepest.array.y.z")
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
it "returns the correct hash" do
|
1110
|
+
expect(tally).to eq(
|
1111
|
+
[ [ 1, 2 ] ] => 2,
|
1112
|
+
[ [ 1, 3 ] ] => 1
|
1113
|
+
)
|
1114
|
+
end
|
1115
|
+
end
|
1116
|
+
|
1117
|
+
context "when tallying deeply nested arrays/embedded associations" do
|
1118
|
+
|
1119
|
+
before do
|
1120
|
+
Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))),
|
1121
|
+
Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ])
|
1122
|
+
Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))),
|
1123
|
+
Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 2 } } ]))) ])
|
1124
|
+
Person.create!(addresses: [ Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))),
|
1125
|
+
Address.new(code: Code.new(deepest: Deepest.new(array: [ { y: { z: 1 } }, { y: { z: 3 } } ]))) ])
|
1126
|
+
end
|
1127
|
+
|
1128
|
+
let(:tally) do
|
1129
|
+
Person.tally("addresses.code.deepest.array.y.z")
|
1130
|
+
end
|
1131
|
+
|
1132
|
+
it "returns the correct hash" do
|
1133
|
+
expect(tally).to eq(
|
1134
|
+
[ [ 1, 2 ], [ 1, 2 ] ] => 2,
|
1135
|
+
[ [ 1, 3 ], [ 1, 3 ] ] => 1
|
1136
|
+
)
|
1137
|
+
end
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
context "when some keys are missing" do
|
1141
|
+
before do
|
1142
|
+
3.times { Band.create!(origin: "tally") }
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
let(:tally) do
|
1146
|
+
criteria.tally(:name)
|
1147
|
+
end
|
1148
|
+
|
1149
|
+
it "returns the correct hash" do
|
1150
|
+
expect(tally).to eq(
|
1151
|
+
"Depeche Mode" => 1,
|
1152
|
+
"New Order" => 1,
|
1153
|
+
"10,000 Maniacs" => 1,
|
1154
|
+
nil => 3
|
1155
|
+
)
|
1156
|
+
end
|
1157
|
+
end
|
1158
|
+
|
1159
|
+
context "when the first element is an embeds_one" do
|
1160
|
+
before do
|
1161
|
+
Person.create!(name: Name.new(translations: [ Translation.new(language: 1), Translation.new(language: 2) ]))
|
1162
|
+
Person.create!(name: Name.new(translations: [ Translation.new(language: 1), Translation.new(language: 2) ]))
|
1163
|
+
Person.create!(name: Name.new(translations: [ Translation.new(language: 1), Translation.new(language: 3) ]))
|
1164
|
+
end
|
1165
|
+
|
1166
|
+
let(:tally) do
|
1167
|
+
Person.tally("name.translations.language")
|
1168
|
+
end
|
1169
|
+
|
1170
|
+
it "returns the correct hash" do
|
1171
|
+
expect(tally).to eq(
|
1172
|
+
[1, 2] => 2,
|
1173
|
+
[1, 3] => 1
|
1174
|
+
)
|
1175
|
+
end
|
1176
|
+
end
|
1177
|
+
|
1178
|
+
context "when tallying demongoizable values from typeless fields" do
|
1179
|
+
|
1180
|
+
let!(:person1) { Person.create!(ssn: /hello/) }
|
1181
|
+
let!(:person2) { Person.create!(ssn: BSON::Decimal128.new("1")) }
|
1182
|
+
let(:tally) { Person.tally("ssn") }
|
1183
|
+
|
1184
|
+
context "< BSON 5" do
|
1185
|
+
max_bson_version '4.99.99'
|
1186
|
+
|
1187
|
+
it "stores the correct types in the database" do
|
1188
|
+
Person.find(person1.id).attributes["ssn"].should be_a BSON::Regexp::Raw
|
1189
|
+
Person.find(person2.id).attributes["ssn"].should be_a BSON::Decimal128
|
1190
|
+
end
|
1191
|
+
|
1192
|
+
it "tallies the correct type" do
|
1193
|
+
tally.keys.map(&:class).sort do |a,b|
|
1194
|
+
a.to_s <=> b.to_s
|
1195
|
+
end.should == [BSON::Decimal128, BSON::Regexp::Raw]
|
1196
|
+
end
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
context ">= BSON 5" do
|
1200
|
+
min_bson_version "5.0"
|
1201
|
+
|
1202
|
+
it "stores the correct types in the database" do
|
1203
|
+
Person.find(person1.id).ssn.should be_a BSON::Regexp::Raw
|
1204
|
+
Person.find(person2.id).ssn.should be_a BigDeimal
|
1205
|
+
end
|
1206
|
+
|
1207
|
+
it "tallies the correct type" do
|
1208
|
+
tally.keys.map(&:class).sort do |a,b|
|
1209
|
+
a.to_s <=> b.to_s
|
1210
|
+
end.should == [BigDecimal, BSON::Regexp::Raw]
|
1211
|
+
end
|
1212
|
+
end
|
1213
|
+
end
|
1214
|
+
end
|
1215
|
+
|
812
1216
|
describe "#each" do
|
813
1217
|
|
814
1218
|
before do
|
@@ -1017,51 +1421,15 @@ describe Mongoid::Contextual::Mongo do
|
|
1017
1421
|
described_class.new(criteria)
|
1018
1422
|
end
|
1019
1423
|
|
1020
|
-
context "when exists? already called" do
|
1424
|
+
context "when exists? already called and query cache is enabled" do
|
1425
|
+
query_cache_enabled
|
1021
1426
|
|
1022
1427
|
before do
|
1023
1428
|
context.exists?
|
1024
1429
|
end
|
1025
1430
|
|
1026
|
-
it "
|
1027
|
-
|
1028
|
-
expect(context).to be_exists
|
1029
|
-
end
|
1030
|
-
end
|
1031
|
-
end
|
1032
|
-
|
1033
|
-
context "when caching is enabled" do
|
1034
|
-
|
1035
|
-
let(:criteria) do
|
1036
|
-
Band.where(name: "Depeche Mode").cache
|
1037
|
-
end
|
1038
|
-
|
1039
|
-
let(:context) do
|
1040
|
-
described_class.new(criteria)
|
1041
|
-
end
|
1042
|
-
|
1043
|
-
context "when the cache is loaded" do
|
1044
|
-
|
1045
|
-
before do
|
1046
|
-
context.to_a
|
1047
|
-
end
|
1048
|
-
|
1049
|
-
it "does not hit the database" do
|
1050
|
-
expect(context).to receive(:view).never
|
1051
|
-
expect(context).to be_exists
|
1052
|
-
end
|
1053
|
-
end
|
1054
|
-
|
1055
|
-
context "when the cache is not loaded" do
|
1056
|
-
|
1057
|
-
context "when a count has been executed" do
|
1058
|
-
|
1059
|
-
before do
|
1060
|
-
context.count
|
1061
|
-
end
|
1062
|
-
|
1063
|
-
it "does not hit the database" do
|
1064
|
-
expect(context).to receive(:view).never
|
1431
|
+
it "does not hit the database again" do
|
1432
|
+
expect_no_queries do
|
1065
1433
|
expect(context).to be_exists
|
1066
1434
|
end
|
1067
1435
|
end
|
@@ -1420,7 +1788,7 @@ describe Mongoid::Contextual::Mongo do
|
|
1420
1788
|
it "deletes the document from the database" do
|
1421
1789
|
expect {
|
1422
1790
|
depeche.reload
|
1423
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
1791
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
|
1424
1792
|
end
|
1425
1793
|
|
1426
1794
|
context 'when a collation is specified on the criteria' do
|
@@ -1445,7 +1813,7 @@ describe Mongoid::Contextual::Mongo do
|
|
1445
1813
|
it "deletes the document from the database" do
|
1446
1814
|
expect {
|
1447
1815
|
depeche.reload
|
1448
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
1816
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Band with id\(s\)/)
|
1449
1817
|
end
|
1450
1818
|
end
|
1451
1819
|
end
|
@@ -1561,24 +1929,6 @@ describe Mongoid::Contextual::Mongo do
|
|
1561
1929
|
expect(context.last).to eq(rolling_stones)
|
1562
1930
|
end
|
1563
1931
|
end
|
1564
|
-
|
1565
|
-
context 'with option { id_sort: :none }' do
|
1566
|
-
let(:opts) do
|
1567
|
-
{ id_sort: :none }
|
1568
|
-
end
|
1569
|
-
|
1570
|
-
it 'applies the sort on _id' do
|
1571
|
-
expect(context.send(method, opts)).to eq(depeche_mode)
|
1572
|
-
end
|
1573
|
-
|
1574
|
-
context 'when calling #last' do
|
1575
|
-
|
1576
|
-
it 'doesn\'t apply a sort on _id' do
|
1577
|
-
expect(context.send(method, opts)).to eq(depeche_mode)
|
1578
|
-
expect(context.last(opts)).to eq(depeche_mode)
|
1579
|
-
end
|
1580
|
-
end
|
1581
|
-
end
|
1582
1932
|
end
|
1583
1933
|
|
1584
1934
|
context 'when the criteria has a sort' do
|
@@ -1602,25 +1952,6 @@ describe Mongoid::Contextual::Mongo do
|
|
1602
1952
|
expect(context.last).to eq(depeche_mode)
|
1603
1953
|
end
|
1604
1954
|
end
|
1605
|
-
|
1606
|
-
context 'with option { id_sort: :none }' do
|
1607
|
-
|
1608
|
-
let(:opts) do
|
1609
|
-
{ id_sort: :none }
|
1610
|
-
end
|
1611
|
-
|
1612
|
-
it 'uses the preexisting sort' do
|
1613
|
-
expect(context.send(method, opts)).to eq(rolling_stones)
|
1614
|
-
end
|
1615
|
-
|
1616
|
-
context 'when calling #last' do
|
1617
|
-
|
1618
|
-
it 'uses the preexisting sort' do
|
1619
|
-
expect(context.send(method, opts)).to eq(rolling_stones)
|
1620
|
-
expect(context.last(opts)).to eq(depeche_mode)
|
1621
|
-
end
|
1622
|
-
end
|
1623
|
-
end
|
1624
1955
|
end
|
1625
1956
|
|
1626
1957
|
context "when using .sort" do
|
@@ -1649,28 +1980,17 @@ describe Mongoid::Contextual::Mongo do
|
|
1649
1980
|
end
|
1650
1981
|
end
|
1651
1982
|
|
1652
|
-
context "when the
|
1983
|
+
context "when the query cache is enabled" do
|
1984
|
+
query_cache_enabled
|
1653
1985
|
|
1654
1986
|
let(:criteria) do
|
1655
|
-
Band.where(name: "Depeche Mode")
|
1987
|
+
Band.where(name: "Depeche Mode")
|
1656
1988
|
end
|
1657
1989
|
|
1658
1990
|
let(:context) do
|
1659
1991
|
described_class.new(criteria)
|
1660
1992
|
end
|
1661
1993
|
|
1662
|
-
context "when the cache is loaded" do
|
1663
|
-
|
1664
|
-
before do
|
1665
|
-
context.to_a
|
1666
|
-
end
|
1667
|
-
|
1668
|
-
it "returns the first document without touching the database" do
|
1669
|
-
expect(context).to receive(:view).never
|
1670
|
-
expect(context.send(method)).to eq(depeche_mode)
|
1671
|
-
end
|
1672
|
-
end
|
1673
|
-
|
1674
1994
|
context "when first method was called before" do
|
1675
1995
|
|
1676
1996
|
before do
|
@@ -1678,8 +1998,9 @@ describe Mongoid::Contextual::Mongo do
|
|
1678
1998
|
end
|
1679
1999
|
|
1680
2000
|
it "returns the first document without touching the database" do
|
1681
|
-
|
1682
|
-
|
2001
|
+
expect_no_queries do
|
2002
|
+
expect(context.send(method)).to eq(depeche_mode)
|
2003
|
+
end
|
1683
2004
|
end
|
1684
2005
|
end
|
1685
2006
|
end
|
@@ -1733,77 +2054,21 @@ describe Mongoid::Contextual::Mongo do
|
|
1733
2054
|
end
|
1734
2055
|
end
|
1735
2056
|
|
1736
|
-
context "when the
|
2057
|
+
context "when the query cache is enabled" do
|
1737
2058
|
|
1738
2059
|
let(:context) do
|
1739
2060
|
described_class.new(criteria)
|
1740
2061
|
end
|
1741
2062
|
|
1742
|
-
context "when
|
1743
|
-
|
1744
|
-
before do
|
1745
|
-
context.to_a
|
1746
|
-
end
|
1747
|
-
|
1748
|
-
context "when all of the documents are cached" do
|
1749
|
-
|
1750
|
-
let(:criteria) do
|
1751
|
-
Band.all.cache
|
1752
|
-
end
|
1753
|
-
|
1754
|
-
context "when requesting all of the documents" do
|
1755
|
-
|
1756
|
-
let(:docs) do
|
1757
|
-
context.send(method, 3)
|
1758
|
-
end
|
1759
|
-
|
1760
|
-
it "returns all of the documents without touching the database" do
|
1761
|
-
expect(context).to receive(:view).never
|
1762
|
-
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
1763
|
-
end
|
1764
|
-
end
|
1765
|
-
|
1766
|
-
context "when requesting fewer than all of the documents" do
|
1767
|
-
|
1768
|
-
let(:docs) do
|
1769
|
-
context.send(method, 2)
|
1770
|
-
end
|
1771
|
-
|
1772
|
-
it "returns all of the documents without touching the database" do
|
1773
|
-
expect(context).to receive(:view).never
|
1774
|
-
expect(docs).to eq([ depeche_mode, new_order ])
|
1775
|
-
end
|
1776
|
-
end
|
1777
|
-
end
|
1778
|
-
|
1779
|
-
context "when only one document is cached" do
|
1780
|
-
|
1781
|
-
let(:criteria) do
|
1782
|
-
Band.where(name: "Depeche Mode").cache
|
1783
|
-
end
|
1784
|
-
|
1785
|
-
context "when requesting one document" do
|
1786
|
-
|
1787
|
-
let(:docs) do
|
1788
|
-
context.send(method, 1)
|
1789
|
-
end
|
1790
|
-
|
1791
|
-
it "returns one document without touching the database" do
|
1792
|
-
expect(context).to receive(:view).never
|
1793
|
-
expect(docs).to eq([ depeche_mode ])
|
1794
|
-
end
|
1795
|
-
end
|
1796
|
-
end
|
1797
|
-
end
|
1798
|
-
|
1799
|
-
context "when the first method was called before" do
|
2063
|
+
context "when calling first beforehand" do
|
2064
|
+
query_cache_enabled
|
1800
2065
|
|
1801
2066
|
let(:context) do
|
1802
2067
|
described_class.new(criteria)
|
1803
2068
|
end
|
1804
2069
|
|
1805
2070
|
let(:criteria) do
|
1806
|
-
Band.all
|
2071
|
+
Band.all
|
1807
2072
|
end
|
1808
2073
|
|
1809
2074
|
before do
|
@@ -1821,8 +2086,9 @@ describe Mongoid::Contextual::Mongo do
|
|
1821
2086
|
let(:limit) { 3 }
|
1822
2087
|
|
1823
2088
|
it "returns all documents without touching the database" do
|
1824
|
-
|
1825
|
-
|
2089
|
+
expect_no_queries do
|
2090
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
2091
|
+
end
|
1826
2092
|
end
|
1827
2093
|
end
|
1828
2094
|
|
@@ -1830,8 +2096,9 @@ describe Mongoid::Contextual::Mongo do
|
|
1830
2096
|
let(:limit) { 2 }
|
1831
2097
|
|
1832
2098
|
it "returns the correct documents without touching the database" do
|
1833
|
-
|
1834
|
-
|
2099
|
+
expect_no_queries do
|
2100
|
+
expect(docs).to eq([ depeche_mode, new_order ])
|
2101
|
+
end
|
1835
2102
|
end
|
1836
2103
|
end
|
1837
2104
|
end
|
@@ -1843,8 +2110,9 @@ describe Mongoid::Contextual::Mongo do
|
|
1843
2110
|
let(:limit) { 2 }
|
1844
2111
|
|
1845
2112
|
it "returns the correct documents without touching the database" do
|
1846
|
-
|
1847
|
-
|
2113
|
+
expect_no_queries do
|
2114
|
+
expect(docs).to eq([ depeche_mode, new_order ])
|
2115
|
+
end
|
1848
2116
|
end
|
1849
2117
|
end
|
1850
2118
|
|
@@ -1852,8 +2120,9 @@ describe Mongoid::Contextual::Mongo do
|
|
1852
2120
|
let(:limit) { 3 }
|
1853
2121
|
|
1854
2122
|
it "returns the correct documents and touches the database" do
|
1855
|
-
|
1856
|
-
|
2123
|
+
expect_query(1) do
|
2124
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
2125
|
+
end
|
1857
2126
|
end
|
1858
2127
|
end
|
1859
2128
|
end
|
@@ -1865,8 +2134,9 @@ describe Mongoid::Contextual::Mongo do
|
|
1865
2134
|
let(:limit) { 1 }
|
1866
2135
|
|
1867
2136
|
it "returns the correct documents without touching the database" do
|
1868
|
-
|
1869
|
-
|
2137
|
+
expect_no_queries do
|
2138
|
+
expect(docs).to eq([ depeche_mode ])
|
2139
|
+
end
|
1870
2140
|
end
|
1871
2141
|
end
|
1872
2142
|
|
@@ -1874,8 +2144,9 @@ describe Mongoid::Contextual::Mongo do
|
|
1874
2144
|
let(:limit) { 3 }
|
1875
2145
|
|
1876
2146
|
it "returns the correct documents and touches the database" do
|
1877
|
-
|
1878
|
-
|
2147
|
+
expect_query(1) do
|
2148
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
2149
|
+
end
|
1879
2150
|
end
|
1880
2151
|
end
|
1881
2152
|
end
|
@@ -1883,14 +2154,15 @@ describe Mongoid::Contextual::Mongo do
|
|
1883
2154
|
end
|
1884
2155
|
end
|
1885
2156
|
|
1886
|
-
context "when calling #first then #last" do
|
2157
|
+
context "when calling #first then #last and the query cache is enabled" do
|
2158
|
+
query_cache_enabled
|
1887
2159
|
|
1888
2160
|
let(:context) do
|
1889
2161
|
described_class.new(criteria)
|
1890
2162
|
end
|
1891
2163
|
|
1892
2164
|
let(:criteria) do
|
1893
|
-
Band.all
|
2165
|
+
Band.all
|
1894
2166
|
end
|
1895
2167
|
|
1896
2168
|
before do
|
@@ -1905,8 +2177,10 @@ describe Mongoid::Contextual::Mongo do
|
|
1905
2177
|
let(:before_limit) { 2 }
|
1906
2178
|
let(:limit) { 1 }
|
1907
2179
|
|
1908
|
-
it "gets the correct document" do
|
1909
|
-
|
2180
|
+
it "gets the correct document and hits the database" do
|
2181
|
+
expect_query(1) do
|
2182
|
+
expect(docs).to eq([rolling_stones])
|
2183
|
+
end
|
1910
2184
|
end
|
1911
2185
|
end
|
1912
2186
|
end
|
@@ -1996,30 +2270,10 @@ describe Mongoid::Contextual::Mongo do
|
|
1996
2270
|
context 'when calling #first' do
|
1997
2271
|
|
1998
2272
|
it 'returns the first document, sorted by _id' do
|
1999
|
-
pending "MONGOID-5416"
|
2000
2273
|
expect(context.last).to eq(rolling_stones)
|
2001
2274
|
expect(context.first).to eq(depeche_mode)
|
2002
2275
|
end
|
2003
2276
|
end
|
2004
|
-
|
2005
|
-
context 'with option { id_sort: :none }' do
|
2006
|
-
let(:opts) do
|
2007
|
-
{ id_sort: :none }
|
2008
|
-
end
|
2009
|
-
|
2010
|
-
it 'doesn\'t apply the sort on _id' do
|
2011
|
-
expect(context.last(opts)).to eq(depeche_mode)
|
2012
|
-
end
|
2013
|
-
|
2014
|
-
context 'when calling #first' do
|
2015
|
-
|
2016
|
-
it 'doesn\'t apply the sort on _id' do
|
2017
|
-
pending "MONGOID-5416"
|
2018
|
-
expect(context.last(opts)).to eq(rolling_stones)
|
2019
|
-
expect(context.first(opts)).to eq(depeche_mode)
|
2020
|
-
end
|
2021
|
-
end
|
2022
|
-
end
|
2023
2277
|
end
|
2024
2278
|
|
2025
2279
|
context 'when the criteria has a sort' do
|
@@ -2044,25 +2298,6 @@ describe Mongoid::Contextual::Mongo do
|
|
2044
2298
|
expect(context.first).to eq(rolling_stones)
|
2045
2299
|
end
|
2046
2300
|
end
|
2047
|
-
|
2048
|
-
context 'with option { id_sort: :none }' do
|
2049
|
-
|
2050
|
-
let(:opts) do
|
2051
|
-
{ id_sort: :none }
|
2052
|
-
end
|
2053
|
-
|
2054
|
-
it 'uses the preexisting sort' do
|
2055
|
-
expect(context.last(opts)).to eq(depeche_mode)
|
2056
|
-
end
|
2057
|
-
|
2058
|
-
context 'when calling #first' do
|
2059
|
-
|
2060
|
-
it 'uses the preexisting sort' do
|
2061
|
-
expect(context.last(opts)).to eq(depeche_mode)
|
2062
|
-
expect(context.first(opts)).to eq(rolling_stones)
|
2063
|
-
end
|
2064
|
-
end
|
2065
|
-
end
|
2066
2301
|
end
|
2067
2302
|
|
2068
2303
|
context "when using .sort" do
|
@@ -2091,28 +2326,17 @@ describe Mongoid::Contextual::Mongo do
|
|
2091
2326
|
end
|
2092
2327
|
end
|
2093
2328
|
|
2094
|
-
context "when the
|
2329
|
+
context "when the query cache is enabled" do
|
2330
|
+
query_cache_enabled
|
2095
2331
|
|
2096
2332
|
let(:criteria) do
|
2097
|
-
Band.where(name: "Depeche Mode")
|
2333
|
+
Band.where(name: "Depeche Mode")
|
2098
2334
|
end
|
2099
2335
|
|
2100
2336
|
let(:context) do
|
2101
2337
|
described_class.new(criteria)
|
2102
2338
|
end
|
2103
2339
|
|
2104
|
-
context "when the cache is loaded" do
|
2105
|
-
|
2106
|
-
before do
|
2107
|
-
context.to_a
|
2108
|
-
end
|
2109
|
-
|
2110
|
-
it "returns the last document without touching the database" do
|
2111
|
-
expect(context).to receive(:view).never
|
2112
|
-
expect(context.last).to eq(depeche_mode)
|
2113
|
-
end
|
2114
|
-
end
|
2115
|
-
|
2116
2340
|
context "when last method was called before" do
|
2117
2341
|
|
2118
2342
|
before do
|
@@ -2120,8 +2344,9 @@ describe Mongoid::Contextual::Mongo do
|
|
2120
2344
|
end
|
2121
2345
|
|
2122
2346
|
it "returns the last document without touching the database" do
|
2123
|
-
|
2124
|
-
|
2347
|
+
expect_no_queries do
|
2348
|
+
expect(context.last).to eq(depeche_mode)
|
2349
|
+
end
|
2125
2350
|
end
|
2126
2351
|
end
|
2127
2352
|
end
|
@@ -2181,71 +2406,15 @@ describe Mongoid::Contextual::Mongo do
|
|
2181
2406
|
described_class.new(criteria)
|
2182
2407
|
end
|
2183
2408
|
|
2184
|
-
context "when
|
2185
|
-
|
2186
|
-
before do
|
2187
|
-
context.to_a
|
2188
|
-
end
|
2189
|
-
|
2190
|
-
context "when all of the documents are cached" do
|
2191
|
-
|
2192
|
-
let(:criteria) do
|
2193
|
-
Band.all.cache
|
2194
|
-
end
|
2195
|
-
|
2196
|
-
context "when requesting all of the documents" do
|
2197
|
-
|
2198
|
-
let(:docs) do
|
2199
|
-
context.last(3)
|
2200
|
-
end
|
2201
|
-
|
2202
|
-
it "returns all of the documents without touching the database" do
|
2203
|
-
expect(context).to receive(:view).never
|
2204
|
-
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
2205
|
-
end
|
2206
|
-
end
|
2207
|
-
|
2208
|
-
context "when requesting fewer than all of the documents" do
|
2209
|
-
|
2210
|
-
let(:docs) do
|
2211
|
-
context.last(2)
|
2212
|
-
end
|
2213
|
-
|
2214
|
-
it "returns all of the documents without touching the database" do
|
2215
|
-
expect(context).to receive(:view).never
|
2216
|
-
expect(docs).to eq([ new_order, rolling_stones ])
|
2217
|
-
end
|
2218
|
-
end
|
2219
|
-
end
|
2220
|
-
|
2221
|
-
context "when only one document is cached" do
|
2222
|
-
|
2223
|
-
let(:criteria) do
|
2224
|
-
Band.where(name: "Depeche Mode").cache
|
2225
|
-
end
|
2226
|
-
|
2227
|
-
context "when requesting one document" do
|
2228
|
-
|
2229
|
-
let(:docs) do
|
2230
|
-
context.last(1)
|
2231
|
-
end
|
2232
|
-
|
2233
|
-
it "returns one document without touching the database" do
|
2234
|
-
expect(context).to receive(:view).never
|
2235
|
-
expect(docs).to eq([ depeche_mode ])
|
2236
|
-
end
|
2237
|
-
end
|
2238
|
-
end
|
2239
|
-
end
|
2240
|
-
|
2241
|
-
context "when the last method was called before" do
|
2409
|
+
context "when query cache is enabled" do
|
2410
|
+
query_cache_enabled
|
2242
2411
|
|
2243
2412
|
let(:context) do
|
2244
2413
|
described_class.new(criteria)
|
2245
2414
|
end
|
2246
2415
|
|
2247
2416
|
let(:criteria) do
|
2248
|
-
Band.all
|
2417
|
+
Band.all
|
2249
2418
|
end
|
2250
2419
|
|
2251
2420
|
before do
|
@@ -2262,18 +2431,20 @@ describe Mongoid::Contextual::Mongo do
|
|
2262
2431
|
context "when getting all of the documents" do
|
2263
2432
|
let(:limit) { 3 }
|
2264
2433
|
|
2265
|
-
it "returns all documents without touching the
|
2266
|
-
|
2267
|
-
|
2434
|
+
it "returns all documents without touching the db" do
|
2435
|
+
expect_no_queries do
|
2436
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
2437
|
+
end
|
2268
2438
|
end
|
2269
2439
|
end
|
2270
2440
|
|
2271
2441
|
context "when getting fewer documents" do
|
2272
2442
|
let(:limit) { 2 }
|
2273
2443
|
|
2274
|
-
it "returns the correct documents without touching the
|
2275
|
-
|
2276
|
-
|
2444
|
+
it "returns the correct documents without touching the db" do
|
2445
|
+
expect_no_queries do
|
2446
|
+
expect(docs).to eq([ new_order, rolling_stones ])
|
2447
|
+
end
|
2277
2448
|
end
|
2278
2449
|
end
|
2279
2450
|
end
|
@@ -2284,9 +2455,10 @@ describe Mongoid::Contextual::Mongo do
|
|
2284
2455
|
context "when getting the same number of documents" do
|
2285
2456
|
let(:limit) { 2 }
|
2286
2457
|
|
2287
|
-
it "returns the correct documents without touching the
|
2288
|
-
|
2289
|
-
|
2458
|
+
it "returns the correct documents without touching the db" do
|
2459
|
+
expect_no_queries do
|
2460
|
+
expect(docs).to eq([ new_order, rolling_stones ])
|
2461
|
+
end
|
2290
2462
|
end
|
2291
2463
|
end
|
2292
2464
|
|
@@ -2294,8 +2466,9 @@ describe Mongoid::Contextual::Mongo do
|
|
2294
2466
|
let(:limit) { 3 }
|
2295
2467
|
|
2296
2468
|
it "returns the correct documents and touches the database" do
|
2297
|
-
|
2298
|
-
|
2469
|
+
expect_query(1) do
|
2470
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
2471
|
+
end
|
2299
2472
|
end
|
2300
2473
|
end
|
2301
2474
|
end
|
@@ -2307,8 +2480,9 @@ describe Mongoid::Contextual::Mongo do
|
|
2307
2480
|
let(:limit) { 1 }
|
2308
2481
|
|
2309
2482
|
it "returns the correct documents without touching the database" do
|
2310
|
-
|
2311
|
-
|
2483
|
+
expect_no_queries do
|
2484
|
+
expect(docs).to eq([ rolling_stones ])
|
2485
|
+
end
|
2312
2486
|
end
|
2313
2487
|
end
|
2314
2488
|
|
@@ -2316,8 +2490,9 @@ describe Mongoid::Contextual::Mongo do
|
|
2316
2490
|
let(:limit) { 3 }
|
2317
2491
|
|
2318
2492
|
it "returns the correct documents and touches the database" do
|
2319
|
-
|
2320
|
-
|
2493
|
+
expect_query(1) do
|
2494
|
+
expect(docs).to eq([ depeche_mode, new_order, rolling_stones ])
|
2495
|
+
end
|
2321
2496
|
end
|
2322
2497
|
end
|
2323
2498
|
end
|
@@ -2325,14 +2500,15 @@ describe Mongoid::Contextual::Mongo do
|
|
2325
2500
|
end
|
2326
2501
|
end
|
2327
2502
|
|
2328
|
-
context "when calling #last then #first" do
|
2503
|
+
context "when calling #last then #first and the query cache is enabled" do
|
2504
|
+
query_cache_enabled
|
2329
2505
|
|
2330
2506
|
let(:context) do
|
2331
2507
|
described_class.new(criteria)
|
2332
2508
|
end
|
2333
2509
|
|
2334
2510
|
let(:criteria) do
|
2335
|
-
Band.all
|
2511
|
+
Band.all
|
2336
2512
|
end
|
2337
2513
|
|
2338
2514
|
before do
|
@@ -2348,12 +2524,12 @@ describe Mongoid::Contextual::Mongo do
|
|
2348
2524
|
let(:limit) { 1 }
|
2349
2525
|
|
2350
2526
|
it "hits the database" do
|
2351
|
-
|
2352
|
-
|
2527
|
+
expect_query(1) do
|
2528
|
+
docs
|
2529
|
+
end
|
2353
2530
|
end
|
2354
2531
|
|
2355
2532
|
it "gets the correct document" do
|
2356
|
-
pending "MONGOID-5416"
|
2357
2533
|
expect(docs).to eq([ depeche_mode ])
|
2358
2534
|
end
|
2359
2535
|
end
|
@@ -2406,37 +2582,28 @@ describe Mongoid::Contextual::Mongo do
|
|
2406
2582
|
described_class.new(criteria)
|
2407
2583
|
end
|
2408
2584
|
|
2409
|
-
|
2410
|
-
|
2411
|
-
end
|
2585
|
+
context "when broken_view_options is false" do
|
2586
|
+
driver_config_override :broken_view_options, false
|
2412
2587
|
|
2413
|
-
|
2414
|
-
|
2415
|
-
expect(context.view).to receive(:count_documents).once.and_return(2)
|
2416
|
-
2.times { expect(context.send(method)).to eq(2) }
|
2588
|
+
it "returns the number of documents that match" do
|
2589
|
+
expect(context.send(method)).to eq(1)
|
2417
2590
|
end
|
2418
2591
|
end
|
2419
2592
|
|
2420
|
-
context "when
|
2421
|
-
|
2422
|
-
before do
|
2423
|
-
context.entries
|
2424
|
-
end
|
2593
|
+
context "when broken_view_options is true" do
|
2594
|
+
driver_config_override :broken_view_options, true
|
2425
2595
|
|
2426
|
-
it "returns the
|
2427
|
-
expect(context.view).to receive(:count_documents).once.and_return(2)
|
2596
|
+
it "returns the number of documents that match" do
|
2428
2597
|
expect(context.send(method)).to eq(2)
|
2429
2598
|
end
|
2599
|
+
end
|
2430
2600
|
|
2431
|
-
|
2432
|
-
|
2433
|
-
before do
|
2434
|
-
context.entries
|
2435
|
-
end
|
2601
|
+
context "when calling more than once with different limits" do
|
2602
|
+
driver_config_override :broken_view_options, false
|
2436
2603
|
|
2437
|
-
|
2438
|
-
|
2439
|
-
|
2604
|
+
it "does not cache the value" do
|
2605
|
+
expect(context.limit(1).send(method)).to eq(1)
|
2606
|
+
expect(context.limit(2).send(method)).to eq(2)
|
2440
2607
|
end
|
2441
2608
|
end
|
2442
2609
|
end
|
@@ -2455,10 +2622,12 @@ describe Mongoid::Contextual::Mongo do
|
|
2455
2622
|
expect(context.send(method)).to eq(1)
|
2456
2623
|
end
|
2457
2624
|
|
2458
|
-
context "when calling more than once" do
|
2459
|
-
|
2460
|
-
|
2461
|
-
|
2625
|
+
context "when calling more than once with different skips" do
|
2626
|
+
driver_config_override :broken_view_options, false
|
2627
|
+
|
2628
|
+
it "does not cache the value" do
|
2629
|
+
expect(context.skip(0).send(method)).to eq(1)
|
2630
|
+
expect(context.skip(1).send(method)).to eq(0)
|
2462
2631
|
end
|
2463
2632
|
end
|
2464
2633
|
|
@@ -2580,7 +2749,7 @@ describe Mongoid::Contextual::Mongo do
|
|
2580
2749
|
it "raises an error" do
|
2581
2750
|
expect do
|
2582
2751
|
Person.take!
|
2583
|
-
end.to raise_error(Mongoid::Errors::DocumentNotFound)
|
2752
|
+
end.to raise_error(Mongoid::Errors::DocumentNotFound, /Could not find a document of class Person./)
|
2584
2753
|
end
|
2585
2754
|
end
|
2586
2755
|
end
|
@@ -2602,9 +2771,10 @@ describe Mongoid::Contextual::Mongo do
|
|
2602
2771
|
|
2603
2772
|
context "when passed the symbol field name" do
|
2604
2773
|
|
2605
|
-
it "
|
2606
|
-
expect
|
2607
|
-
|
2774
|
+
it "raises an error" do
|
2775
|
+
expect do
|
2776
|
+
context.map(:name)
|
2777
|
+
end.to raise_error(ArgumentError)
|
2608
2778
|
end
|
2609
2779
|
end
|
2610
2780
|
|