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,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
|
+
document.cascade!
|
23
|
+
yield(document)
|
24
|
+
document.freeze
|
25
|
+
document.destroyed = true
|
26
|
+
IdentityMap.remove(document)
|
27
|
+
Threaded.clear_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_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_options!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/persistence/operations/insert"
|
3
|
+
require "mongoid/persistence/operations/remove"
|
4
|
+
require "mongoid/persistence/operations/update"
|
5
|
+
require "mongoid/persistence/operations/embedded/insert"
|
6
|
+
require "mongoid/persistence/operations/embedded/remove"
|
7
|
+
|
8
|
+
module Mongoid #:nodoc:
|
9
|
+
module Persistence #:nodoc:
|
10
|
+
|
11
|
+
# Persistence operations include this module to get basic functionality
|
12
|
+
# on initialization.
|
13
|
+
module Operations
|
14
|
+
|
15
|
+
attr_reader :conflicts, :document
|
16
|
+
|
17
|
+
# Get the collection we should be persisting to.
|
18
|
+
#
|
19
|
+
# @example Get the collection.
|
20
|
+
# operation.collection
|
21
|
+
#
|
22
|
+
# @return [ Collection ] The collection to persist to.
|
23
|
+
#
|
24
|
+
# @since 2.1.0
|
25
|
+
def collection
|
26
|
+
@collection ||= document._root.collection
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get the atomic delete operations for embedded documents.
|
30
|
+
#
|
31
|
+
# @example Get the atomic deletes.
|
32
|
+
# operation.deletes
|
33
|
+
#
|
34
|
+
# @return [ Hash ] The atomic delete selector.
|
35
|
+
#
|
36
|
+
# @since 2.1.0
|
37
|
+
def deletes
|
38
|
+
{ document.atomic_delete_modifier =>
|
39
|
+
{ document.atomic_path =>
|
40
|
+
document._index ? { "_id" => document.id } : true } }
|
41
|
+
end
|
42
|
+
|
43
|
+
# Instantiate the new persistence operation.
|
44
|
+
#
|
45
|
+
# @example Create the operation.
|
46
|
+
# Operation.new(document, { :safe => true }, { "field" => "value" })
|
47
|
+
#
|
48
|
+
# @param [ Document ] document The document to persist.
|
49
|
+
# @param [ Hash ] options The persistence options.
|
50
|
+
#
|
51
|
+
# @since 2.1.0
|
52
|
+
def initialize(document, options = {})
|
53
|
+
@document, @options = document, options
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get the atomic insert for embedded documents, either a push or set.
|
57
|
+
#
|
58
|
+
# @example Get the inserts.
|
59
|
+
# operation.inserts
|
60
|
+
#
|
61
|
+
# @return [ Hash ] The insert ops.
|
62
|
+
#
|
63
|
+
# @since 2.1.0
|
64
|
+
def inserts
|
65
|
+
{ document.atomic_insert_modifier =>
|
66
|
+
{ document.atomic_position => document.as_document } }
|
67
|
+
end
|
68
|
+
|
69
|
+
# Should the parent document (in the case of embedded persistence) be
|
70
|
+
# notified of the child deletion. This is used when calling delete from
|
71
|
+
# the associations themselves.
|
72
|
+
#
|
73
|
+
# @example Should the parent be notified?
|
74
|
+
# operation.notifying_parent?
|
75
|
+
#
|
76
|
+
# @return [ true, false ] If the parent should be notified.
|
77
|
+
#
|
78
|
+
# @since 2.1.0
|
79
|
+
def notifying_parent?
|
80
|
+
@notifying_parent ||= !@options.delete(:suppress)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Get all the options that will be sent to the database. Right now this
|
84
|
+
# is only safe mode opts.
|
85
|
+
#
|
86
|
+
# @example Get the options hash.
|
87
|
+
# operation.options
|
88
|
+
#
|
89
|
+
# @return [ Hash ] The options for the database.
|
90
|
+
#
|
91
|
+
# @since 2.1.0
|
92
|
+
def options
|
93
|
+
Safety.merge_safety_options(@options)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Get the parent of the provided document.
|
97
|
+
#
|
98
|
+
# @example Get the parent.
|
99
|
+
# operation.parent
|
100
|
+
#
|
101
|
+
# @return [ Document ] The parent document.
|
102
|
+
#
|
103
|
+
# @since 2.1.0
|
104
|
+
def parent
|
105
|
+
document._parent
|
106
|
+
end
|
107
|
+
|
108
|
+
# Get the atomic selector for the document.
|
109
|
+
#
|
110
|
+
# @example Get the selector.
|
111
|
+
# operation.selector.
|
112
|
+
#
|
113
|
+
# @return [ Hash ] The mongodb selector.
|
114
|
+
#
|
115
|
+
# @since 2.1.0
|
116
|
+
def selector
|
117
|
+
@selector ||= document.atomic_selector
|
118
|
+
end
|
119
|
+
|
120
|
+
# Get the atomic updates for the document without the conflicting
|
121
|
+
# modifications.
|
122
|
+
#
|
123
|
+
# @example Get the atomic updates.
|
124
|
+
# operation.updates
|
125
|
+
#
|
126
|
+
# @return [ Hash ] The updates sans conflicting mods.
|
127
|
+
#
|
128
|
+
# @since 2.1.0
|
129
|
+
def updates
|
130
|
+
@updates ||= init_updates
|
131
|
+
end
|
132
|
+
|
133
|
+
# Should we be running validations on this persistence operation?
|
134
|
+
# Defaults to true.
|
135
|
+
#
|
136
|
+
# @example Run validations?
|
137
|
+
# operation.validating?
|
138
|
+
#
|
139
|
+
# @return [ true, false ] If we run validations.
|
140
|
+
#
|
141
|
+
# @since 2.1.0
|
142
|
+
def validating?
|
143
|
+
@validating ||= @options[:validate].nil? ? true : @options[:validate]
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
# Initialize the atomic updates and conflicting modifications.
|
149
|
+
#
|
150
|
+
# @example Initialize the updates.
|
151
|
+
# operation.init_updates
|
152
|
+
#
|
153
|
+
# @return [ Hash ] The atomic updates.
|
154
|
+
#
|
155
|
+
# @since 2.1.0
|
156
|
+
def init_updates
|
157
|
+
document.atomic_updates.tap do |updates|
|
158
|
+
@conflicts = updates.delete(:conflicts) || {}
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
class << self
|
163
|
+
|
164
|
+
# Get the appropriate removal operation based on the document.
|
165
|
+
#
|
166
|
+
# @example Get the deletion operation.
|
167
|
+
# Operations.remove(doc, options)
|
168
|
+
#
|
169
|
+
# @param [ Document ] doc The document to persist.
|
170
|
+
# @param [ Hash ] options The persistence options.
|
171
|
+
#
|
172
|
+
# @return [ Operations ] The operation.
|
173
|
+
#
|
174
|
+
# @since 2.1.0
|
175
|
+
def remove(doc, options = {})
|
176
|
+
(doc.embedded? ? Embedded::Remove : Remove).new(doc, options)
|
177
|
+
end
|
178
|
+
|
179
|
+
# Get the appropriate insertion operation based on the document.
|
180
|
+
#
|
181
|
+
# @example Get the insertion operation.
|
182
|
+
# Operations.insert(doc, options)
|
183
|
+
#
|
184
|
+
# @param [ Document ] doc The document to persist.
|
185
|
+
# @param [ Hash ] options The persistence options.
|
186
|
+
#
|
187
|
+
# @return [ Operations ] The operation.
|
188
|
+
#
|
189
|
+
# @since 2.1.0
|
190
|
+
def insert(doc, options = {})
|
191
|
+
(doc.embedded? ? Embedded::Insert : Insert).new(doc, options)
|
192
|
+
end
|
193
|
+
|
194
|
+
# Get the appropriate update operation based on the document.
|
195
|
+
#
|
196
|
+
# @example Get the update operation.
|
197
|
+
# Operations.update(doc, options)
|
198
|
+
#
|
199
|
+
# @param [ Document ] doc The document to persist.
|
200
|
+
# @param [ Hash ] options The persistence options.
|
201
|
+
#
|
202
|
+
# @return [ Operations ] The operation.
|
203
|
+
#
|
204
|
+
# @since 2.1.0
|
205
|
+
def update(doc, options = {})
|
206
|
+
Update.new(doc, options)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
module Operations #:nodoc:
|
5
|
+
module Embedded #:nodoc:
|
6
|
+
|
7
|
+
# Insert is a persistence command responsible for taking a document that
|
8
|
+
# has not been saved to the database and saving it. This specific class
|
9
|
+
# handles the case when the document is embedded in another.
|
10
|
+
#
|
11
|
+
# The underlying query resembles the following MongoDB query:
|
12
|
+
#
|
13
|
+
# collection.update(
|
14
|
+
# { "_id" : 1 },
|
15
|
+
# { "$push" : { "field" : "value" } },
|
16
|
+
# false
|
17
|
+
# );
|
18
|
+
class Insert
|
19
|
+
include Insertion, Operations
|
20
|
+
|
21
|
+
# Insert the new document in the database. If the document's parent is a
|
22
|
+
# new record, we will call save on the parent, otherwise we will $push
|
23
|
+
# the document onto the parent.
|
24
|
+
#
|
25
|
+
# @example Insert an embedded document.
|
26
|
+
# Insert.persist
|
27
|
+
#
|
28
|
+
# @return [ Document ] The document to be inserted.
|
29
|
+
def persist
|
30
|
+
prepare do
|
31
|
+
if parent.new?
|
32
|
+
parent.insert
|
33
|
+
else
|
34
|
+
collection.update(parent.atomic_selector, inserts, options)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
module Operations #:nodoc:
|
5
|
+
module Embedded #:nodoc:
|
6
|
+
|
7
|
+
# Remove is a persistence command responsible for deleting a document from
|
8
|
+
# the database.
|
9
|
+
#
|
10
|
+
# The underlying query resembles the following MongoDB query:
|
11
|
+
#
|
12
|
+
# collection.remove(
|
13
|
+
# { "_id" : 1 },
|
14
|
+
# false
|
15
|
+
# );
|
16
|
+
class Remove
|
17
|
+
include Deletion, Operations
|
18
|
+
|
19
|
+
# Remove the document from the database. If the parent is a new record,
|
20
|
+
# it will get removed in Ruby only. If the parent is not a new record
|
21
|
+
# then either an $unset or $set will occur, depending if it's an
|
22
|
+
# embeds_one or embeds_many.
|
23
|
+
#
|
24
|
+
# @example Remove an embedded document.
|
25
|
+
# RemoveEmbedded.persist
|
26
|
+
#
|
27
|
+
# @return [ true ] Always true.
|
28
|
+
def persist
|
29
|
+
prepare do |doc|
|
30
|
+
parent.remove_child(doc) if notifying_parent?
|
31
|
+
if parent.persisted?
|
32
|
+
collection.update(parent.atomic_selector, deletes, options)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
module Operations #:nodoc:
|
5
|
+
|
6
|
+
# Insert is a persistence command responsible for taking a document that
|
7
|
+
# has not been saved to the database and saving it.
|
8
|
+
#
|
9
|
+
# The underlying query resembles the following MongoDB query:
|
10
|
+
#
|
11
|
+
# collection.insert(
|
12
|
+
# { "_id" : 1, "field" : "value" },
|
13
|
+
# false
|
14
|
+
# );
|
15
|
+
class Insert
|
16
|
+
include Insertion, Operations
|
17
|
+
|
18
|
+
# Insert the new document in the database. This delegates to the standard
|
19
|
+
# MongoDB collection's insert command.
|
20
|
+
#
|
21
|
+
# @example Insert the document.
|
22
|
+
# Insert.persist
|
23
|
+
#
|
24
|
+
# @return [ Document ] The document to be inserted.
|
25
|
+
def persist
|
26
|
+
prepare do |doc|
|
27
|
+
collection.insert(doc.as_document, options)
|
28
|
+
IdentityMap.set(doc)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Persistence #:nodoc:
|
4
|
+
module Operations #:nodoc:
|
5
|
+
|
6
|
+
# Remove is a persistence command responsible for deleting a document from
|
7
|
+
# the database.
|
8
|
+
#
|
9
|
+
# The underlying query resembles the following MongoDB query:
|
10
|
+
#
|
11
|
+
# collection.remove(
|
12
|
+
# { "_id" : 1 },
|
13
|
+
# false
|
14
|
+
# );
|
15
|
+
class Remove
|
16
|
+
include Deletion, Operations
|
17
|
+
|
18
|
+
# Remove the document from the database: delegates to the MongoDB
|
19
|
+
# collection remove method.
|
20
|
+
#
|
21
|
+
# @example Remove the document.
|
22
|
+
# Remove.persist
|
23
|
+
#
|
24
|
+
# @return [ true ] Always true.
|
25
|
+
def persist
|
26
|
+
prepare do |doc|
|
27
|
+
collection.remove({ :_id => doc.id }, options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|