mongoid 2.8.1 → 3.0.0.rc
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 +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +69 -50
- data/lib/mongoid/errors.rb +22 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/extensions/array.rb +127 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +26 -0
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- data/lib/mongoid/fields/foreign_key.rb +134 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +31 -19
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/javascript.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/multi_parameter_attributes.rb +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- data/lib/mongoid/persistence.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations.rb +6 -19
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- data/lib/mongoid/relations/accessors.rb +119 -19
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +3 -3
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/cascading.rb +6 -4
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +117 -132
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -3
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +69 -25
- metadata +110 -137
- checksums.yaml +0 -7
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -110
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -77
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
@@ -1,89 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "mongoid/relations/embedded/atomic/operation"
|
3
|
-
require "mongoid/relations/embedded/atomic/pull"
|
4
|
-
require "mongoid/relations/embedded/atomic/push_all"
|
5
|
-
require "mongoid/relations/embedded/atomic/set"
|
6
|
-
require "mongoid/relations/embedded/atomic/unset"
|
7
|
-
|
8
|
-
module Mongoid #:nodoc:
|
9
|
-
module Relations #:nodoc:
|
10
|
-
module Embedded #:nodoc:
|
11
|
-
|
12
|
-
# This module provides the ability for calls to be declared atomic.
|
13
|
-
module Atomic
|
14
|
-
|
15
|
-
MODIFIERS = {
|
16
|
-
:$pull => Pull,
|
17
|
-
:$pushAll => PushAll,
|
18
|
-
:$set => Set,
|
19
|
-
:$unset => Unset
|
20
|
-
}
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
# Executes a block of commands in an atomic fashion. Mongoid will
|
25
|
-
# intercept all database upserts while in this block and combine them
|
26
|
-
# into a single database call. When the block concludes the atomic
|
27
|
-
# update will occur.
|
28
|
-
#
|
29
|
-
# Since the collection is accessed through the class it would not be
|
30
|
-
# thread safe to give it state so we access the atomic updater via the
|
31
|
-
# current thread.
|
32
|
-
#
|
33
|
-
# @note This operation is not safe when attemping to do illegal updates
|
34
|
-
# for different objects or collections, since the updator is not
|
35
|
-
# scoped on the thread. This is meant for Mongoid internal use only
|
36
|
-
# to keep existing design clean.
|
37
|
-
#
|
38
|
-
# @example Atomically $set multiple saves.
|
39
|
-
# atomically(:$set) do
|
40
|
-
# address_one.save!
|
41
|
-
# address_two.save!
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# @example Atomically $pushAll multiple new docs.
|
45
|
-
# atomically(:$pushAll) do
|
46
|
-
# person.addresses.push([ address_one, address_two ])
|
47
|
-
# end
|
48
|
-
#
|
49
|
-
# @todo Durran: Move executions to thread local stack.
|
50
|
-
#
|
51
|
-
# @param [ Symbol ] modifier The atomic modifier to perform.
|
52
|
-
# @param [ Proc ] block The block to execute.
|
53
|
-
#
|
54
|
-
# @return [ Object ] The result of the operation.
|
55
|
-
#
|
56
|
-
# @since 2.0.0
|
57
|
-
def atomically(modifier, &block)
|
58
|
-
updater = Threaded.update_consumer(collection_name) ||
|
59
|
-
Threaded.set_update_consumer(collection_name, MODIFIERS[modifier].new)
|
60
|
-
count_executions do
|
61
|
-
block.call if block
|
62
|
-
end.tap do
|
63
|
-
if @executions.zero?
|
64
|
-
Threaded.set_update_consumer(collection_name, nil)
|
65
|
-
updater.execute(collection)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Execute the block, incrementing the executions before the call and
|
71
|
-
# decrementing them after in order to be able to nest blocks within
|
72
|
-
# each other.
|
73
|
-
#
|
74
|
-
# @example Execute and increment.
|
75
|
-
# execute { block.call }
|
76
|
-
#
|
77
|
-
# @param [ Proc ] block The block to call.
|
78
|
-
#
|
79
|
-
# @since 2.0.0
|
80
|
-
def count_executions(&block)
|
81
|
-
@executions ||= 0 and @executions += 1
|
82
|
-
block.call.tap do
|
83
|
-
@executions -=1
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid #:nodoc:
|
3
|
-
module Relations #:nodoc:
|
4
|
-
module Embedded #:nodoc:
|
5
|
-
module Atomic #:nodoc:
|
6
|
-
|
7
|
-
class Operation
|
8
|
-
attr_accessor :documents, :options, :path, :selector
|
9
|
-
|
10
|
-
# Consumes an execution that was supposed to hit the database, but is
|
11
|
-
# now being deferred to later in favor of a single update.
|
12
|
-
#
|
13
|
-
# @example Consume the operation.
|
14
|
-
# set.consume(
|
15
|
-
# { "_id" => BSON::ObjectId.new },
|
16
|
-
# { "$push" => { "addresses" => { "_id" => "street" } } },
|
17
|
-
# { :multi => false, :safe => true }
|
18
|
-
# )
|
19
|
-
#
|
20
|
-
# @param [ Hash ] selector The document selector.
|
21
|
-
# @param [ Hash ] operations The ops to set in the db.
|
22
|
-
# @param [ Hash ] options The persistence options.
|
23
|
-
#
|
24
|
-
# @option options [ true, false ] :multi Persist multiple at once.
|
25
|
-
# @option options [ true, false ] :safe Persist in safe mode.
|
26
|
-
#
|
27
|
-
# @since 2.0.0
|
28
|
-
def consume(selector, operations, options = {})
|
29
|
-
@consumed, @selector, @options = true, selector, options
|
30
|
-
@documents ||= []
|
31
|
-
parse(operations)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Has this operation consumed any executions?
|
35
|
-
#
|
36
|
-
# @example Is this consumed?
|
37
|
-
# unset.consumed?
|
38
|
-
#
|
39
|
-
# @return [ true, false ] If the operation has consumed anything.
|
40
|
-
#
|
41
|
-
# @since 2.0.0
|
42
|
-
def consumed?
|
43
|
-
!!@consumed
|
44
|
-
end
|
45
|
-
|
46
|
-
# Execute the $pushAll operation on the collection.
|
47
|
-
#
|
48
|
-
# @example Execute the operation.
|
49
|
-
# unset.execute(collection)
|
50
|
-
#
|
51
|
-
# @param [ Collection ] collection The root collection.
|
52
|
-
#
|
53
|
-
# @since 2.0.0
|
54
|
-
def execute(collection)
|
55
|
-
if collection && consumed?
|
56
|
-
collection.update(selector, operations, options)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid #:nodoc:
|
3
|
-
module Relations #:nodoc:
|
4
|
-
module Embedded #:nodoc:
|
5
|
-
module Atomic #:nodoc:
|
6
|
-
|
7
|
-
class Pull < Operation
|
8
|
-
|
9
|
-
# Get the merged operations for the single atomic set.
|
10
|
-
#
|
11
|
-
# @example Get the operations
|
12
|
-
# set.operations
|
13
|
-
#
|
14
|
-
# @return [ Hash ] The pull operations.
|
15
|
-
#
|
16
|
-
# @since 2.0.0
|
17
|
-
def operations
|
18
|
-
{ "$pull" =>
|
19
|
-
{ path =>
|
20
|
-
{ "_id" =>
|
21
|
-
{ "$in" => documents.map { |doc| doc["_id"] } }
|
22
|
-
}
|
23
|
-
}
|
24
|
-
}
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
# Parses the incoming operations to get the documents to set.
|
30
|
-
#
|
31
|
-
# @example Parse the operations.
|
32
|
-
# set.parse(
|
33
|
-
# { "$pull" => { "addresses" => { "_id" => "street" } } }
|
34
|
-
# )
|
35
|
-
#
|
36
|
-
# @param [ Hash ] operations The ops to parse.
|
37
|
-
#
|
38
|
-
# @since 2.0.0
|
39
|
-
def parse(operations)
|
40
|
-
modifier = operations.keys.first
|
41
|
-
extract(modifier, operations[modifier])
|
42
|
-
end
|
43
|
-
|
44
|
-
# Extract a document from the operation.
|
45
|
-
#
|
46
|
-
# @example Extract the document.
|
47
|
-
# set.extract({ "$pull" => [{ "_id" => "street" }] })
|
48
|
-
#
|
49
|
-
# @param [ Hash ] operation The op to extract from.
|
50
|
-
#
|
51
|
-
# @since 2.0.0
|
52
|
-
def extract(modifier, operations)
|
53
|
-
@path = operations.keys.first
|
54
|
-
case modifier
|
55
|
-
when "$pull"
|
56
|
-
documents.push(operations[path])
|
57
|
-
when "$pullAll"
|
58
|
-
documents.concat(operations[path])
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid #:nodoc:
|
3
|
-
module Relations #:nodoc:
|
4
|
-
module Embedded #:nodoc:
|
5
|
-
module Atomic #:nodoc:
|
6
|
-
|
7
|
-
class PushAll < Operation
|
8
|
-
|
9
|
-
# Get the merged operations for the single atomic set.
|
10
|
-
#
|
11
|
-
# @example Get the operations
|
12
|
-
# set.operations
|
13
|
-
#
|
14
|
-
# @return [ Hash ] The set operations.
|
15
|
-
#
|
16
|
-
# @since 2.0.0
|
17
|
-
def operations
|
18
|
-
{ "$pushAll" => { path => documents } }
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
# Parses the incoming operations to get the documents to set.
|
24
|
-
#
|
25
|
-
# @example Parse the operations.
|
26
|
-
# set.parse(
|
27
|
-
# { "$push" => { "addresses" => { "_id" => "street" } } }
|
28
|
-
# )
|
29
|
-
#
|
30
|
-
# @param [ Hash ] operations The ops to parse.
|
31
|
-
#
|
32
|
-
# @since 2.0.0
|
33
|
-
def parse(operations)
|
34
|
-
modifier = operations.keys.first
|
35
|
-
extract(modifier, operations[modifier])
|
36
|
-
end
|
37
|
-
|
38
|
-
# Extract a document from the operation.
|
39
|
-
#
|
40
|
-
# @example Extract the document.
|
41
|
-
# set.extract({ "$pushAll" => [{ "_id" => "street" }] })
|
42
|
-
#
|
43
|
-
# @param [ Hash ] operation The op to extract from.
|
44
|
-
#
|
45
|
-
# @since 2.0.0
|
46
|
-
def extract(modifier, operations)
|
47
|
-
@path = operations.keys.first
|
48
|
-
case modifier
|
49
|
-
when "$push"
|
50
|
-
documents.push(operations[path])
|
51
|
-
when "$pushAll"
|
52
|
-
documents.concat(operations[path])
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid #:nodoc:
|
3
|
-
module Relations #:nodoc:
|
4
|
-
module Embedded #:nodoc:
|
5
|
-
module Atomic #:nodoc:
|
6
|
-
|
7
|
-
class Set < Operation
|
8
|
-
|
9
|
-
# Get the merged operations for the single atomic set.
|
10
|
-
#
|
11
|
-
# @example Get the operations
|
12
|
-
# set.operations
|
13
|
-
#
|
14
|
-
# @return [ Hash ] The set operations.
|
15
|
-
#
|
16
|
-
# @since 2.0.0
|
17
|
-
def operations
|
18
|
-
{ "$set" => { path => documents } }
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
# Parses the incoming operations to get the documents to set.
|
24
|
-
#
|
25
|
-
# @example Parse the operations.
|
26
|
-
# set.parse(
|
27
|
-
# { "addresses" => { "$pushAll" => [{ "_id" => "street" }] } }
|
28
|
-
# )
|
29
|
-
#
|
30
|
-
# @param [ Hash ] operations The ops to parse.
|
31
|
-
#
|
32
|
-
# @since 2.0.0
|
33
|
-
def parse(operations)
|
34
|
-
modifier = operations.keys.first
|
35
|
-
extract(modifier, operations[modifier])
|
36
|
-
end
|
37
|
-
|
38
|
-
# Extract a document from the operation.
|
39
|
-
#
|
40
|
-
# @example Extract the document.
|
41
|
-
# set.extract({ "$pushAll" => [{ "_id" => "street" }] })
|
42
|
-
#
|
43
|
-
# @param [ Hash ] operation The op to extract from.
|
44
|
-
#
|
45
|
-
# @since 2.0.0
|
46
|
-
def extract(modifier, operations)
|
47
|
-
@path = operations.keys.first
|
48
|
-
case modifier
|
49
|
-
when "$push"
|
50
|
-
documents.push(operations[path])
|
51
|
-
when "$pushAll"
|
52
|
-
documents.push(operations[path].first)
|
53
|
-
when "$set"
|
54
|
-
@documents = operations[path]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
module Mongoid #:nodoc:
|
3
|
-
module Relations #:nodoc:
|
4
|
-
module Embedded #:nodoc:
|
5
|
-
module Atomic #:nodoc:
|
6
|
-
|
7
|
-
class Unset < Operation
|
8
|
-
|
9
|
-
# Get the merged operations for the single atomic set.
|
10
|
-
#
|
11
|
-
# @example Get the operations
|
12
|
-
# set.operations
|
13
|
-
#
|
14
|
-
# @return [ Hash ] The set operations.
|
15
|
-
#
|
16
|
-
# @since 2.0.0
|
17
|
-
def operations
|
18
|
-
{ "$unset" => { path => true } }
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
# Parses the incoming operations to get the documents to set.
|
24
|
-
#
|
25
|
-
# @example Parse the operations.
|
26
|
-
# set.parse(
|
27
|
-
# { "addresses" => { "$pushAll" => [{ "_id" => "street" }] } }
|
28
|
-
# )
|
29
|
-
#
|
30
|
-
# @param [ Hash ] operations The ops to parse.
|
31
|
-
#
|
32
|
-
# @since 2.0.0
|
33
|
-
def parse(operations)
|
34
|
-
modifier = operations.keys.first
|
35
|
-
@path ||= operations[modifier].keys.first
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require "mongoid/relations/referenced/batch/insert"
|
3
|
-
|
4
|
-
module Mongoid #:nodoc:
|
5
|
-
module Relations #:nodoc:
|
6
|
-
module Referenced #:nodoc:
|
7
|
-
|
8
|
-
# This module provides the ability for single insert calls to be batch
|
9
|
-
# inserted.
|
10
|
-
module Batch
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
# Executes a number of save calls in a single batch. Mongoid will
|
15
|
-
# intercept all database inserts while in this block and combine them
|
16
|
-
# into a single database call. When the block concludes the batch
|
17
|
-
# insert will occur.
|
18
|
-
#
|
19
|
-
# Since the collection is accessed through the class it would not be
|
20
|
-
# thread safe to give it state so we access the atomic updater via the
|
21
|
-
# current thread.
|
22
|
-
#
|
23
|
-
# @note This operation is not safe when attemping to do illegal updates
|
24
|
-
# for different objects or collections, since the updator is not
|
25
|
-
# scoped on the thread. This is meant for Mongoid internal use only
|
26
|
-
# to keep existing design clean.
|
27
|
-
#
|
28
|
-
# @example Batch update multiple appends.
|
29
|
-
# batched do
|
30
|
-
# person.posts << [ post_one, post_two, post_three ]
|
31
|
-
# end
|
32
|
-
#
|
33
|
-
# @todo Durran: Move executions to thread local stack.
|
34
|
-
#
|
35
|
-
# @param [ Proc ] block The block to execute.
|
36
|
-
#
|
37
|
-
# @return [ Object ] The result of the operation.
|
38
|
-
#
|
39
|
-
# @since 2.0.2, batch-relational-insert
|
40
|
-
def batched(&block)
|
41
|
-
name = collection.name
|
42
|
-
inserter = Threaded.insert(name) || Threaded.set_insert(name, Insert.new)
|
43
|
-
count_executions(&block)
|
44
|
-
ensure
|
45
|
-
if @executions.zero?
|
46
|
-
Threaded.set_insert(name, nil)
|
47
|
-
inserter.execute(collection)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# Execute the block, incrementing the executions before the call and
|
52
|
-
# decrementing them after in order to be able to nest blocks within
|
53
|
-
# each other.
|
54
|
-
#
|
55
|
-
# @todo Durran: Combine common code with embedded atomics.
|
56
|
-
#
|
57
|
-
# @example Execute and increment.
|
58
|
-
# execute { block.call }
|
59
|
-
#
|
60
|
-
# @param [ Proc ] block The block to call.
|
61
|
-
#
|
62
|
-
# @since 2.0.2, batch-relational-insert
|
63
|
-
def count_executions
|
64
|
-
@executions ||= 0
|
65
|
-
@executions += 1
|
66
|
-
yield
|
67
|
-
ensure
|
68
|
-
@executions -=1
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|