mongoid-multi-db 3.0.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/CHANGELOG.md +615 -0
- data/LICENSE +20 -0
- data/README.md +62 -0
- data/Rakefile +49 -0
- data/lib/config/locales/bg.yml +54 -0
- data/lib/config/locales/de.yml +54 -0
- data/lib/config/locales/en-GB.yml +55 -0
- data/lib/config/locales/en.yml +55 -0
- data/lib/config/locales/es.yml +52 -0
- data/lib/config/locales/fr.yml +55 -0
- data/lib/config/locales/hi.yml +46 -0
- data/lib/config/locales/hu.yml +57 -0
- data/lib/config/locales/id.yml +55 -0
- data/lib/config/locales/it.yml +52 -0
- data/lib/config/locales/ja.yml +50 -0
- data/lib/config/locales/kr.yml +47 -0
- data/lib/config/locales/nl.yml +52 -0
- data/lib/config/locales/pl.yml +52 -0
- data/lib/config/locales/pt-BR.yml +53 -0
- data/lib/config/locales/pt.yml +53 -0
- data/lib/config/locales/ro.yml +59 -0
- data/lib/config/locales/ru.yml +54 -0
- data/lib/config/locales/sv.yml +53 -0
- data/lib/config/locales/vi.yml +55 -0
- data/lib/config/locales/zh-CN.yml +46 -0
- data/lib/mongoid.rb +148 -0
- data/lib/mongoid/atomic.rb +230 -0
- data/lib/mongoid/atomic/modifiers.rb +243 -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 +234 -0
- data/lib/mongoid/attributes/processing.rb +146 -0
- data/lib/mongoid/callbacks.rb +135 -0
- data/lib/mongoid/collection.rb +153 -0
- data/lib/mongoid/collection_proxy.rb +59 -0
- data/lib/mongoid/collections.rb +120 -0
- data/lib/mongoid/collections/master.rb +45 -0
- data/lib/mongoid/collections/operations.rb +44 -0
- data/lib/mongoid/collections/retry.rb +46 -0
- data/lib/mongoid/components.rb +96 -0
- data/lib/mongoid/config.rb +347 -0
- data/lib/mongoid/config/database.rb +186 -0
- data/lib/mongoid/config/replset_database.rb +82 -0
- data/lib/mongoid/connection_proxy.rb +30 -0
- data/lib/mongoid/contexts.rb +25 -0
- data/lib/mongoid/contexts/enumerable.rb +288 -0
- data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
- data/lib/mongoid/contexts/mongo.rb +409 -0
- data/lib/mongoid/copyable.rb +48 -0
- data/lib/mongoid/criteria.rb +418 -0
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/complex.rb +84 -0
- data/lib/mongoid/criterion/creational.rb +34 -0
- data/lib/mongoid/criterion/exclusion.rb +108 -0
- data/lib/mongoid/criterion/inclusion.rb +305 -0
- data/lib/mongoid/criterion/inspection.rb +22 -0
- data/lib/mongoid/criterion/optional.rb +232 -0
- data/lib/mongoid/criterion/selector.rb +153 -0
- data/lib/mongoid/cursor.rb +86 -0
- data/lib/mongoid/database_proxy.rb +97 -0
- data/lib/mongoid/default_scope.rb +36 -0
- data/lib/mongoid/dirty.rb +110 -0
- data/lib/mongoid/document.rb +280 -0
- data/lib/mongoid/errors.rb +17 -0
- data/lib/mongoid/errors/callback.rb +26 -0
- data/lib/mongoid/errors/document_not_found.rb +28 -0
- data/lib/mongoid/errors/eager_load.rb +25 -0
- data/lib/mongoid/errors/invalid_collection.rb +18 -0
- data/lib/mongoid/errors/invalid_database.rb +19 -0
- data/lib/mongoid/errors/invalid_field.rb +18 -0
- data/lib/mongoid/errors/invalid_find.rb +19 -0
- data/lib/mongoid/errors/invalid_options.rb +28 -0
- data/lib/mongoid/errors/invalid_time.rb +25 -0
- data/lib/mongoid/errors/invalid_type.rb +25 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/errors/mongoid_error.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
- data/lib/mongoid/errors/unsaved_document.rb +23 -0
- data/lib/mongoid/errors/unsupported_version.rb +20 -0
- data/lib/mongoid/errors/validations.rb +23 -0
- data/lib/mongoid/extensions.rb +82 -0
- data/lib/mongoid/extensions/array/deletion.rb +29 -0
- data/lib/mongoid/extensions/false_class/equality.rb +26 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
- data/lib/mongoid/extensions/hash/scoping.rb +25 -0
- data/lib/mongoid/extensions/integer/checks.rb +23 -0
- data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
- data/lib/mongoid/extensions/object/checks.rb +29 -0
- data/lib/mongoid/extensions/object/reflections.rb +48 -0
- data/lib/mongoid/extensions/object/substitutable.rb +15 -0
- data/lib/mongoid/extensions/object/yoda.rb +44 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
- data/lib/mongoid/extensions/proc/scoping.rb +25 -0
- data/lib/mongoid/extensions/string/checks.rb +36 -0
- data/lib/mongoid/extensions/string/conversions.rb +22 -0
- data/lib/mongoid/extensions/string/inflections.rb +118 -0
- data/lib/mongoid/extensions/symbol/checks.rb +23 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
- data/lib/mongoid/extensions/true_class/equality.rb +26 -0
- data/lib/mongoid/extras.rb +31 -0
- data/lib/mongoid/factory.rb +46 -0
- data/lib/mongoid/fields.rb +332 -0
- data/lib/mongoid/fields/mappings.rb +41 -0
- data/lib/mongoid/fields/serializable.rb +201 -0
- data/lib/mongoid/fields/serializable/array.rb +49 -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 +43 -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 +32 -0
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
- data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
- data/lib/mongoid/fields/serializable/hash.rb +11 -0
- data/lib/mongoid/fields/serializable/integer.rb +44 -0
- data/lib/mongoid/fields/serializable/localized.rb +41 -0
- data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
- data/lib/mongoid/fields/serializable/object.rb +11 -0
- data/lib/mongoid/fields/serializable/object_id.rb +31 -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 +27 -0
- data/lib/mongoid/fields/serializable/symbol.rb +27 -0
- data/lib/mongoid/fields/serializable/time.rb +23 -0
- data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
- data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
- data/lib/mongoid/finders.rb +152 -0
- data/lib/mongoid/hierarchy.rb +120 -0
- data/lib/mongoid/identity.rb +92 -0
- data/lib/mongoid/identity_map.rb +119 -0
- data/lib/mongoid/indexes.rb +54 -0
- data/lib/mongoid/inspection.rb +54 -0
- data/lib/mongoid/javascript.rb +20 -0
- data/lib/mongoid/javascript/functions.yml +63 -0
- data/lib/mongoid/json.rb +16 -0
- data/lib/mongoid/keys.rb +144 -0
- data/lib/mongoid/logger.rb +39 -0
- data/lib/mongoid/matchers.rb +32 -0
- data/lib/mongoid/matchers/all.rb +21 -0
- data/lib/mongoid/matchers/and.rb +30 -0
- data/lib/mongoid/matchers/default.rb +70 -0
- data/lib/mongoid/matchers/exists.rb +23 -0
- data/lib/mongoid/matchers/gt.rb +21 -0
- data/lib/mongoid/matchers/gte.rb +21 -0
- data/lib/mongoid/matchers/in.rb +21 -0
- data/lib/mongoid/matchers/lt.rb +21 -0
- data/lib/mongoid/matchers/lte.rb +21 -0
- data/lib/mongoid/matchers/ne.rb +21 -0
- data/lib/mongoid/matchers/nin.rb +21 -0
- data/lib/mongoid/matchers/or.rb +33 -0
- data/lib/mongoid/matchers/size.rb +21 -0
- data/lib/mongoid/matchers/strategies.rb +93 -0
- data/lib/mongoid/multi_database.rb +31 -0
- data/lib/mongoid/multi_parameter_attributes.rb +106 -0
- data/lib/mongoid/named_scope.rb +146 -0
- data/lib/mongoid/nested_attributes.rb +54 -0
- data/lib/mongoid/observer.rb +170 -0
- data/lib/mongoid/paranoia.rb +158 -0
- data/lib/mongoid/persistence.rb +264 -0
- data/lib/mongoid/persistence/atomic.rb +223 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
- data/lib/mongoid/persistence/atomic/bit.rb +37 -0
- data/lib/mongoid/persistence/atomic/inc.rb +31 -0
- data/lib/mongoid/persistence/atomic/operation.rb +85 -0
- 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 +34 -0
- data/lib/mongoid/persistence/atomic/push.rb +31 -0
- data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
- data/lib/mongoid/persistence/atomic/rename.rb +31 -0
- data/lib/mongoid/persistence/atomic/sets.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 +211 -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 +64 -0
- data/lib/mongoid/railtie.rb +126 -0
- data/lib/mongoid/railties/database.rake +182 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +144 -0
- data/lib/mongoid/relations/accessors.rb +138 -0
- data/lib/mongoid/relations/auto_save.rb +38 -0
- data/lib/mongoid/relations/binding.rb +26 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
- data/lib/mongoid/relations/builder.rb +57 -0
- data/lib/mongoid/relations/builders.rb +83 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
- data/lib/mongoid/relations/cascading.rb +56 -0
- data/lib/mongoid/relations/cascading/delete.rb +19 -0
- data/lib/mongoid/relations/cascading/destroy.rb +26 -0
- data/lib/mongoid/relations/cascading/nullify.rb +18 -0
- data/lib/mongoid/relations/cascading/strategy.rb +26 -0
- data/lib/mongoid/relations/constraint.rb +42 -0
- data/lib/mongoid/relations/conversions.rb +35 -0
- data/lib/mongoid/relations/cyclic.rb +103 -0
- data/lib/mongoid/relations/embedded/atomic.rb +89 -0
- data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
- data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
- data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
- data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
- data/lib/mongoid/relations/embedded/in.rb +220 -0
- data/lib/mongoid/relations/embedded/many.rb +560 -0
- data/lib/mongoid/relations/embedded/one.rb +206 -0
- data/lib/mongoid/relations/embedded/sort.rb +31 -0
- data/lib/mongoid/relations/macros.rb +310 -0
- data/lib/mongoid/relations/many.rb +135 -0
- data/lib/mongoid/relations/metadata.rb +919 -0
- data/lib/mongoid/relations/nested_builder.rb +75 -0
- data/lib/mongoid/relations/one.rb +36 -0
- data/lib/mongoid/relations/options.rb +47 -0
- data/lib/mongoid/relations/polymorphic.rb +40 -0
- data/lib/mongoid/relations/proxy.rb +145 -0
- data/lib/mongoid/relations/referenced/batch.rb +72 -0
- data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
- data/lib/mongoid/relations/referenced/in.rb +262 -0
- data/lib/mongoid/relations/referenced/many.rb +623 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
- data/lib/mongoid/relations/referenced/one.rb +272 -0
- data/lib/mongoid/relations/reflections.rb +62 -0
- data/lib/mongoid/relations/synchronization.rb +153 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +372 -0
- data/lib/mongoid/reloading.rb +91 -0
- data/lib/mongoid/safety.rb +105 -0
- data/lib/mongoid/scope.rb +31 -0
- data/lib/mongoid/serialization.rb +134 -0
- data/lib/mongoid/sharding.rb +61 -0
- data/lib/mongoid/state.rb +97 -0
- data/lib/mongoid/threaded.rb +530 -0
- data/lib/mongoid/threaded/lifecycle.rb +192 -0
- data/lib/mongoid/timestamps.rb +15 -0
- data/lib/mongoid/timestamps/created.rb +24 -0
- data/lib/mongoid/timestamps/timeless.rb +50 -0
- data/lib/mongoid/timestamps/updated.rb +26 -0
- data/lib/mongoid/validations.rb +140 -0
- data/lib/mongoid/validations/associated.rb +46 -0
- data/lib/mongoid/validations/uniqueness.rb +145 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +185 -0
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
- data/lib/rails/generators/mongoid_generator.rb +70 -0
- data/lib/rails/mongoid.rb +91 -0
- metadata +465 -0
@@ -0,0 +1,35 @@
|
|
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 $addToSet
|
7
|
+
# modification on a specific field.
|
8
|
+
class AddToSet
|
9
|
+
include Operation
|
10
|
+
|
11
|
+
# Sends the atomic $addToSet operation to the database.
|
12
|
+
#
|
13
|
+
# @example Persist the new values.
|
14
|
+
# addToSet.persist
|
15
|
+
#
|
16
|
+
# @return [ Object ] The new array value.
|
17
|
+
#
|
18
|
+
# @since 2.0.0
|
19
|
+
def persist
|
20
|
+
prepare do
|
21
|
+
document[field] = [] unless document[field]
|
22
|
+
values = document.send(field)
|
23
|
+
values.push(value) unless values.include?(value)
|
24
|
+
values.tap do
|
25
|
+
if document.persisted?
|
26
|
+
collection.update(document.atomic_selector, operation("$addToSet"), options)
|
27
|
+
document.remove_change(field)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
module Atomic #:nodoc:
|
5
|
+
|
6
|
+
# This operation is for performing $bit atomic operations against the
|
7
|
+
# database.
|
8
|
+
class Bit
|
9
|
+
include Operation
|
10
|
+
|
11
|
+
# Execute the bitwise operation. This correlates to a $bit in MongoDB.
|
12
|
+
#
|
13
|
+
# @example Execute the op.
|
14
|
+
# bit.persist
|
15
|
+
#
|
16
|
+
# @return [ Integer ] The new value.
|
17
|
+
#
|
18
|
+
# @since 2.1.0
|
19
|
+
def persist
|
20
|
+
prepare do
|
21
|
+
current = document[field]
|
22
|
+
return nil unless current
|
23
|
+
document[field] = value.inject(current) do |result, (bit, val)|
|
24
|
+
result = result & val if bit.to_s == "and"
|
25
|
+
result = result | val if bit.to_s == "or"
|
26
|
+
result
|
27
|
+
end
|
28
|
+
document[field].tap do
|
29
|
+
collection.update(document.atomic_selector, operation("$bit"), options)
|
30
|
+
document.remove_change(field)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
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 atomic $inc behaviour.
|
7
|
+
class Inc
|
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.0.0
|
18
|
+
def persist
|
19
|
+
prepare do
|
20
|
+
current = document[field] || 0
|
21
|
+
document[field] = current + value
|
22
|
+
document[field].tap do
|
23
|
+
collection.update(document.atomic_selector, operation("$inc"), options)
|
24
|
+
document.remove_change(field)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
module Atomic #:nodoc:
|
5
|
+
|
6
|
+
# This is the included module for all atomic operation objects.
|
7
|
+
module Operation
|
8
|
+
|
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
|
22
|
+
|
23
|
+
# Initialize the new pullAll operation.
|
24
|
+
#
|
25
|
+
# @example Create a new pullAll operation.
|
26
|
+
# PullAll.new(document, :aliases, [ "Bond" ])
|
27
|
+
#
|
28
|
+
# @param [ Document ] document The document to pullAll onto.
|
29
|
+
# @param [ Symbol ] field The name of the array field.
|
30
|
+
# @param [ Object ] value The value to pullAll.
|
31
|
+
# @param [ Hash ] options The persistence options.
|
32
|
+
#
|
33
|
+
# @since 2.0.0
|
34
|
+
def initialize(document, field, value, options = {})
|
35
|
+
@document, @field, @value = document, field.to_s, value
|
36
|
+
@options = Safety.merge_safety_options(options)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Get the atomic operation to perform.
|
40
|
+
#
|
41
|
+
# @example Get the operation.
|
42
|
+
# inc.operation
|
43
|
+
#
|
44
|
+
# @param [ String ] modifier The modifier to use.
|
45
|
+
#
|
46
|
+
# @return [ Hash ] The atomic operation for the field and addition.
|
47
|
+
#
|
48
|
+
# @since 2.0.0
|
49
|
+
def operation(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_options!
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
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
|
@@ -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 $pullAll
|
7
|
+
# modification on a specific field.
|
8
|
+
class PullAll
|
9
|
+
include Operation
|
10
|
+
|
11
|
+
# Sends the atomic $pullAll operation to the database.
|
12
|
+
#
|
13
|
+
# @example Persist the new values.
|
14
|
+
# pull_all.persist
|
15
|
+
#
|
16
|
+
# @return [ Object ] The new array value.
|
17
|
+
#
|
18
|
+
# @since 2.0.0
|
19
|
+
def persist
|
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
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
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 $push modification
|
7
|
+
# on a specific field.
|
8
|
+
class Push
|
9
|
+
include Operation
|
10
|
+
|
11
|
+
# Sends the atomic $push operation to the database.
|
12
|
+
#
|
13
|
+
# @example Persist the new values.
|
14
|
+
# push.persist
|
15
|
+
#
|
16
|
+
# @return [ Object ] The new array value.
|
17
|
+
#
|
18
|
+
# @since 2.0.0
|
19
|
+
def persist
|
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
|
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
|
+
# 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 Sets
|
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
|