mongoid-braxton 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +20 -0
- data/README.rdoc +50 -0
- data/Rakefile +51 -0
- data/lib/config/locales/bg.yml +41 -0
- data/lib/config/locales/de.yml +41 -0
- data/lib/config/locales/en.yml +45 -0
- data/lib/config/locales/es.yml +41 -0
- data/lib/config/locales/fr.yml +42 -0
- data/lib/config/locales/hu.yml +44 -0
- data/lib/config/locales/id.yml +46 -0
- data/lib/config/locales/it.yml +39 -0
- data/lib/config/locales/ja.yml +40 -0
- data/lib/config/locales/kr.yml +65 -0
- data/lib/config/locales/nl.yml +39 -0
- data/lib/config/locales/pl.yml +39 -0
- data/lib/config/locales/pt-BR.yml +40 -0
- data/lib/config/locales/pt.yml +40 -0
- data/lib/config/locales/ro.yml +46 -0
- data/lib/config/locales/ru.yml +41 -0
- data/lib/config/locales/sv.yml +40 -0
- data/lib/config/locales/vi.yml +45 -0
- data/lib/config/locales/zh-CN.yml +33 -0
- data/lib/mongoid.rb +140 -0
- data/lib/mongoid/atomicity.rb +111 -0
- data/lib/mongoid/attributes.rb +185 -0
- data/lib/mongoid/attributes/processing.rb +145 -0
- data/lib/mongoid/callbacks.rb +23 -0
- data/lib/mongoid/collection.rb +137 -0
- data/lib/mongoid/collections.rb +71 -0
- data/lib/mongoid/collections/master.rb +37 -0
- data/lib/mongoid/collections/operations.rb +42 -0
- data/lib/mongoid/collections/retry.rb +39 -0
- data/lib/mongoid/components.rb +45 -0
- data/lib/mongoid/config.rb +349 -0
- data/lib/mongoid/config/database.rb +167 -0
- data/lib/mongoid/config/replset_database.rb +78 -0
- data/lib/mongoid/contexts.rb +19 -0
- data/lib/mongoid/contexts/enumerable.rb +275 -0
- data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
- data/lib/mongoid/contexts/mongo.rb +345 -0
- data/lib/mongoid/copyable.rb +46 -0
- data/lib/mongoid/criteria.rb +357 -0
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/complex.rb +34 -0
- data/lib/mongoid/criterion/creational.rb +34 -0
- data/lib/mongoid/criterion/exclusion.rb +108 -0
- data/lib/mongoid/criterion/inclusion.rb +198 -0
- data/lib/mongoid/criterion/inspection.rb +22 -0
- data/lib/mongoid/criterion/optional.rb +193 -0
- data/lib/mongoid/criterion/selector.rb +143 -0
- data/lib/mongoid/criterion/unconvertable.rb +20 -0
- data/lib/mongoid/cursor.rb +86 -0
- data/lib/mongoid/default_scope.rb +36 -0
- data/lib/mongoid/dirty.rb +253 -0
- data/lib/mongoid/document.rb +284 -0
- data/lib/mongoid/errors.rb +13 -0
- data/lib/mongoid/errors/document_not_found.rb +29 -0
- data/lib/mongoid/errors/invalid_collection.rb +19 -0
- data/lib/mongoid/errors/invalid_database.rb +20 -0
- data/lib/mongoid/errors/invalid_field.rb +19 -0
- data/lib/mongoid/errors/invalid_options.rb +16 -0
- data/lib/mongoid/errors/invalid_type.rb +26 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/errors/mongoid_error.rb +27 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +21 -0
- data/lib/mongoid/errors/unsaved_document.rb +23 -0
- data/lib/mongoid/errors/unsupported_version.rb +21 -0
- data/lib/mongoid/errors/validations.rb +24 -0
- data/lib/mongoid/extensions.rb +123 -0
- data/lib/mongoid/extensions/array/conversions.rb +23 -0
- data/lib/mongoid/extensions/array/parentization.rb +13 -0
- data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
- data/lib/mongoid/extensions/binary/conversions.rb +17 -0
- data/lib/mongoid/extensions/boolean/conversions.rb +27 -0
- data/lib/mongoid/extensions/date/conversions.rb +25 -0
- data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
- data/lib/mongoid/extensions/false_class/equality.rb +13 -0
- data/lib/mongoid/extensions/float/conversions.rb +20 -0
- data/lib/mongoid/extensions/hash/conversions.rb +19 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +22 -0
- data/lib/mongoid/extensions/hash/scoping.rb +12 -0
- data/lib/mongoid/extensions/integer/conversions.rb +20 -0
- data/lib/mongoid/extensions/nil/collectionization.rb +12 -0
- data/lib/mongoid/extensions/object/checks.rb +32 -0
- data/lib/mongoid/extensions/object/conversions.rb +25 -0
- data/lib/mongoid/extensions/object/reflections.rb +17 -0
- data/lib/mongoid/extensions/object/yoda.rb +27 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +96 -0
- data/lib/mongoid/extensions/proc/scoping.rb +12 -0
- data/lib/mongoid/extensions/range/conversions.rb +25 -0
- data/lib/mongoid/extensions/set/conversions.rb +20 -0
- data/lib/mongoid/extensions/string/conversions.rb +34 -0
- data/lib/mongoid/extensions/string/inflections.rb +97 -0
- data/lib/mongoid/extensions/symbol/conversions.rb +21 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
- data/lib/mongoid/extensions/time_conversions.rb +38 -0
- data/lib/mongoid/extensions/true_class/equality.rb +13 -0
- data/lib/mongoid/extras.rb +42 -0
- data/lib/mongoid/factory.rb +37 -0
- data/lib/mongoid/field.rb +162 -0
- data/lib/mongoid/fields.rb +183 -0
- data/lib/mongoid/finders.rb +127 -0
- data/lib/mongoid/hierarchy.rb +85 -0
- data/lib/mongoid/identity.rb +92 -0
- data/lib/mongoid/indexes.rb +38 -0
- data/lib/mongoid/inspection.rb +54 -0
- data/lib/mongoid/javascript.rb +21 -0
- data/lib/mongoid/javascript/functions.yml +37 -0
- data/lib/mongoid/json.rb +16 -0
- data/lib/mongoid/keys.rb +131 -0
- data/lib/mongoid/logger.rb +18 -0
- data/lib/mongoid/matchers.rb +32 -0
- data/lib/mongoid/matchers/all.rb +11 -0
- data/lib/mongoid/matchers/default.rb +70 -0
- data/lib/mongoid/matchers/exists.rb +13 -0
- data/lib/mongoid/matchers/gt.rb +11 -0
- data/lib/mongoid/matchers/gte.rb +11 -0
- data/lib/mongoid/matchers/in.rb +11 -0
- data/lib/mongoid/matchers/lt.rb +11 -0
- data/lib/mongoid/matchers/lte.rb +11 -0
- data/lib/mongoid/matchers/ne.rb +11 -0
- data/lib/mongoid/matchers/nin.rb +11 -0
- data/lib/mongoid/matchers/or.rb +30 -0
- data/lib/mongoid/matchers/size.rb +11 -0
- data/lib/mongoid/matchers/strategies.rb +63 -0
- data/lib/mongoid/multi_database.rb +11 -0
- data/lib/mongoid/multi_parameter_attributes.rb +82 -0
- data/lib/mongoid/named_scope.rb +137 -0
- data/lib/mongoid/nested_attributes.rb +51 -0
- data/lib/mongoid/observer.rb +67 -0
- data/lib/mongoid/paranoia.rb +103 -0
- data/lib/mongoid/paths.rb +61 -0
- data/lib/mongoid/persistence.rb +240 -0
- data/lib/mongoid/persistence/atomic.rb +88 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +32 -0
- data/lib/mongoid/persistence/atomic/inc.rb +28 -0
- data/lib/mongoid/persistence/atomic/operation.rb +44 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +33 -0
- data/lib/mongoid/persistence/atomic/push.rb +28 -0
- data/lib/mongoid/persistence/command.rb +71 -0
- data/lib/mongoid/persistence/insert.rb +53 -0
- data/lib/mongoid/persistence/insert_embedded.rb +43 -0
- data/lib/mongoid/persistence/remove.rb +44 -0
- data/lib/mongoid/persistence/remove_all.rb +40 -0
- data/lib/mongoid/persistence/remove_embedded.rb +48 -0
- data/lib/mongoid/persistence/update.rb +77 -0
- data/lib/mongoid/railtie.rb +139 -0
- data/lib/mongoid/railties/database.rake +171 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +107 -0
- data/lib/mongoid/relations/accessors.rb +175 -0
- data/lib/mongoid/relations/auto_save.rb +34 -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 +82 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +98 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +66 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +74 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +96 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +103 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +66 -0
- data/lib/mongoid/relations/builder.rb +42 -0
- data/lib/mongoid/relations/builders.rb +79 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +25 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +32 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +26 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +126 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +29 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +47 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +29 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +27 -0
- data/lib/mongoid/relations/cascading.rb +55 -0
- data/lib/mongoid/relations/cascading/delete.rb +19 -0
- data/lib/mongoid/relations/cascading/destroy.rb +19 -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/cyclic.rb +103 -0
- data/lib/mongoid/relations/embedded/atomic.rb +86 -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 +173 -0
- data/lib/mongoid/relations/embedded/many.rb +499 -0
- data/lib/mongoid/relations/embedded/one.rb +170 -0
- data/lib/mongoid/relations/macros.rb +310 -0
- data/lib/mongoid/relations/many.rb +215 -0
- data/lib/mongoid/relations/metadata.rb +539 -0
- data/lib/mongoid/relations/nested_builder.rb +68 -0
- data/lib/mongoid/relations/one.rb +47 -0
- data/lib/mongoid/relations/polymorphic.rb +54 -0
- data/lib/mongoid/relations/proxy.rb +143 -0
- data/lib/mongoid/relations/referenced/batch.rb +71 -0
- data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
- data/lib/mongoid/relations/referenced/in.rb +216 -0
- data/lib/mongoid/relations/referenced/many.rb +516 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
- data/lib/mongoid/relations/referenced/one.rb +222 -0
- data/lib/mongoid/relations/reflections.rb +45 -0
- data/lib/mongoid/safe.rb +23 -0
- data/lib/mongoid/safety.rb +207 -0
- data/lib/mongoid/scope.rb +31 -0
- data/lib/mongoid/serialization.rb +99 -0
- data/lib/mongoid/sharding.rb +51 -0
- data/lib/mongoid/state.rb +67 -0
- data/lib/mongoid/timestamps.rb +14 -0
- data/lib/mongoid/timestamps/created.rb +31 -0
- data/lib/mongoid/timestamps/updated.rb +33 -0
- data/lib/mongoid/validations.rb +124 -0
- data/lib/mongoid/validations/associated.rb +44 -0
- data/lib/mongoid/validations/referenced.rb +58 -0
- data/lib/mongoid/validations/uniqueness.rb +85 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +113 -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 +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/mongoid_generator.rb +70 -0
- data/lib/rails/mongoid.rb +58 -0
- metadata +406 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
module Atomic #:nodoc:
|
|
5
|
+
|
|
6
|
+
# This is the superclass for all atomic operation objects.
|
|
7
|
+
class Operation
|
|
8
|
+
include Mongoid::Safe
|
|
9
|
+
|
|
10
|
+
attr_reader :document, :field, :value, :options
|
|
11
|
+
|
|
12
|
+
# Initialize the new pullAll operation.
|
|
13
|
+
#
|
|
14
|
+
# @example Create a new pullAll operation.
|
|
15
|
+
# PullAll.new(document, :aliases, [ "Bond" ])
|
|
16
|
+
#
|
|
17
|
+
# @param [ Document ] document The document to pullAll onto.
|
|
18
|
+
# @param [ Symbol ] field The name of the array field.
|
|
19
|
+
# @param [ Object ] value The value to pullAll.
|
|
20
|
+
# @param [ Hash ] options The persistence options.
|
|
21
|
+
#
|
|
22
|
+
# @since 2.0.0
|
|
23
|
+
def initialize(document, field, value, options = {})
|
|
24
|
+
@document, @field, @value = document, field, value
|
|
25
|
+
@options = { :safe => safe_mode?(options) }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Get the atomic operation to perform.
|
|
29
|
+
#
|
|
30
|
+
# @example Get the operation.
|
|
31
|
+
# inc.operation
|
|
32
|
+
#
|
|
33
|
+
# @param [ String ] modifier The modifier to use.
|
|
34
|
+
#
|
|
35
|
+
# @return [ Hash ] The atomic operation for the field and addition.
|
|
36
|
+
#
|
|
37
|
+
# @since 2.0.0
|
|
38
|
+
def operation(modifier)
|
|
39
|
+
{ modifier => { field => value } }
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
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 < Operation
|
|
9
|
+
|
|
10
|
+
# Sends the atomic $pullAll operation to the database.
|
|
11
|
+
#
|
|
12
|
+
# @example Persist the new values.
|
|
13
|
+
# pull_all.persist
|
|
14
|
+
#
|
|
15
|
+
# @return [ Object ] The new array value.
|
|
16
|
+
#
|
|
17
|
+
# @since 2.0.0
|
|
18
|
+
def persist
|
|
19
|
+
if document[field]
|
|
20
|
+
values = document.send(field)
|
|
21
|
+
values.delete_if { |val| value.include?(val) }
|
|
22
|
+
values.tap do
|
|
23
|
+
document.collection.update(document._selector, operation("$pullAll"), options)
|
|
24
|
+
document.changes.delete(field.to_s) if document.persisted?
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
return nil
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
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 < Operation
|
|
9
|
+
|
|
10
|
+
# Sends the atomic $push operation to the database.
|
|
11
|
+
#
|
|
12
|
+
# @example Persist the new values.
|
|
13
|
+
# push.persist
|
|
14
|
+
#
|
|
15
|
+
# @return [ Object ] The new array value.
|
|
16
|
+
#
|
|
17
|
+
# @since 2.0.0
|
|
18
|
+
def persist
|
|
19
|
+
document[field] = [] unless document[field]
|
|
20
|
+
document.send(field).push(value).tap do |value|
|
|
21
|
+
document.collection.update(document._selector, operation("$push"), options)
|
|
22
|
+
document.changes.delete(field.to_s)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
# Persistence commands extend from this class to get basic functionality on
|
|
5
|
+
# initialization.
|
|
6
|
+
class Command
|
|
7
|
+
include Mongoid::Safe
|
|
8
|
+
|
|
9
|
+
attr_reader \
|
|
10
|
+
:collection,
|
|
11
|
+
:document,
|
|
12
|
+
:klass,
|
|
13
|
+
:options,
|
|
14
|
+
:selector,
|
|
15
|
+
:suppress,
|
|
16
|
+
:validate
|
|
17
|
+
|
|
18
|
+
# Initialize the persistence +Command+.
|
|
19
|
+
#
|
|
20
|
+
# Options:
|
|
21
|
+
#
|
|
22
|
+
# document_or_class: The +Document+ or +Class+ to get the collection.
|
|
23
|
+
# options: Options like validation or safe mode.
|
|
24
|
+
# selector: Optional selector to use in query.
|
|
25
|
+
#
|
|
26
|
+
# Example:
|
|
27
|
+
#
|
|
28
|
+
# <tt>DeleteAll.new(Person, { :validate => true }, {})</tt>
|
|
29
|
+
def initialize(document_or_class, options = {}, selector = {})
|
|
30
|
+
init(document_or_class)
|
|
31
|
+
validate = options[:validate]
|
|
32
|
+
@suppress = options[:suppress]
|
|
33
|
+
@validate = (validate.nil? ? true : validate)
|
|
34
|
+
@selector = selector
|
|
35
|
+
@options = { :safe => safe_mode?(options) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
# Setup the proper instance variables based on if the supplied argument
|
|
41
|
+
# was a document object or a class object.
|
|
42
|
+
#
|
|
43
|
+
# Example:
|
|
44
|
+
#
|
|
45
|
+
# <tt>init(document_or_class)</tt>
|
|
46
|
+
#
|
|
47
|
+
# Options:
|
|
48
|
+
#
|
|
49
|
+
# document_or_class: A document or a class.
|
|
50
|
+
def init(document_or_class)
|
|
51
|
+
if document_or_class.is_a?(Mongoid::Document)
|
|
52
|
+
@document = document_or_class
|
|
53
|
+
@collection = @document.embedded? ? @document._root.collection : @document.collection
|
|
54
|
+
else
|
|
55
|
+
@klass = document_or_class
|
|
56
|
+
@collection = @klass.collection
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Should we suppress parent notifications?
|
|
61
|
+
#
|
|
62
|
+
# @example Suppress notifications?
|
|
63
|
+
# command.suppress?
|
|
64
|
+
#
|
|
65
|
+
# @return [ true, false ] Should the parent notifcations be suppressed.
|
|
66
|
+
def suppress?
|
|
67
|
+
!!@suppress
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Insert is a persistence command responsible for taking a document that
|
|
6
|
+
# has not been saved to the database and saving it.
|
|
7
|
+
#
|
|
8
|
+
# The underlying query resembles the following MongoDB query:
|
|
9
|
+
#
|
|
10
|
+
# collection.insert(
|
|
11
|
+
# { "_id" : 1, "field" : "value" },
|
|
12
|
+
# false
|
|
13
|
+
# );
|
|
14
|
+
class Insert < Command
|
|
15
|
+
|
|
16
|
+
# Insert the new document in the database. This delegates to the standard
|
|
17
|
+
# MongoDB collection's insert command.
|
|
18
|
+
#
|
|
19
|
+
# Example:
|
|
20
|
+
#
|
|
21
|
+
# <tt>Insert.persist</tt>
|
|
22
|
+
#
|
|
23
|
+
# Returns:
|
|
24
|
+
#
|
|
25
|
+
# The +Document+, whether the insert succeeded or not.
|
|
26
|
+
def persist
|
|
27
|
+
return document if validate && document.invalid?(:create)
|
|
28
|
+
document.run_callbacks(:save) do
|
|
29
|
+
document.run_callbacks(:create) do
|
|
30
|
+
if insert
|
|
31
|
+
document.new_record = false
|
|
32
|
+
document._children.each { |child| child.new_record = false }
|
|
33
|
+
document.move_changes
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end; document
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
# Insert the document into the database.
|
|
41
|
+
def insert
|
|
42
|
+
if document.embedded?
|
|
43
|
+
Persistence::InsertEmbedded.new(
|
|
44
|
+
document,
|
|
45
|
+
options.merge(:validate => validate)
|
|
46
|
+
).persist
|
|
47
|
+
else
|
|
48
|
+
collection.insert(document.as_document, options)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Insert is a persistence command responsible for taking a document that
|
|
6
|
+
# has not been saved to the database and saving it. This specific class
|
|
7
|
+
# handles the case when the document is embedded in another.
|
|
8
|
+
#
|
|
9
|
+
# The underlying query resembles the following MongoDB query:
|
|
10
|
+
#
|
|
11
|
+
# collection.insert(
|
|
12
|
+
# { "_id" : 1, "field" : "value" },
|
|
13
|
+
# false
|
|
14
|
+
# );
|
|
15
|
+
class InsertEmbedded < Command
|
|
16
|
+
|
|
17
|
+
# Insert the new document in the database. If the document's parent is a
|
|
18
|
+
# new record, we will call save on the parent, otherwise we will $push
|
|
19
|
+
# the document onto the parent.
|
|
20
|
+
#
|
|
21
|
+
# Example:
|
|
22
|
+
#
|
|
23
|
+
# <tt>Insert.persist</tt>
|
|
24
|
+
#
|
|
25
|
+
# Returns:
|
|
26
|
+
#
|
|
27
|
+
# The +Document+, whether the insert succeeded or not.
|
|
28
|
+
def persist
|
|
29
|
+
return document if validate && document.invalid?(:create)
|
|
30
|
+
parent = document._parent
|
|
31
|
+
if parent.new_record?
|
|
32
|
+
parent.insert
|
|
33
|
+
else
|
|
34
|
+
update = { document._inserter => { document._position => document.as_document } }
|
|
35
|
+
collection.update(parent._selector, update, options.merge(:multi => false))
|
|
36
|
+
document.new_record = false
|
|
37
|
+
document.move_changes
|
|
38
|
+
end
|
|
39
|
+
document
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Remove is a persistence command responsible for deleting a document from
|
|
6
|
+
# the database.
|
|
7
|
+
#
|
|
8
|
+
# The underlying query resembles the following MongoDB query:
|
|
9
|
+
#
|
|
10
|
+
# collection.remove(
|
|
11
|
+
# { "_id" : 1 },
|
|
12
|
+
# false
|
|
13
|
+
# );
|
|
14
|
+
class Remove < Command
|
|
15
|
+
|
|
16
|
+
# Remove the document from the database: delegates to the MongoDB
|
|
17
|
+
# collection remove method.
|
|
18
|
+
#
|
|
19
|
+
# Example:
|
|
20
|
+
#
|
|
21
|
+
# <tt>Remove.persist</tt>
|
|
22
|
+
#
|
|
23
|
+
# Returns:
|
|
24
|
+
#
|
|
25
|
+
# +true+ if success, +false+ if not.
|
|
26
|
+
def persist
|
|
27
|
+
remove
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
# Remove the document from the database.
|
|
32
|
+
def remove
|
|
33
|
+
if document.embedded?
|
|
34
|
+
Persistence::RemoveEmbedded.new(
|
|
35
|
+
document,
|
|
36
|
+
options.merge(:validate => validate, :suppress => suppress)
|
|
37
|
+
).persist
|
|
38
|
+
else
|
|
39
|
+
collection.remove({ :_id => document.id }, options)
|
|
40
|
+
end; true
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Remove is a persistence command responsible for deleting a document from
|
|
6
|
+
# the database.
|
|
7
|
+
#
|
|
8
|
+
# The underlying query resembles the following MongoDB query:
|
|
9
|
+
#
|
|
10
|
+
# collection.remove(
|
|
11
|
+
# { "field" : value },
|
|
12
|
+
# false
|
|
13
|
+
# );
|
|
14
|
+
class RemoveAll < Command
|
|
15
|
+
|
|
16
|
+
# Remove the document from the database: delegates to the MongoDB
|
|
17
|
+
# collection remove method.
|
|
18
|
+
#
|
|
19
|
+
# Example:
|
|
20
|
+
#
|
|
21
|
+
# <tt>Remove.persist</tt>
|
|
22
|
+
#
|
|
23
|
+
# Returns:
|
|
24
|
+
#
|
|
25
|
+
# +true+ if success, +false+ if not.
|
|
26
|
+
def persist
|
|
27
|
+
remove
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
# Remove the document from the database.
|
|
32
|
+
def remove
|
|
33
|
+
select = (klass.hereditary? ? selector.merge(:_type => klass.name) : selector)
|
|
34
|
+
collection.find(select).count.tap do
|
|
35
|
+
collection.remove(select, options)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Remove is a persistence command responsible for deleting a document from
|
|
6
|
+
# the database.
|
|
7
|
+
#
|
|
8
|
+
# The underlying query resembles the following MongoDB query:
|
|
9
|
+
#
|
|
10
|
+
# collection.remove(
|
|
11
|
+
# { "_id" : 1 },
|
|
12
|
+
# false
|
|
13
|
+
# );
|
|
14
|
+
class RemoveEmbedded < Command
|
|
15
|
+
|
|
16
|
+
# Remove the document from the database. If the parent is a new record,
|
|
17
|
+
# it will get removed in Ruby only. If the parent is not a new record
|
|
18
|
+
# then either an $unset or $set will occur, depending if it's an
|
|
19
|
+
# embeds_one or embeds_many.
|
|
20
|
+
#
|
|
21
|
+
# Example:
|
|
22
|
+
#
|
|
23
|
+
# <tt>RemoveEmbedded.persist</tt>
|
|
24
|
+
#
|
|
25
|
+
# Returns:
|
|
26
|
+
#
|
|
27
|
+
# +true+ or +false+, depending on if the removal passed.
|
|
28
|
+
def persist
|
|
29
|
+
parent = document._parent
|
|
30
|
+
parent.remove_child(document) unless suppress?
|
|
31
|
+
unless parent.new_record?
|
|
32
|
+
update = { document._remover => removal_selector }
|
|
33
|
+
collection.update(parent._selector, update, options.merge(:multi => false))
|
|
34
|
+
end; true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
# Get the value to pass to the removal modifier.
|
|
39
|
+
def setter
|
|
40
|
+
document._index ? document.id : true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def removal_selector
|
|
44
|
+
document._index ? { document._pull => { "_id" => document.id } } : { document._path => setter }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Persistence #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Update is a persistence command responsible for taking a document that
|
|
6
|
+
# has already been saved to the database and saving it, depending on
|
|
7
|
+
# whether or not the document has been modified.
|
|
8
|
+
#
|
|
9
|
+
# Before persisting the command will check via dirty attributes if the
|
|
10
|
+
# document has changed, if not, it will simply return true. If it has it
|
|
11
|
+
# will go through the validation steps, run callbacks, and set the changed
|
|
12
|
+
# fields atomically on the document. The underlying query resembles the
|
|
13
|
+
# following MongoDB query:
|
|
14
|
+
#
|
|
15
|
+
# collection.update(
|
|
16
|
+
# { "_id" : 1,
|
|
17
|
+
# { "$set" : { "field" : "value" },
|
|
18
|
+
# false,
|
|
19
|
+
# false
|
|
20
|
+
# );
|
|
21
|
+
#
|
|
22
|
+
# For embedded documents it will use the positional locator:
|
|
23
|
+
#
|
|
24
|
+
# collection.update(
|
|
25
|
+
# { "_id" : 1, "addresses._id" : 2 },
|
|
26
|
+
# { "$set" : { "addresses.$.field" : "value" },
|
|
27
|
+
# false,
|
|
28
|
+
# false
|
|
29
|
+
# );
|
|
30
|
+
#
|
|
31
|
+
class Update < Command
|
|
32
|
+
|
|
33
|
+
# Persist the document that is to be updated to the database. This will
|
|
34
|
+
# only write changed fields via MongoDB's $set modifier operation.
|
|
35
|
+
#
|
|
36
|
+
# Example:
|
|
37
|
+
#
|
|
38
|
+
# <tt>Update.persist</tt>
|
|
39
|
+
#
|
|
40
|
+
# Returns:
|
|
41
|
+
#
|
|
42
|
+
# +true+ or +false+, depending on validation.
|
|
43
|
+
def persist
|
|
44
|
+
return false if validate && document.invalid?(:update)
|
|
45
|
+
document.run_callbacks(:save) do
|
|
46
|
+
document.run_callbacks(:update) do
|
|
47
|
+
if update
|
|
48
|
+
document.move_changes
|
|
49
|
+
document._children.each do |child|
|
|
50
|
+
child.move_changes
|
|
51
|
+
child.new_record = false if child.new_record?
|
|
52
|
+
end
|
|
53
|
+
true
|
|
54
|
+
else
|
|
55
|
+
return false
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
protected
|
|
62
|
+
# Update the document in the database atomically.
|
|
63
|
+
def update
|
|
64
|
+
updates = document._updates
|
|
65
|
+
unless updates.empty?
|
|
66
|
+
other_pushes = updates.delete(:other)
|
|
67
|
+
collection.update(document._selector, updates, options.merge(:multi => false))
|
|
68
|
+
collection.update(
|
|
69
|
+
document._selector,
|
|
70
|
+
{ "$pushAll" => other_pushes },
|
|
71
|
+
options.merge(:multi => false)
|
|
72
|
+
) if other_pushes
|
|
73
|
+
end; true
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|