mongoid 2.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +3 -1
- data/Rakefile +3 -2
- data/lib/config/locales/bg.yml +6 -0
- data/lib/config/locales/de.yml +6 -0
- data/lib/config/locales/en-GB.yml +48 -0
- data/lib/config/locales/en.yml +6 -3
- data/lib/config/locales/es.yml +6 -0
- data/lib/config/locales/fr.yml +6 -0
- data/lib/config/locales/hi.yml +39 -0
- data/lib/config/locales/hu.yml +13 -7
- data/lib/config/locales/id.yml +3 -0
- data/lib/config/locales/it.yml +7 -1
- data/lib/config/locales/ja.yml +4 -1
- data/lib/config/locales/kr.yml +9 -34
- data/lib/config/locales/nl.yml +6 -0
- data/lib/config/locales/pl.yml +6 -0
- data/lib/config/locales/pt-BR.yml +6 -0
- data/lib/config/locales/pt.yml +6 -0
- data/lib/config/locales/ro.yml +6 -0
- data/lib/config/locales/ru.yml +6 -0
- data/lib/config/locales/sv.yml +6 -0
- data/lib/config/locales/vi.yml +3 -0
- data/lib/config/locales/zh-CN.yml +6 -0
- data/lib/mongoid.rb +51 -45
- data/lib/mongoid/atomic.rb +145 -0
- data/lib/mongoid/atomic/modifiers.rb +109 -0
- data/lib/mongoid/atomic/paths.rb +3 -0
- data/lib/mongoid/atomic/paths/embedded.rb +43 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
- data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
- data/lib/mongoid/atomic/paths/root.rb +40 -0
- data/lib/mongoid/attributes.rb +12 -23
- data/lib/mongoid/attributes/processing.rb +5 -5
- data/lib/mongoid/callbacks.rb +2 -0
- data/lib/mongoid/collection.rb +12 -59
- data/lib/mongoid/collections.rb +23 -20
- data/lib/mongoid/collections/master.rb +6 -4
- data/lib/mongoid/collections/operations.rb +1 -0
- data/lib/mongoid/collections/retry.rb +7 -0
- data/lib/mongoid/components.rb +2 -2
- data/lib/mongoid/config.rb +42 -55
- data/lib/mongoid/config/database.rb +6 -2
- data/lib/mongoid/config/replset_database.rb +7 -3
- data/lib/mongoid/contexts.rb +9 -3
- data/lib/mongoid/contexts/enumerable.rb +7 -3
- data/lib/mongoid/contexts/mongo.rb +139 -101
- data/lib/mongoid/criteria.rb +86 -69
- data/lib/mongoid/criterion/complex.rb +32 -5
- data/lib/mongoid/criterion/inclusion.rb +4 -2
- data/lib/mongoid/criterion/optional.rb +111 -86
- data/lib/mongoid/criterion/selector.rb +8 -4
- data/lib/mongoid/cursor.rb +27 -27
- data/lib/mongoid/dirty.rb +54 -214
- data/lib/mongoid/document.rb +37 -39
- data/lib/mongoid/errors/document_not_found.rb +3 -4
- data/lib/mongoid/errors/invalid_collection.rb +2 -3
- data/lib/mongoid/errors/invalid_database.rb +2 -3
- data/lib/mongoid/errors/invalid_field.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +19 -7
- data/lib/mongoid/errors/invalid_type.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +5 -6
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -3
- data/lib/mongoid/errors/unsupported_version.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -3
- data/lib/mongoid/extensions.rb +8 -62
- data/lib/mongoid/extensions/array/deletion.rb +29 -0
- data/lib/mongoid/extensions/false_class/equality.rb +14 -1
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -10
- data/lib/mongoid/extensions/hash/scoping.rb +14 -1
- data/lib/mongoid/extensions/nil/collectionization.rb +12 -1
- data/lib/mongoid/extensions/object/reflections.rb +33 -2
- data/lib/mongoid/extensions/object_id/conversions.rb +2 -36
- data/lib/mongoid/extensions/proc/scoping.rb +14 -1
- data/lib/mongoid/extensions/string/conversions.rb +4 -16
- data/lib/mongoid/extensions/string/inflections.rb +35 -14
- data/lib/mongoid/extensions/symbol/inflections.rb +38 -12
- data/lib/mongoid/extensions/true_class/equality.rb +14 -1
- data/lib/mongoid/extras.rb +11 -30
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +121 -29
- data/lib/mongoid/fields/mappings.rb +36 -0
- data/lib/mongoid/fields/serializable.rb +131 -0
- data/lib/mongoid/fields/serializable/array.rb +64 -0
- data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
- data/lib/mongoid/fields/serializable/bignum.rb +10 -0
- data/lib/mongoid/fields/serializable/binary.rb +11 -0
- data/lib/mongoid/fields/serializable/boolean.rb +44 -0
- data/lib/mongoid/fields/serializable/date.rb +51 -0
- data/lib/mongoid/fields/serializable/date_time.rb +28 -0
- data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
- data/lib/mongoid/fields/serializable/float.rb +33 -0
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +56 -0
- data/lib/mongoid/fields/serializable/foreign_keys/object.rb +43 -0
- data/lib/mongoid/fields/serializable/hash.rb +25 -0
- data/lib/mongoid/fields/serializable/integer.rb +33 -0
- data/lib/mongoid/fields/serializable/object.rb +11 -0
- data/lib/mongoid/fields/serializable/object_id.rb +32 -0
- data/lib/mongoid/fields/serializable/range.rb +42 -0
- data/lib/mongoid/fields/serializable/set.rb +42 -0
- data/lib/mongoid/fields/serializable/string.rb +28 -0
- data/lib/mongoid/fields/serializable/symbol.rb +28 -0
- data/lib/mongoid/fields/serializable/time.rb +12 -0
- data/lib/mongoid/fields/serializable/time_with_zone.rb +12 -0
- data/lib/mongoid/fields/serializable/timekeeping.rb +102 -0
- data/lib/mongoid/finders.rb +61 -37
- data/lib/mongoid/hierarchy.rb +43 -8
- data/lib/mongoid/identity_map.rb +106 -0
- data/lib/mongoid/indexes.rb +17 -1
- data/lib/mongoid/javascript.rb +2 -3
- data/lib/mongoid/keys.rb +10 -21
- data/lib/mongoid/logger.rb +22 -1
- data/lib/mongoid/matchers/all.rb +10 -0
- data/lib/mongoid/matchers/default.rb +1 -1
- data/lib/mongoid/matchers/exists.rb +10 -0
- data/lib/mongoid/matchers/gt.rb +10 -0
- data/lib/mongoid/matchers/gte.rb +10 -0
- data/lib/mongoid/matchers/in.rb +10 -0
- data/lib/mongoid/matchers/lt.rb +10 -0
- data/lib/mongoid/matchers/lte.rb +10 -0
- data/lib/mongoid/matchers/ne.rb +10 -0
- data/lib/mongoid/matchers/nin.rb +10 -0
- data/lib/mongoid/matchers/or.rb +7 -4
- data/lib/mongoid/matchers/size.rb +10 -0
- data/lib/mongoid/multi_database.rb +26 -6
- data/lib/mongoid/multi_parameter_attributes.rb +40 -17
- data/lib/mongoid/named_scope.rb +1 -2
- data/lib/mongoid/nested_attributes.rb +4 -1
- data/lib/mongoid/observer.rb +108 -5
- data/lib/mongoid/paranoia.rb +26 -26
- data/lib/mongoid/persistence.rb +15 -21
- data/lib/mongoid/persistence/atomic.rb +135 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +11 -8
- data/lib/mongoid/persistence/atomic/bit.rb +37 -0
- data/lib/mongoid/persistence/atomic/inc.rb +9 -6
- data/lib/mongoid/persistence/atomic/operation.rb +48 -7
- data/lib/mongoid/persistence/atomic/pop.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +10 -9
- data/lib/mongoid/persistence/atomic/push.rb +8 -5
- data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
- data/lib/mongoid/persistence/atomic/rename.rb +31 -0
- data/lib/mongoid/persistence/atomic/set.rb +30 -0
- data/lib/mongoid/persistence/atomic/unset.rb +28 -0
- data/lib/mongoid/persistence/deletion.rb +32 -0
- data/lib/mongoid/persistence/insertion.rb +41 -0
- data/lib/mongoid/persistence/modification.rb +37 -0
- data/lib/mongoid/persistence/operations.rb +214 -0
- data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
- data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
- data/lib/mongoid/persistence/operations/insert.rb +34 -0
- data/lib/mongoid/persistence/operations/remove.rb +33 -0
- data/lib/mongoid/persistence/operations/update.rb +53 -0
- data/lib/mongoid/railtie.rb +21 -33
- data/lib/mongoid/railties/database.rake +12 -12
- data/lib/mongoid/relations.rb +9 -5
- data/lib/mongoid/relations/accessors.rb +15 -36
- data/lib/mongoid/relations/auto_save.rb +2 -2
- data/lib/mongoid/relations/binding.rb +28 -1
- data/lib/mongoid/relations/bindings/embedded/in.rb +17 -30
- data/lib/mongoid/relations/bindings/embedded/many.rb +16 -21
- data/lib/mongoid/relations/bindings/embedded/one.rb +11 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -32
- data/lib/mongoid/relations/bindings/referenced/many.rb +19 -61
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -63
- data/lib/mongoid/relations/bindings/referenced/one.rb +18 -26
- data/lib/mongoid/relations/builder.rb +4 -2
- data/lib/mongoid/relations/builders.rb +21 -2
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -1
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -4
- data/lib/mongoid/relations/builders/embedded/one.rb +5 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -2
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/in.rb +2 -5
- data/lib/mongoid/relations/builders/referenced/many.rb +2 -3
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +14 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +2 -3
- data/lib/mongoid/relations/embedded/atomic.rb +2 -2
- data/lib/mongoid/relations/embedded/in.rb +72 -41
- data/lib/mongoid/relations/embedded/many.rb +116 -120
- data/lib/mongoid/relations/embedded/one.rb +59 -41
- data/lib/mongoid/relations/embedded/sort.rb +31 -0
- data/lib/mongoid/relations/macros.rb +28 -24
- data/lib/mongoid/relations/many.rb +10 -103
- data/lib/mongoid/relations/metadata.rb +335 -38
- data/lib/mongoid/relations/one.rb +7 -32
- data/lib/mongoid/relations/options.rb +47 -0
- data/lib/mongoid/relations/proxy.rb +29 -28
- data/lib/mongoid/relations/referenced/batch.rb +2 -3
- data/lib/mongoid/relations/referenced/in.rb +66 -53
- data/lib/mongoid/relations/referenced/many.rb +216 -143
- data/lib/mongoid/relations/referenced/many_to_many.rb +132 -163
- data/lib/mongoid/relations/referenced/one.rb +76 -58
- data/lib/mongoid/relations/synchronization.rb +113 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +329 -0
- data/lib/mongoid/safety.rb +24 -156
- data/lib/mongoid/serialization.rb +21 -0
- data/lib/mongoid/state.rb +34 -0
- data/lib/mongoid/threaded.rb +175 -0
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/validations.rb +3 -7
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +61 -7
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +1 -1
- data/lib/rails/generators/mongoid/model/templates/{model.rb → model.rb.tt} +0 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +1 -1
- data/lib/rails/generators/mongoid/observer/templates/{observer.rb → observer.rb.tt} +0 -0
- data/lib/rails/mongoid.rb +17 -17
- metadata +136 -102
- data/lib/mongoid/atomicity.rb +0 -111
- data/lib/mongoid/collections/cyclic_iterator.rb +0 -34
- data/lib/mongoid/collections/slaves.rb +0 -61
- data/lib/mongoid/extensions/array/conversions.rb +0 -23
- data/lib/mongoid/extensions/array/parentization.rb +0 -13
- data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
- data/lib/mongoid/extensions/binary/conversions.rb +0 -17
- data/lib/mongoid/extensions/boolean/conversions.rb +0 -27
- data/lib/mongoid/extensions/date/conversions.rb +0 -25
- data/lib/mongoid/extensions/datetime/conversions.rb +0 -12
- data/lib/mongoid/extensions/float/conversions.rb +0 -20
- data/lib/mongoid/extensions/hash/conversions.rb +0 -19
- data/lib/mongoid/extensions/integer/conversions.rb +0 -20
- data/lib/mongoid/extensions/object/conversions.rb +0 -25
- data/lib/mongoid/extensions/range/conversions.rb +0 -25
- data/lib/mongoid/extensions/set/conversions.rb +0 -20
- data/lib/mongoid/extensions/symbol/conversions.rb +0 -21
- data/lib/mongoid/extensions/time_conversions.rb +0 -38
- data/lib/mongoid/field.rb +0 -162
- data/lib/mongoid/paths.rb +0 -61
- data/lib/mongoid/persistence/command.rb +0 -71
- data/lib/mongoid/persistence/insert.rb +0 -53
- data/lib/mongoid/persistence/insert_embedded.rb +0 -43
- data/lib/mongoid/persistence/remove.rb +0 -44
- data/lib/mongoid/persistence/remove_all.rb +0 -40
- data/lib/mongoid/persistence/remove_embedded.rb +0 -48
- data/lib/mongoid/persistence/update.rb +0 -77
- data/lib/mongoid/safe.rb +0 -23
- data/lib/mongoid/validations/referenced.rb +0 -58
|
@@ -3,11 +3,22 @@ module Mongoid #:nodoc:
|
|
|
3
3
|
module Persistence #:nodoc:
|
|
4
4
|
module Atomic #:nodoc:
|
|
5
5
|
|
|
6
|
-
# This is the
|
|
7
|
-
|
|
8
|
-
include Mongoid::Safe
|
|
6
|
+
# This is the included module for all atomic operation objects.
|
|
7
|
+
module Operation
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
attr_accessor :document, :field, :value, :options
|
|
10
|
+
|
|
11
|
+
# Get the collection to be used for persistence.
|
|
12
|
+
#
|
|
13
|
+
# @example Get the collection.
|
|
14
|
+
# operation.collection
|
|
15
|
+
#
|
|
16
|
+
# @return [ Collection ] The root collection.
|
|
17
|
+
#
|
|
18
|
+
# @since 2.1.0
|
|
19
|
+
def collection
|
|
20
|
+
document._root.collection
|
|
21
|
+
end
|
|
11
22
|
|
|
12
23
|
# Initialize the new pullAll operation.
|
|
13
24
|
#
|
|
@@ -21,8 +32,8 @@ module Mongoid #:nodoc:
|
|
|
21
32
|
#
|
|
22
33
|
# @since 2.0.0
|
|
23
34
|
def initialize(document, field, value, options = {})
|
|
24
|
-
@document, @field, @value = document, field, value
|
|
25
|
-
@options =
|
|
35
|
+
@document, @field, @value = document, field.to_s, value
|
|
36
|
+
@options = Safety.merge_safety_options(options)
|
|
26
37
|
end
|
|
27
38
|
|
|
28
39
|
# Get the atomic operation to perform.
|
|
@@ -36,7 +47,37 @@ module Mongoid #:nodoc:
|
|
|
36
47
|
#
|
|
37
48
|
# @since 2.0.0
|
|
38
49
|
def operation(modifier)
|
|
39
|
-
{ modifier => {
|
|
50
|
+
{ modifier => { path => value } }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Get the path to the field that is getting atomically updated.
|
|
54
|
+
#
|
|
55
|
+
# @example Get the path.
|
|
56
|
+
# operation.path
|
|
57
|
+
#
|
|
58
|
+
# @return [ String, Symbol ] The path to the field.
|
|
59
|
+
#
|
|
60
|
+
# @since 2.1.0
|
|
61
|
+
def path
|
|
62
|
+
position = document.atomic_position
|
|
63
|
+
position.blank? ? field : "#{position}.#{field}"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# All atomic operations use this with a block to ensure saftey options
|
|
67
|
+
# clear out after the execution.
|
|
68
|
+
#
|
|
69
|
+
# @example Prepare the operation.
|
|
70
|
+
# prepare do
|
|
71
|
+
# collection.update
|
|
72
|
+
# end
|
|
73
|
+
#
|
|
74
|
+
# @return [ Object ] The yielded value.
|
|
75
|
+
#
|
|
76
|
+
# @since 2.1.0
|
|
77
|
+
def prepare
|
|
78
|
+
yield(document).tap do
|
|
79
|
+
Threaded.clear_safety_options!
|
|
80
|
+
end
|
|
40
81
|
end
|
|
41
82
|
end
|
|
42
83
|
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
module Atomic #:nodoc:
|
|
5
|
+
|
|
6
|
+
# This class provides the ability to perform an explicit $pop
|
|
7
|
+
# modification on a specific field.
|
|
8
|
+
class Pop
|
|
9
|
+
include Operation
|
|
10
|
+
|
|
11
|
+
# Sends the atomic $pop operation to the database.
|
|
12
|
+
#
|
|
13
|
+
# @example Persist the new values.
|
|
14
|
+
# pop.persist
|
|
15
|
+
#
|
|
16
|
+
# @return [ Object ] The new array value.
|
|
17
|
+
#
|
|
18
|
+
# @since 2.1.0
|
|
19
|
+
def persist
|
|
20
|
+
prepare do
|
|
21
|
+
if document[field]
|
|
22
|
+
values = document.send(field)
|
|
23
|
+
value > 0 ? values.pop : values.shift
|
|
24
|
+
values.tap do
|
|
25
|
+
collection.update(document.atomic_selector, operation("$pop"), options)
|
|
26
|
+
document.remove_change(field) if document.persisted?
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
module Atomic #:nodoc:
|
|
5
|
+
|
|
6
|
+
# This class provides the ability to perform an explicit $pull
|
|
7
|
+
# modification on a specific field.
|
|
8
|
+
class Pull
|
|
9
|
+
include Operation
|
|
10
|
+
|
|
11
|
+
# Sends the atomic $pull operation to the database.
|
|
12
|
+
#
|
|
13
|
+
# @example Persist the new values.
|
|
14
|
+
# pull.persist
|
|
15
|
+
#
|
|
16
|
+
# @return [ Object ] The new array value.
|
|
17
|
+
#
|
|
18
|
+
# @since 2.1.0
|
|
19
|
+
def persist
|
|
20
|
+
prepare do
|
|
21
|
+
if document[field]
|
|
22
|
+
values = document.send(field)
|
|
23
|
+
values.delete(value)
|
|
24
|
+
values.tap do
|
|
25
|
+
collection.update(document.atomic_selector, operation("$pull"), options)
|
|
26
|
+
document.remove_change(field) if document.persisted?
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -5,7 +5,8 @@ module Mongoid #:nodoc:
|
|
|
5
5
|
|
|
6
6
|
# This class provides the ability to perform an explicit $pullAll
|
|
7
7
|
# modification on a specific field.
|
|
8
|
-
class PullAll
|
|
8
|
+
class PullAll
|
|
9
|
+
include Operation
|
|
9
10
|
|
|
10
11
|
# Sends the atomic $pullAll operation to the database.
|
|
11
12
|
#
|
|
@@ -16,15 +17,15 @@ module Mongoid #:nodoc:
|
|
|
16
17
|
#
|
|
17
18
|
# @since 2.0.0
|
|
18
19
|
def persist
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
prepare do
|
|
21
|
+
if document[field]
|
|
22
|
+
values = document.send(field)
|
|
23
|
+
values.delete_if { |val| value.include?(val) }
|
|
24
|
+
values.tap do
|
|
25
|
+
collection.update(document.atomic_selector, operation("$pullAll"), options)
|
|
26
|
+
document.remove_change(field) if document.persisted?
|
|
27
|
+
end
|
|
25
28
|
end
|
|
26
|
-
else
|
|
27
|
-
return nil
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
end
|
|
@@ -5,7 +5,8 @@ module Mongoid #:nodoc:
|
|
|
5
5
|
|
|
6
6
|
# This class provides the ability to perform an explicit $push modification
|
|
7
7
|
# on a specific field.
|
|
8
|
-
class Push
|
|
8
|
+
class Push
|
|
9
|
+
include Operation
|
|
9
10
|
|
|
10
11
|
# Sends the atomic $push operation to the database.
|
|
11
12
|
#
|
|
@@ -16,10 +17,12 @@ module Mongoid #:nodoc:
|
|
|
16
17
|
#
|
|
17
18
|
# @since 2.0.0
|
|
18
19
|
def persist
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
document.
|
|
22
|
-
|
|
20
|
+
prepare do
|
|
21
|
+
document[field] = [] unless document[field]
|
|
22
|
+
document.send(field).push(value).tap do |value|
|
|
23
|
+
collection.update(document.atomic_selector, operation("$push"), options)
|
|
24
|
+
document.remove_change(field)
|
|
25
|
+
end
|
|
23
26
|
end
|
|
24
27
|
end
|
|
25
28
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
module Atomic #:nodoc:
|
|
5
|
+
|
|
6
|
+
# This class provides the ability to perform an explicit $pushAll modification
|
|
7
|
+
# on a specific field.
|
|
8
|
+
class PushAll
|
|
9
|
+
include Operation
|
|
10
|
+
|
|
11
|
+
# Sends the atomic $pushAll operation to the database.
|
|
12
|
+
#
|
|
13
|
+
# @example Persist the new values.
|
|
14
|
+
# pushAll.persist
|
|
15
|
+
#
|
|
16
|
+
# @return [ Object ] The new array value.
|
|
17
|
+
#
|
|
18
|
+
# @since 2.1.0
|
|
19
|
+
def persist
|
|
20
|
+
prepare do
|
|
21
|
+
document[field] = [] unless document[field]
|
|
22
|
+
document.send(field).concat(value).tap do |value|
|
|
23
|
+
collection.update(document.atomic_selector, operation("$pushAll"), options)
|
|
24
|
+
document.remove_change(field)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
module Atomic #:nodoc:
|
|
5
|
+
|
|
6
|
+
# Performs an atomic rename operation.
|
|
7
|
+
class Rename
|
|
8
|
+
include Operation
|
|
9
|
+
|
|
10
|
+
# Sends the atomic $inc operation to the database.
|
|
11
|
+
#
|
|
12
|
+
# @example Persist the new values.
|
|
13
|
+
# inc.persist
|
|
14
|
+
#
|
|
15
|
+
# @return [ Object ] The new integer value.
|
|
16
|
+
#
|
|
17
|
+
# @since 2.1.0
|
|
18
|
+
def persist
|
|
19
|
+
prepare do
|
|
20
|
+
@value = value.to_s
|
|
21
|
+
document[value] = document.attributes.delete(field)
|
|
22
|
+
document[value].tap do
|
|
23
|
+
collection.update(document.atomic_selector, operation("$rename"), options)
|
|
24
|
+
document.remove_change(value)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
module Atomic #:nodoc:
|
|
5
|
+
|
|
6
|
+
# This class provides atomic $set behaviour.
|
|
7
|
+
class Set
|
|
8
|
+
include Operation
|
|
9
|
+
|
|
10
|
+
# Sends the atomic $set operation to the database.
|
|
11
|
+
#
|
|
12
|
+
# @example Persist the new values.
|
|
13
|
+
# set.persist
|
|
14
|
+
#
|
|
15
|
+
# @return [ Object ] The new field value.
|
|
16
|
+
#
|
|
17
|
+
# @ssete 2.0.0
|
|
18
|
+
def persist
|
|
19
|
+
prepare do
|
|
20
|
+
value ? document[field] = value : @value = document[field]
|
|
21
|
+
document[field].tap do
|
|
22
|
+
collection.update(document.atomic_selector, operation("$set"), options)
|
|
23
|
+
document.remove_change(field)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
module Atomic #:nodoc:
|
|
5
|
+
|
|
6
|
+
# Performs atomic $unset operations.
|
|
7
|
+
class Unset
|
|
8
|
+
include Operation
|
|
9
|
+
|
|
10
|
+
# Sends the atomic $unset operation to the database.
|
|
11
|
+
#
|
|
12
|
+
# @example Persist the new values.
|
|
13
|
+
# unset.persist
|
|
14
|
+
#
|
|
15
|
+
# @return [ nil ] The new value.
|
|
16
|
+
#
|
|
17
|
+
# @since 2.1.0
|
|
18
|
+
def persist
|
|
19
|
+
prepare do
|
|
20
|
+
document.attributes.delete(field)
|
|
21
|
+
collection.update(document.atomic_selector, operation("$unset"), options)
|
|
22
|
+
document.remove_change(value)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Contains common logic for delete operations.
|
|
6
|
+
module Deletion
|
|
7
|
+
|
|
8
|
+
# Wrap all the common delete logic for both root and embedded
|
|
9
|
+
# documents and then yield to the block.
|
|
10
|
+
#
|
|
11
|
+
# @example Execute common delete logic.
|
|
12
|
+
# prepare do |doc|
|
|
13
|
+
# collection.remove({ :_id => "value })
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# @param [ Proc ] block The block to call.
|
|
17
|
+
#
|
|
18
|
+
# @return [ true ] Always true.
|
|
19
|
+
#
|
|
20
|
+
# @since 2.1.0
|
|
21
|
+
def prepare(&block)
|
|
22
|
+
yield(document)
|
|
23
|
+
document.freeze
|
|
24
|
+
document.destroyed = true
|
|
25
|
+
document.cascade!
|
|
26
|
+
IdentityMap.remove(document)
|
|
27
|
+
Threaded.clear_safety_options!
|
|
28
|
+
true
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Contains common logic for insertion operations.
|
|
6
|
+
module Insertion
|
|
7
|
+
|
|
8
|
+
# Wrap all the common insertion logic for both root and embedded
|
|
9
|
+
# documents and then yield to the block.
|
|
10
|
+
#
|
|
11
|
+
# @example Execute common insertion logic.
|
|
12
|
+
# prepare do |doc|
|
|
13
|
+
# collection.insert({ :field => "value })
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# @param [ Proc ] block The block to call.
|
|
17
|
+
#
|
|
18
|
+
# @return [ Document ] The inserted document.
|
|
19
|
+
#
|
|
20
|
+
# @since 2.1.0
|
|
21
|
+
def prepare(&block)
|
|
22
|
+
document.tap do |doc|
|
|
23
|
+
unless validating? && document.invalid?(:create)
|
|
24
|
+
result = doc.run_callbacks(:save) do
|
|
25
|
+
doc.run_callbacks(:create) do
|
|
26
|
+
yield(doc)
|
|
27
|
+
doc.new_record = false
|
|
28
|
+
doc.reset_persisted_children and true
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
unless result == false
|
|
33
|
+
doc.move_changes
|
|
34
|
+
Threaded.clear_safety_options!
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Contains common logic for modification operations.
|
|
6
|
+
module Modification
|
|
7
|
+
|
|
8
|
+
# Wrap all the common modification logic for both root and embedded
|
|
9
|
+
# documents and then yield to the block.
|
|
10
|
+
#
|
|
11
|
+
# @example Execute common modification logic.
|
|
12
|
+
# prepare do |doc|
|
|
13
|
+
# collection.update({ :_id => 1 }, { :field => "value })
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# @param [ Proc ] block The block to call.
|
|
17
|
+
#
|
|
18
|
+
# @return [ true, false ] If the save passed or not.
|
|
19
|
+
#
|
|
20
|
+
# @since 2.1.0
|
|
21
|
+
def prepare(&block)
|
|
22
|
+
return false if validating? && document.invalid?(:update)
|
|
23
|
+
document.run_callbacks(:save) do
|
|
24
|
+
document.run_callbacks(:update) do
|
|
25
|
+
yield(document); true
|
|
26
|
+
end
|
|
27
|
+
end.tap do |result|
|
|
28
|
+
unless result == false
|
|
29
|
+
document.reset_persisted_children
|
|
30
|
+
document.move_changes
|
|
31
|
+
Threaded.clear_safety_options!
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|