mongoid 5.4.0 → 6.4.8
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/Rakefile +26 -0
- data/lib/config/locales/en.yml +40 -0
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic.rb +5 -5
- data/lib/mongoid/attributes/readonly.rb +22 -0
- data/lib/mongoid/attributes.rb +22 -21
- data/lib/mongoid/cacheable.rb +36 -0
- data/lib/mongoid/changeable.rb +36 -0
- data/lib/mongoid/clients/options.rb +55 -250
- data/lib/mongoid/clients/sessions.rb +113 -0
- data/lib/mongoid/clients/storage_options.rb +2 -69
- data/lib/mongoid/clients.rb +10 -63
- data/lib/mongoid/composable.rb +29 -2
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +4 -4
- data/lib/mongoid/contextual/map_reduce.rb +7 -3
- data/lib/mongoid/contextual/memory.rb +9 -4
- data/lib/mongoid/contextual/mongo.rb +65 -30
- data/lib/mongoid/contextual/none.rb +12 -0
- data/lib/mongoid/copyable.rb +13 -6
- data/lib/mongoid/criteria/marshalable.rb +2 -2
- data/lib/mongoid/criteria/modifiable.rb +29 -3
- data/lib/mongoid/criteria/options.rb +25 -0
- data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
- data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
- data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
- data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
- data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
- data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
- data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
- data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
- data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
- data/lib/mongoid/criteria/queryable/key.rb +103 -0
- data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
- data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
- data/lib/mongoid/criteria/queryable/optional.rb +429 -0
- data/lib/mongoid/criteria/queryable/options.rb +153 -0
- data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
- data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
- data/lib/mongoid/criteria/queryable/selector.rb +212 -0
- data/lib/mongoid/criteria/queryable/smash.rb +104 -0
- data/lib/mongoid/criteria/queryable.rb +87 -0
- data/lib/mongoid/criteria.rb +6 -2
- data/lib/mongoid/document.rb +34 -41
- data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
- data/lib/mongoid/errors/invalid_field.rb +2 -2
- data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
- data/lib/mongoid/errors/invalid_relation.rb +66 -0
- data/lib/mongoid/errors/invalid_session_use.rb +24 -0
- data/lib/mongoid/errors.rb +3 -0
- data/lib/mongoid/evolvable.rb +1 -1
- data/lib/mongoid/extensions/big_decimal.rb +17 -8
- data/lib/mongoid/extensions/date.rb +4 -1
- data/lib/mongoid/extensions/decimal128.rb +3 -3
- data/lib/mongoid/extensions/hash.rb +1 -0
- data/lib/mongoid/extensions/regexp.rb +1 -0
- data/lib/mongoid/extensions/string.rb +6 -3
- data/lib/mongoid/extensions/time.rb +4 -1
- data/lib/mongoid/extensions.rb +0 -4
- data/lib/mongoid/factory.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +18 -0
- data/lib/mongoid/findable.rb +2 -2
- data/lib/mongoid/indexable.rb +16 -14
- data/lib/mongoid/interceptable.rb +9 -22
- data/lib/mongoid/matchable/all.rb +2 -2
- data/lib/mongoid/matchable/and.rb +3 -3
- data/lib/mongoid/matchable/default.rb +2 -2
- data/lib/mongoid/matchable/elem_match.rb +28 -0
- data/lib/mongoid/matchable/exists.rb +2 -2
- data/lib/mongoid/matchable/gt.rb +4 -2
- data/lib/mongoid/matchable/gte.rb +4 -2
- data/lib/mongoid/matchable/in.rb +2 -2
- data/lib/mongoid/matchable/lt.rb +4 -2
- data/lib/mongoid/matchable/lte.rb +4 -2
- data/lib/mongoid/matchable/ne.rb +2 -2
- data/lib/mongoid/matchable/nin.rb +2 -2
- data/lib/mongoid/matchable/nor.rb +37 -0
- data/lib/mongoid/matchable/or.rb +3 -3
- data/lib/mongoid/matchable/regexp.rb +3 -3
- data/lib/mongoid/matchable/size.rb +2 -2
- data/lib/mongoid/matchable.rb +16 -7
- data/lib/mongoid/persistable/creatable.rb +5 -3
- data/lib/mongoid/persistable/deletable.rb +5 -3
- data/lib/mongoid/persistable/destroyable.rb +1 -5
- data/lib/mongoid/persistable/settable.rb +5 -5
- data/lib/mongoid/persistable/updatable.rb +7 -14
- data/lib/mongoid/persistable/upsertable.rb +2 -1
- data/lib/mongoid/persistable.rb +4 -6
- data/lib/mongoid/persistence_context.rb +220 -0
- data/lib/mongoid/query_cache.rb +67 -23
- data/lib/mongoid/railtie.rb +17 -1
- data/lib/mongoid/railties/controller_runtime.rb +86 -0
- data/lib/mongoid/relations/accessors.rb +3 -0
- data/lib/mongoid/relations/auto_save.rb +12 -4
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
- data/lib/mongoid/relations/counter_cache.rb +15 -5
- data/lib/mongoid/relations/eager/base.rb +3 -3
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
- data/lib/mongoid/relations/eager/has_many.rb +1 -1
- data/lib/mongoid/relations/eager.rb +6 -11
- data/lib/mongoid/relations/embedded/batchable.rb +20 -18
- data/lib/mongoid/relations/embedded/in.rb +13 -1
- data/lib/mongoid/relations/embedded/many.rb +51 -10
- data/lib/mongoid/relations/embedded/one.rb +14 -1
- data/lib/mongoid/relations/macros.rb +9 -1
- data/lib/mongoid/relations/many.rb +4 -0
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/proxy.rb +1 -31
- data/lib/mongoid/relations/referenced/in.rb +19 -10
- data/lib/mongoid/relations/referenced/many.rb +30 -26
- data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
- data/lib/mongoid/relations/referenced/one.rb +15 -1
- data/lib/mongoid/relations/synchronization.rb +12 -12
- data/lib/mongoid/relations/targets/enumerable.rb +24 -4
- data/lib/mongoid/relations/touchable.rb +7 -4
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/scopable.rb +3 -3
- data/lib/mongoid/serializable.rb +1 -1
- data/lib/mongoid/stateful.rb +1 -0
- data/lib/mongoid/tasks/database.rb +3 -2
- data/lib/mongoid/threaded.rb +74 -0
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/validatable/uniqueness.rb +1 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +6 -6
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
- data/spec/app/models/agent.rb +2 -0
- data/spec/app/models/album.rb +5 -1
- data/spec/app/models/array_field.rb +7 -0
- data/spec/app/models/artist.rb +21 -0
- data/spec/app/models/band.rb +3 -0
- data/spec/app/models/book.rb +2 -1
- data/spec/app/models/delegating_patient.rb +16 -0
- data/spec/app/models/dokument.rb +1 -0
- data/spec/app/models/ordered_post.rb +5 -0
- data/spec/app/models/oscar.rb +1 -2
- data/spec/app/models/page.rb +1 -1
- data/spec/app/models/person.rb +3 -3
- data/spec/app/models/princess.rb +2 -0
- data/spec/app/models/record.rb +1 -0
- data/spec/app/models/subscription.rb +1 -0
- data/spec/app/models/thing.rb +1 -1
- data/spec/config/mongoid.yml +15 -0
- data/spec/integration/document_spec.rb +22 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
- data/spec/mongoid/atomic_spec.rb +5 -5
- data/spec/mongoid/attributes/nested_spec.rb +18 -14
- data/spec/mongoid/attributes/readonly_spec.rb +87 -44
- data/spec/mongoid/attributes_spec.rb +90 -5
- data/spec/mongoid/cacheable_spec.rb +112 -0
- data/spec/mongoid/changeable_spec.rb +58 -0
- data/spec/mongoid/clients/factory_spec.rb +80 -28
- data/spec/mongoid/clients/options_spec.rb +396 -95
- data/spec/mongoid/clients/sessions_spec.rb +334 -0
- data/spec/mongoid/clients_spec.rb +243 -101
- data/spec/mongoid/composable_spec.rb +7 -0
- data/spec/mongoid/config_spec.rb +67 -11
- data/spec/mongoid/contextual/atomic_spec.rb +3 -3
- data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
- data/spec/mongoid/contextual/mongo_spec.rb +275 -22
- data/spec/mongoid/contextual/none_spec.rb +15 -0
- data/spec/mongoid/copyable_spec.rb +13 -4
- data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
- data/spec/mongoid/criteria/options_spec.rb +29 -0
- data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
- data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
- data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
- data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
- data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
- data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
- data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
- data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
- data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
- data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
- data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
- data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
- data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
- data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
- data/spec/mongoid/criteria/scopable_spec.rb +81 -0
- data/spec/mongoid/criteria_spec.rb +156 -22
- data/spec/mongoid/document_spec.rb +100 -90
- data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
- data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/date_spec.rb +2 -6
- data/spec/mongoid/extensions/date_time_spec.rb +2 -6
- data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
- data/spec/mongoid/extensions/float_spec.rb +8 -1
- data/spec/mongoid/extensions/hash_spec.rb +15 -0
- data/spec/mongoid/extensions/integer_spec.rb +8 -1
- data/spec/mongoid/extensions/object_spec.rb +11 -0
- data/spec/mongoid/extensions/regexp_spec.rb +23 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -4
- data/spec/mongoid/extensions/time_spec.rb +2 -6
- data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
- data/spec/mongoid/factory_spec.rb +11 -0
- data/spec/mongoid/fields_spec.rb +1 -1
- data/spec/mongoid/findable_spec.rb +47 -2
- data/spec/mongoid/indexable_spec.rb +15 -3
- data/spec/mongoid/interceptable_spec.rb +85 -19
- data/spec/mongoid/matchable/all_spec.rb +4 -4
- data/spec/mongoid/matchable/and_spec.rb +10 -10
- data/spec/mongoid/matchable/default_spec.rb +12 -12
- data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
- data/spec/mongoid/matchable/exists_spec.rb +5 -5
- data/spec/mongoid/matchable/gt_spec.rb +18 -7
- data/spec/mongoid/matchable/gte_spec.rb +17 -7
- data/spec/mongoid/matchable/in_spec.rb +5 -5
- data/spec/mongoid/matchable/lt_spec.rb +18 -7
- data/spec/mongoid/matchable/lte_spec.rb +18 -7
- data/spec/mongoid/matchable/ne_spec.rb +5 -5
- data/spec/mongoid/matchable/nin_spec.rb +5 -5
- data/spec/mongoid/matchable/nor_spec.rb +209 -0
- data/spec/mongoid/matchable/or_spec.rb +7 -7
- data/spec/mongoid/matchable/regexp_spec.rb +5 -5
- data/spec/mongoid/matchable/size_spec.rb +3 -3
- data/spec/mongoid/matchable_spec.rb +199 -54
- data/spec/mongoid/persistable/creatable_spec.rb +7 -2
- data/spec/mongoid/persistable/deletable_spec.rb +35 -1
- data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
- data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
- data/spec/mongoid/persistable/savable_spec.rb +34 -29
- data/spec/mongoid/persistable/settable_spec.rb +77 -27
- data/spec/mongoid/persistable/updatable_spec.rb +182 -3
- data/spec/mongoid/persistable_spec.rb +16 -16
- data/spec/mongoid/persistence_context_spec.rb +694 -0
- data/spec/mongoid/positional_spec.rb +1 -1
- data/spec/mongoid/query_cache_spec.rb +170 -12
- data/spec/mongoid/relations/accessors_spec.rb +1 -1
- data/spec/mongoid/relations/auto_save_spec.rb +39 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
- data/spec/mongoid/relations/builders_spec.rb +37 -10
- data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
- data/spec/mongoid/relations/eager_spec.rb +40 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
- data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
- data/spec/mongoid/relations/macros_spec.rb +415 -7
- data/spec/mongoid/relations/metadata_spec.rb +15 -1
- data/spec/mongoid/relations/proxy_spec.rb +27 -1
- data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
- data/spec/mongoid/relations/synchronization_spec.rb +48 -2
- data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
- data/spec/mongoid/relations/touchable_spec.rb +40 -0
- data/spec/mongoid/reloadable_spec.rb +51 -0
- data/spec/mongoid/scopable_spec.rb +13 -0
- data/spec/mongoid/serializable_spec.rb +0 -50
- data/spec/mongoid/threaded_spec.rb +68 -0
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
- data/spec/mongoid/validatable_spec.rb +16 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
- data/spec/spec_helper.rb +101 -8
- data/spec/support/cluster_config.rb +158 -0
- data/spec/support/constraints.rb +101 -0
- data/spec/support/macros.rb +20 -0
- data/spec/support/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +42 -0
- data.tar.gz.sig +0 -0
- metadata +163 -61
- metadata.gz.sig +0 -0
- data/lib/mongoid/clients/thread_options.rb +0 -19
- data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
- data/lib/mongoid/railties/document.rb +0 -12
- data/spec/mongoid/railties/document_spec.rb +0 -24
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Errors
|
4
|
+
|
5
|
+
# This error is raised when a session is attempted to be used with a model whose client cannot use it, if
|
6
|
+
# sessions are nested, or if the mongodb deployment doesn't support sessions.
|
7
|
+
#
|
8
|
+
# @since 6.4.0
|
9
|
+
class InvalidSessionUse < MongoidError
|
10
|
+
|
11
|
+
# Create the error.
|
12
|
+
#
|
13
|
+
# @example Create the error.
|
14
|
+
# InvalidSessionUse.new(:invalid_session_use)
|
15
|
+
#
|
16
|
+
# @param [ :invalid_sesion_use, :invalid_session_nesting ] error_type The type of session misuse.
|
17
|
+
#
|
18
|
+
# @since 6.4.0
|
19
|
+
def initialize(error_type)
|
20
|
+
super(compose_message(error_type.to_s))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/mongoid/errors.rb
CHANGED
@@ -15,7 +15,10 @@ require "mongoid/errors/invalid_includes"
|
|
15
15
|
require "mongoid/errors/invalid_index"
|
16
16
|
require "mongoid/errors/invalid_options"
|
17
17
|
require "mongoid/errors/invalid_path"
|
18
|
+
require "mongoid/errors/invalid_persistence_option"
|
19
|
+
require "mongoid/errors/invalid_relation"
|
18
20
|
require "mongoid/errors/invalid_scope"
|
21
|
+
require "mongoid/errors/invalid_session_use"
|
19
22
|
require "mongoid/errors/invalid_set_polymorphic_relation"
|
20
23
|
require "mongoid/errors/invalid_storage_options"
|
21
24
|
require "mongoid/errors/invalid_storage_parent"
|
data/lib/mongoid/evolvable.rb
CHANGED
@@ -28,6 +28,18 @@ module Mongoid
|
|
28
28
|
to_s
|
29
29
|
end
|
30
30
|
|
31
|
+
# Is the BigDecimal a number?
|
32
|
+
#
|
33
|
+
# @example Is the object a number?.
|
34
|
+
# object.numeric?
|
35
|
+
#
|
36
|
+
# @return [ true ] Always true.
|
37
|
+
#
|
38
|
+
# @since 6.0.0
|
39
|
+
def numeric?
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
31
43
|
module ClassMethods
|
32
44
|
|
33
45
|
# Convert the object from its mongo friendly ruby type to this type.
|
@@ -37,28 +49,25 @@ module Mongoid
|
|
37
49
|
#
|
38
50
|
# @param [ Object ] object The object to demongoize.
|
39
51
|
#
|
40
|
-
# @return [
|
52
|
+
# @return [ BigDecimal, nil ] A BigDecimal derived from the object or nil.
|
41
53
|
#
|
42
54
|
# @since 3.0.0
|
43
55
|
def demongoize(object)
|
44
|
-
|
45
|
-
object.numeric? ? ::BigDecimal.new(object.to_s) : object
|
46
|
-
end
|
56
|
+
object && object.numeric? ? BigDecimal(object.to_s) : nil
|
47
57
|
end
|
48
58
|
|
49
|
-
# Mongoize an object of any type to how it's stored in the db as a
|
50
|
-
# decimal.
|
59
|
+
# Mongoize an object of any type to how it's stored in the db as a String.
|
51
60
|
#
|
52
61
|
# @example Mongoize the object.
|
53
62
|
# BigDecimal.mongoize(123)
|
54
63
|
#
|
55
64
|
# @param [ Object ] object The object to Mongoize
|
56
65
|
#
|
57
|
-
# @return [ String ]
|
66
|
+
# @return [ String, nil ] A String representing the object or nil.
|
58
67
|
#
|
59
68
|
# @since 3.0.7
|
60
69
|
def mongoize(object)
|
61
|
-
object ? object.to_s :
|
70
|
+
object && object.numeric? ? object.to_s : nil
|
62
71
|
end
|
63
72
|
end
|
64
73
|
end
|
@@ -4,6 +4,9 @@ module Mongoid
|
|
4
4
|
module Date
|
5
5
|
|
6
6
|
# Constant for epoch - used when passing invalid times.
|
7
|
+
#
|
8
|
+
# @deprecated No longer used as a return value from #mongoize passed
|
9
|
+
# an invalid date string.
|
7
10
|
EPOCH = ::Date.new(1970, 1, 1)
|
8
11
|
|
9
12
|
# Convert the date into a time.
|
@@ -64,7 +67,7 @@ module Mongoid
|
|
64
67
|
time = object.__mongoize_time__
|
65
68
|
::Time.utc(time.year, time.month, time.day)
|
66
69
|
rescue ArgumentError
|
67
|
-
|
70
|
+
nil
|
68
71
|
end
|
69
72
|
end
|
70
73
|
end
|
@@ -10,7 +10,7 @@ module Mongoid
|
|
10
10
|
#
|
11
11
|
# @return [ BSON::Decimal128 ] self.
|
12
12
|
#
|
13
|
-
# @since
|
13
|
+
# @since 6.1.0
|
14
14
|
def __evolve_decimal128__
|
15
15
|
self
|
16
16
|
end
|
@@ -26,7 +26,7 @@ module Mongoid
|
|
26
26
|
#
|
27
27
|
# @return [ BSON::Decimal128 ] The decimal128.
|
28
28
|
#
|
29
|
-
# @since
|
29
|
+
# @since 6.1.0
|
30
30
|
def evolve(object)
|
31
31
|
object.__evolve_decimal128__
|
32
32
|
end
|
@@ -36,4 +36,4 @@ module Mongoid
|
|
36
36
|
end
|
37
37
|
|
38
38
|
BSON::Decimal128.__send__(:include, Mongoid::Extensions::Decimal128)
|
39
|
-
BSON::Decimal128.extend(Mongoid::Extensions::Decimal128::ClassMethods)
|
39
|
+
BSON::Decimal128.extend(Mongoid::Extensions::Decimal128::ClassMethods)
|
@@ -72,7 +72,8 @@ module Mongoid
|
|
72
72
|
self =~ /\A(|_)id$/
|
73
73
|
end
|
74
74
|
|
75
|
-
# Is the string a number?
|
75
|
+
# Is the string a number? The literals "NaN", "Infinity", and "-Infinity"
|
76
|
+
# are counted as numbers.
|
76
77
|
#
|
77
78
|
# @example Is the string a number.
|
78
79
|
# "1234.23".numeric?
|
@@ -81,7 +82,9 @@ module Mongoid
|
|
81
82
|
#
|
82
83
|
# @since 3.0.0
|
83
84
|
def numeric?
|
84
|
-
|
85
|
+
!!Float(self)
|
86
|
+
rescue ArgumentError
|
87
|
+
(self =~ /\A(?:NaN|-?Infinity)\z/) == 0
|
85
88
|
end
|
86
89
|
|
87
90
|
# Get the string as a getter string.
|
@@ -117,7 +120,7 @@ module Mongoid
|
|
117
120
|
#
|
118
121
|
# @since 3.0.15
|
119
122
|
def valid_method_name?
|
120
|
-
/[@$"]/ !~ self
|
123
|
+
/[@$"-]/ !~ self
|
121
124
|
end
|
122
125
|
|
123
126
|
# Does the string end with _before_type_cast?
|
@@ -4,6 +4,9 @@ module Mongoid
|
|
4
4
|
module Time
|
5
5
|
|
6
6
|
# Constant for epoch - used when passing invalid times.
|
7
|
+
#
|
8
|
+
# @deprecated No longer used as a return value from #mongoize passed
|
9
|
+
# an invalid time string.
|
7
10
|
EPOCH = ::Time.utc(1970, 1, 1, 0, 0, 0)
|
8
11
|
|
9
12
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
@@ -76,7 +79,7 @@ module Mongoid
|
|
76
79
|
::Time.at(time.to_i, time.usec).utc
|
77
80
|
end
|
78
81
|
rescue ArgumentError
|
79
|
-
|
82
|
+
nil
|
80
83
|
end
|
81
84
|
end
|
82
85
|
end
|
data/lib/mongoid/extensions.rb
CHANGED
@@ -3,9 +3,6 @@ class BSON::ObjectId
|
|
3
3
|
def as_json(options = nil)
|
4
4
|
{ "$oid" => to_s }
|
5
5
|
end
|
6
|
-
def to_xml(options = nil)
|
7
|
-
ActiveSupport::XmlMini.to_tag(options[:root], self.to_s, options)
|
8
|
-
end
|
9
6
|
end
|
10
7
|
|
11
8
|
class Symbol
|
@@ -39,7 +36,6 @@ require "mongoid/extensions/module"
|
|
39
36
|
require "mongoid/extensions/nil_class"
|
40
37
|
require "mongoid/extensions/object"
|
41
38
|
require "mongoid/extensions/object_id"
|
42
|
-
require "mongoid/extensions/origin/regexp_raw"
|
43
39
|
require "mongoid/extensions/range"
|
44
40
|
require "mongoid/extensions/regexp"
|
45
41
|
require "mongoid/extensions/set"
|
data/lib/mongoid/factory.rb
CHANGED
@@ -17,7 +17,8 @@ module Mongoid
|
|
17
17
|
#
|
18
18
|
# @return [ Document ] The instantiated document.
|
19
19
|
def build(klass, attributes = nil)
|
20
|
-
|
20
|
+
attributes ||= {}
|
21
|
+
type = attributes[TYPE] || attributes[TYPE.to_sym]
|
21
22
|
if type && klass._types.include?(type)
|
22
23
|
type.constantize.new(attributes)
|
23
24
|
else
|
@@ -36,6 +36,24 @@ module Mongoid
|
|
36
36
|
validate_options(klass, name, options)
|
37
37
|
end
|
38
38
|
|
39
|
+
# Validate the relation definition.
|
40
|
+
#
|
41
|
+
# @example Validate the relation definition.
|
42
|
+
# Macro.validate(Model, :name)
|
43
|
+
#
|
44
|
+
# @param [ Class ] klass The model class.
|
45
|
+
# @param [ Symbol ] name The field name.
|
46
|
+
# @param [ Hash ] options The provided options.
|
47
|
+
#
|
48
|
+
# @since 6.0.0
|
49
|
+
def validate_relation(klass, name, options = {})
|
50
|
+
[name, "#{name}?".to_sym, "#{name}=".to_sym].each do |n|
|
51
|
+
if Mongoid.destructive_fields.include?(n)
|
52
|
+
raise Errors::InvalidRelation.new(klass, n)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
39
57
|
private
|
40
58
|
|
41
59
|
# Determine if the field name is allowed, if not raise an error.
|
data/lib/mongoid/findable.rb
CHANGED
@@ -6,12 +6,12 @@ module Mongoid
|
|
6
6
|
#
|
7
7
|
# @since 4.0.0
|
8
8
|
module Findable
|
9
|
-
extend
|
9
|
+
extend Mongoid::Criteria::Queryable::Forwardable
|
10
10
|
|
11
11
|
select_with :with_default_scope
|
12
12
|
|
13
13
|
# These are methods defined on the criteria that should also be accessible
|
14
|
-
# directly from the
|
14
|
+
# directly from the class level.
|
15
15
|
delegate \
|
16
16
|
:aggregates,
|
17
17
|
:avg,
|
data/lib/mongoid/indexable.rb
CHANGED
@@ -31,10 +31,11 @@ module Mongoid
|
|
31
31
|
index_specifications.each do |spec|
|
32
32
|
key, options = spec.key, spec.options
|
33
33
|
if database = options[:database]
|
34
|
-
with(database: database)
|
35
|
-
collection.indexes.create_one(key, options.except(:database))
|
34
|
+
with(database: database) do |klass|
|
35
|
+
klass.collection.indexes(session: _session).create_one(key, options.except(:database))
|
36
|
+
end
|
36
37
|
else
|
37
|
-
collection.indexes.create_one(key, options)
|
38
|
+
collection.indexes(session: _session).create_one(key, options)
|
38
39
|
end
|
39
40
|
end and true
|
40
41
|
end
|
@@ -50,18 +51,19 @@ module Mongoid
|
|
50
51
|
# @since 3.0.0
|
51
52
|
def remove_indexes
|
52
53
|
indexed_database_names.each do |database|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
54
|
+
with(database: database) do |klass|
|
55
|
+
begin
|
56
|
+
klass.collection.indexes(session: _session).each do |spec|
|
57
|
+
unless spec["name"] == "_id_"
|
58
|
+
klass.collection.indexes(session: _session).drop_one(spec["key"])
|
59
|
+
logger.info(
|
60
|
+
"MONGOID: Removed index '#{spec["name"]}' on collection " +
|
61
|
+
"'#{klass.collection.name}' in database '#{database}'."
|
62
|
+
)
|
63
|
+
end
|
62
64
|
end
|
63
|
-
end
|
64
|
-
|
65
|
+
rescue Mongo::Error::OperationFailure; end
|
66
|
+
end
|
65
67
|
end and true
|
66
68
|
end
|
67
69
|
|
@@ -125,12 +125,6 @@ module Mongoid
|
|
125
125
|
# @since 2.3.0
|
126
126
|
def run_callbacks(kind, *args, &block)
|
127
127
|
cascadable_children(kind).each do |child|
|
128
|
-
# This is returning false for some destroy tests on 4.1.0.beta1,
|
129
|
-
# causing them to fail since 4.1.0 expects a block to be passed if the
|
130
|
-
# callbacks for the type are empty. If no block is passed then the nil
|
131
|
-
# return value gets interpreted as false and halts the chain.
|
132
|
-
#
|
133
|
-
# @see https://github.com/rails/rails/blob/master/activesupport/lib/active_support/callbacks.rb#L79
|
134
128
|
if child.run_callbacks(child_callback_type(kind, child), *args) == false
|
135
129
|
return false
|
136
130
|
end
|
@@ -196,7 +190,7 @@ module Mongoid
|
|
196
190
|
#
|
197
191
|
# @since 2.3.0
|
198
192
|
def cascadable_child?(kind, child, metadata)
|
199
|
-
return false if kind == :initialize || kind == :find
|
193
|
+
return false if kind == :initialize || kind == :find || kind == :touch
|
200
194
|
return false if kind == :validate && metadata.validate?
|
201
195
|
child.callback_executable?(kind) ? child.in_callback_state?(kind) : false
|
202
196
|
end
|
@@ -259,22 +253,15 @@ module Mongoid
|
|
259
253
|
send("_#{kind}_callbacks").each do |callback|
|
260
254
|
chain.append(callback) if callback.kind == place
|
261
255
|
end
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
else
|
270
|
-
class_eval <<-EOM
|
271
|
-
def #{name}()
|
272
|
-
#{chain.compile}
|
273
|
-
end
|
274
|
-
protected :#{name}
|
275
|
-
EOM
|
256
|
+
self.class.send :define_method, name do
|
257
|
+
env = ActiveSupport::Callbacks::Filters::Environment.new(self, false, nil)
|
258
|
+
sequence = chain.compile
|
259
|
+
sequence.invoke_before(env)
|
260
|
+
env.value = !env.halted
|
261
|
+
sequence.invoke_after(env)
|
262
|
+
env.value
|
276
263
|
end
|
277
|
-
|
264
|
+
self.class.send :protected, name
|
278
265
|
end
|
279
266
|
send(name)
|
280
267
|
end
|
@@ -8,12 +8,12 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute and first value in the hash are equal.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If the values match.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
first = first(value)
|
18
18
|
return false if first.is_a?(Array) && first.empty?
|
19
19
|
|
@@ -8,19 +8,19 @@ module Mongoid
|
|
8
8
|
# Does the supplied query match the attribute?
|
9
9
|
#
|
10
10
|
# @example Does this match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?([ { field => value } ])
|
12
12
|
#
|
13
13
|
# @param [ Array ] conditions The or expression.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] True if matches, false if not.
|
16
16
|
#
|
17
17
|
# @since 2.3.0
|
18
|
-
def
|
18
|
+
def _matches?(conditions)
|
19
19
|
conditions.each do |condition|
|
20
20
|
condition.keys.each do |k|
|
21
21
|
key = k
|
22
22
|
value = condition[k]
|
23
|
-
return false unless document.
|
23
|
+
return false unless document._matches?(key => value)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
true
|
@@ -24,14 +24,14 @@ module Mongoid
|
|
24
24
|
# if the value is included.
|
25
25
|
#
|
26
26
|
# @example Does this value match?
|
27
|
-
# default.
|
27
|
+
# default._matches?("value")
|
28
28
|
#
|
29
29
|
# @param [ Object ] value The value to check if it matches.
|
30
30
|
#
|
31
31
|
# @return [ true, false ] True if matches, false if not.
|
32
32
|
#
|
33
33
|
# @since 1.0.0
|
34
|
-
def
|
34
|
+
def _matches?(value)
|
35
35
|
attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.any? { |_attribute| value === _attribute } : value === attribute
|
36
36
|
end
|
37
37
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Matchable
|
4
|
+
|
5
|
+
class ElemMatch < Default
|
6
|
+
|
7
|
+
# Return true if a given predicate matches a sub document entirely
|
8
|
+
#
|
9
|
+
# @example Do the values match?
|
10
|
+
# matcher._matches?({"$elemMatch" => {"a" => 1, "b" => 2}})
|
11
|
+
#
|
12
|
+
# @param [ Hash ] value The values to check.
|
13
|
+
#
|
14
|
+
# @return [ true, false ] If the values match.
|
15
|
+
def _matches?(value)
|
16
|
+
if !@attribute.is_a?(Array) || !value.kind_of?(Hash) || !value["$elemMatch"].kind_of?(Hash)
|
17
|
+
return false
|
18
|
+
end
|
19
|
+
|
20
|
+
return @attribute.any? do |sub_document|
|
21
|
+
value["$elemMatch"].all? do |k, v|
|
22
|
+
Matchable.matcher(sub_document, k, v)._matches?(v)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -10,12 +10,12 @@ module Mongoid
|
|
10
10
|
# non-existence.
|
11
11
|
#
|
12
12
|
# @example Does anything exist?
|
13
|
-
# matcher.
|
13
|
+
# matcher._matches?({ :key => 10 })
|
14
14
|
#
|
15
15
|
# @param [ Hash ] value The values to check.
|
16
16
|
#
|
17
17
|
# @return [ true, false ] If a value exists.
|
18
|
-
def
|
18
|
+
def _matches?(value)
|
19
19
|
@attribute.nil? != value.values.first
|
20
20
|
end
|
21
21
|
end
|
data/lib/mongoid/matchable/gt.rb
CHANGED
@@ -8,13 +8,15 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute is greater than the value.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
determine(value, :>)
|
18
|
+
rescue ArgumentError
|
19
|
+
false
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -8,13 +8,15 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute is greater than or equal to the value.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
determine(value, :>=)
|
18
|
+
rescue ArgumentError
|
19
|
+
false
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
data/lib/mongoid/matchable/in.rb
CHANGED
@@ -8,12 +8,12 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute is in the values.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
attribute_array = @attribute.nil? ? [nil] : Array.wrap(@attribute)
|
18
18
|
value.values.first.any? do |e|
|
19
19
|
attribute_array.any? { |_attribute| e === _attribute }
|
data/lib/mongoid/matchable/lt.rb
CHANGED
@@ -8,13 +8,15 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute is less than the value.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
determine(value, :<)
|
18
|
+
rescue ArgumentError
|
19
|
+
false
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -8,13 +8,15 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute is less than or equal to the value.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
determine(value, :<=)
|
18
|
+
rescue ArgumentError
|
19
|
+
false
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
data/lib/mongoid/matchable/ne.rb
CHANGED
@@ -8,12 +8,12 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute and first value are not equal.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
!super(value.values.first)
|
18
18
|
end
|
19
19
|
end
|
@@ -8,12 +8,12 @@ module Mongoid
|
|
8
8
|
# Return true if the attribute is not in the value list.
|
9
9
|
#
|
10
10
|
# @example Do the values match?
|
11
|
-
# matcher.
|
11
|
+
# matcher._matches?({ :key => 10 })
|
12
12
|
#
|
13
13
|
# @param [ Hash ] value The values to check.
|
14
14
|
#
|
15
15
|
# @return [ true, false ] If a value exists.
|
16
|
-
def
|
16
|
+
def _matches?(value)
|
17
17
|
attribute_array = @attribute.nil? ? [nil] : Array.wrap(@attribute)
|
18
18
|
attribute_array.none? { |e| value.values.first.include?(e) }
|
19
19
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
module Mongoid
|
4
|
+
module Matchable
|
5
|
+
|
6
|
+
# Defines behavior for handling $nor expressions in embedded documents.
|
7
|
+
class Nor < Default
|
8
|
+
|
9
|
+
# Does the supplied query match the attribute?
|
10
|
+
#
|
11
|
+
# Note: an empty array as an argument to $nor is prohibited by
|
12
|
+
# MongoDB server. Mongoid does allow this and returns false in this case.
|
13
|
+
#
|
14
|
+
# @example Does this match?
|
15
|
+
# matcher._matches?("$nor" => [ { field => value } ])
|
16
|
+
#
|
17
|
+
# @param [ Array ] conditions The or expression.
|
18
|
+
#
|
19
|
+
# @return [ true, false ] True if matches, false if not.
|
20
|
+
#
|
21
|
+
# @since 6.4.2/7.0.2/7.1.0
|
22
|
+
def _matches?(conditions)
|
23
|
+
if conditions.length == 0
|
24
|
+
# MongoDB does not allow $nor array to be empty, but
|
25
|
+
# Mongoid accepts an empty array for $or which MongoDB also
|
26
|
+
# prohibits
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
conditions.none? do |condition|
|
30
|
+
condition.all? do |key, value|
|
31
|
+
document._matches?(key => value)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|