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,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
|
4
|
+
# The Mongoid logger which wraps some other ruby compliant logger class.
|
5
|
+
class Logger
|
6
|
+
|
7
|
+
delegate :info, :debug, :error, :fatal, :unknown, :to => :logger, :allow_nil => true
|
8
|
+
|
9
|
+
# Emit a warning log message.
|
10
|
+
#
|
11
|
+
# @example Log a warning.
|
12
|
+
# logger.warn("Danger")
|
13
|
+
#
|
14
|
+
# @param [ String ] message The warning message.
|
15
|
+
def warn(message)
|
16
|
+
logger.warn(message) if logger && logger.respond_to?(:warn)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get the mongoid logger.
|
20
|
+
#
|
21
|
+
# @example Get the global logger.
|
22
|
+
# logger.logger
|
23
|
+
#
|
24
|
+
# @return [ Logger ] The logger.
|
25
|
+
def logger
|
26
|
+
Mongoid.logger
|
27
|
+
end
|
28
|
+
|
29
|
+
# Inspect the logger.
|
30
|
+
#
|
31
|
+
# @example Inspect the logger.
|
32
|
+
# logger.inspect
|
33
|
+
#
|
34
|
+
# @return [ String ] The logger, inspected.
|
35
|
+
def inspect
|
36
|
+
"#<Mongoid::Logger:0x#{object_id.to_s(16)} @logger=#{logger.inspect}>"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/matchers/strategies"
|
3
|
+
|
4
|
+
module Mongoid #:nodoc:
|
5
|
+
|
6
|
+
# This module contains all the behavior for ruby implementations of MongoDB
|
7
|
+
# selectors.
|
8
|
+
module Matchers
|
9
|
+
|
10
|
+
# Determines if this document has the attributes to match the supplied
|
11
|
+
# MongoDB selector. Used for matching on embedded associations.
|
12
|
+
#
|
13
|
+
# @example Does the document match?
|
14
|
+
# document.matches?(:title => { "$in" => [ "test" ] })
|
15
|
+
#
|
16
|
+
# @param [ Hash ] selector The MongoDB selector.
|
17
|
+
#
|
18
|
+
# @return [ true, false ] True if matches, false if not.
|
19
|
+
def matches?(selector)
|
20
|
+
selector.each_pair do |key, value|
|
21
|
+
if value.is_a?(Hash)
|
22
|
+
value.each do |item|
|
23
|
+
return false unless Strategies.matcher(self, key, Hash[*item]).matches?(Hash[*item])
|
24
|
+
end
|
25
|
+
else
|
26
|
+
return false unless Strategies.matcher(self, key, value).matches?(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
return true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Checks that all values match.
|
6
|
+
class All < Default
|
7
|
+
|
8
|
+
# Return true if the attribute and first value in the hash are equal.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If the values match.
|
16
|
+
def matches?(value)
|
17
|
+
@attribute == value.values.first
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Defines behavior for handling $or expressions in embedded documents.
|
6
|
+
class And < Default
|
7
|
+
|
8
|
+
# Does the supplied query match the attribute?
|
9
|
+
#
|
10
|
+
# @example Does this match?
|
11
|
+
# matcher.matches?("$and" => [ { field => value } ])
|
12
|
+
#
|
13
|
+
# @param [ Array ] conditions The or expression.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] True if matches, false if not.
|
16
|
+
#
|
17
|
+
# @since 2.3.0
|
18
|
+
def matches?(conditions)
|
19
|
+
conditions.each do |condition|
|
20
|
+
condition.keys.each do |k|
|
21
|
+
key = k
|
22
|
+
value = condition[k]
|
23
|
+
return false unless Strategies.matcher(document, key, value).matches?(value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Contains all the default behavior for checking for matching documents
|
6
|
+
# given MongoDB expressions.
|
7
|
+
class Default
|
8
|
+
|
9
|
+
attr_accessor :attribute, :document
|
10
|
+
|
11
|
+
# Creating a new matcher only requires the value.
|
12
|
+
#
|
13
|
+
# @example Create a new matcher.
|
14
|
+
# Default.new("attribute")
|
15
|
+
#
|
16
|
+
# @param [ Object ] attribute The current attribute to check against.
|
17
|
+
#
|
18
|
+
# @since 1.0.0
|
19
|
+
def initialize(attribute, document = nil)
|
20
|
+
@attribute, @document = attribute, document
|
21
|
+
end
|
22
|
+
|
23
|
+
# Return true if the attribute and value are equal, or if it is an array
|
24
|
+
# if the value is included.
|
25
|
+
#
|
26
|
+
# @example Does this value match?
|
27
|
+
# default.matches?("value")
|
28
|
+
#
|
29
|
+
# @param [ Object ] value The value to check if it matches.
|
30
|
+
#
|
31
|
+
# @return [ true, false ] True if matches, false if not.
|
32
|
+
#
|
33
|
+
# @since 1.0.0
|
34
|
+
def matches?(value)
|
35
|
+
attribute.is_a?(Array) && !value.is_a?(Array) ? attribute.include?(value) : value === attribute
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
# Convenience method for getting the first value in a hash.
|
41
|
+
#
|
42
|
+
# @example Get the first value.
|
43
|
+
# matcher.first(:test => "value")
|
44
|
+
#
|
45
|
+
# @param [ Hash ] hash The has to pull from.
|
46
|
+
#
|
47
|
+
# @return [ Object ] The first value.
|
48
|
+
#
|
49
|
+
# @since 1.0.0
|
50
|
+
def first(hash)
|
51
|
+
hash.values.first
|
52
|
+
end
|
53
|
+
|
54
|
+
# If object exists then compare the two, otherwise return false
|
55
|
+
#
|
56
|
+
# @example Determine if we can compare.
|
57
|
+
# matcher.determine("test", "$in")
|
58
|
+
#
|
59
|
+
# @param [ Object ] value The value to compare with.
|
60
|
+
# @param [ Symbol, String ] operator The comparison operation.
|
61
|
+
#
|
62
|
+
# @return [ true, false ] The comparison or false.
|
63
|
+
#
|
64
|
+
# @since 1.0.0
|
65
|
+
def determine(value, operator)
|
66
|
+
attribute ? attribute.send(operator, first(value)) : false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Checks for existance.
|
6
|
+
class Exists < Default
|
7
|
+
|
8
|
+
# Return true if the attribute exists and checking for existence or
|
9
|
+
# return true if the attribute does not exist and checking for
|
10
|
+
# non-existence.
|
11
|
+
#
|
12
|
+
# @example Does anything exist?
|
13
|
+
# matcher.matches?({ :key => 10 })
|
14
|
+
#
|
15
|
+
# @param [ Hash ] value The values to check.
|
16
|
+
#
|
17
|
+
# @return [ true, false ] If a value exists.
|
18
|
+
def matches?(value)
|
19
|
+
@attribute.nil? != value.values.first
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs Greater Than matching.
|
6
|
+
class Gt < Default
|
7
|
+
|
8
|
+
# Return true if the attribute is greater than the value.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
determine(value, :>)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs Greater than or equal to matching.
|
6
|
+
class Gte < Default
|
7
|
+
|
8
|
+
# Return true if the attribute is greater than or equal to the value.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
determine(value, :>=)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs matching for any value in an array.
|
6
|
+
class In < Default
|
7
|
+
|
8
|
+
# Return true if the attribute is in the values.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
Array.wrap(@attribute).any? { |e| value.values.first.include?(e) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs less than matching.
|
6
|
+
class Lt < Default
|
7
|
+
|
8
|
+
# Return true if the attribute is less than the value.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
determine(value, :<)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs less than or equal to matching.
|
6
|
+
class Lte < Default
|
7
|
+
|
8
|
+
# Return true if the attribute is less than or equal to the value.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
determine(value, :<=)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs non-equivalency checks.
|
6
|
+
class Ne < Default
|
7
|
+
|
8
|
+
# Return true if the attribute and first value are not equal.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
@attribute != value.values.first
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs not in checking.
|
6
|
+
class Nin < Default
|
7
|
+
|
8
|
+
# Return true if the attribute is not in the value list.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
Array.wrap(@attribute).none? { |e| value.values.first.include?(e) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Defines behavior for handling $or expressions in embedded documents.
|
6
|
+
class Or < Default
|
7
|
+
|
8
|
+
# Does the supplied query match the attribute?
|
9
|
+
#
|
10
|
+
# @example Does this match?
|
11
|
+
# matcher.matches?("$or" => [ { field => value } ])
|
12
|
+
#
|
13
|
+
# @param [ Array ] conditions The or expression.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] True if matches, false if not.
|
16
|
+
#
|
17
|
+
# @since 2.0.0.rc.7
|
18
|
+
def matches?(conditions)
|
19
|
+
conditions.each do |condition|
|
20
|
+
res = true
|
21
|
+
condition.keys.each do |k|
|
22
|
+
key = k
|
23
|
+
value = condition[k]
|
24
|
+
res &&= Strategies.matcher(document, key, value).matches?(value)
|
25
|
+
break unless res
|
26
|
+
end
|
27
|
+
return res if res
|
28
|
+
end
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc:
|
3
|
+
module Matchers #:nodoc:
|
4
|
+
|
5
|
+
# Performs size checking.
|
6
|
+
class Size < Default
|
7
|
+
|
8
|
+
# Return true if the attribute size is equal to the first value.
|
9
|
+
#
|
10
|
+
# @example Do the values match?
|
11
|
+
# matcher.matches?({ :key => 10 })
|
12
|
+
#
|
13
|
+
# @param [ Hash ] value The values to check.
|
14
|
+
#
|
15
|
+
# @return [ true, false ] If a value exists.
|
16
|
+
def matches?(value)
|
17
|
+
@attribute.size == value.values.first
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/matchers/default"
|
3
|
+
require "mongoid/matchers/all"
|
4
|
+
require "mongoid/matchers/and"
|
5
|
+
require "mongoid/matchers/exists"
|
6
|
+
require "mongoid/matchers/gt"
|
7
|
+
require "mongoid/matchers/gte"
|
8
|
+
require "mongoid/matchers/in"
|
9
|
+
require "mongoid/matchers/lt"
|
10
|
+
require "mongoid/matchers/lte"
|
11
|
+
require "mongoid/matchers/ne"
|
12
|
+
require "mongoid/matchers/nin"
|
13
|
+
require "mongoid/matchers/or"
|
14
|
+
require "mongoid/matchers/size"
|
15
|
+
|
16
|
+
module Mongoid #:nodoc:
|
17
|
+
module Matchers #:nodoc:
|
18
|
+
|
19
|
+
# This module is responsible for returning the correct matcher given a
|
20
|
+
# MongoDB query expression.
|
21
|
+
module Strategies
|
22
|
+
extend self
|
23
|
+
|
24
|
+
MATCHERS = {
|
25
|
+
"$all" => Matchers::All,
|
26
|
+
"$and" => Matchers::And,
|
27
|
+
"$exists" => Matchers::Exists,
|
28
|
+
"$gt" => Matchers::Gt,
|
29
|
+
"$gte" => Matchers::Gte,
|
30
|
+
"$in" => Matchers::In,
|
31
|
+
"$lt" => Matchers::Lt,
|
32
|
+
"$lte" => Matchers::Lte,
|
33
|
+
"$ne" => Matchers::Ne,
|
34
|
+
"$nin" => Matchers::Nin,
|
35
|
+
"$or" => Matchers::Or,
|
36
|
+
"$size" => Matchers::Size
|
37
|
+
}
|
38
|
+
|
39
|
+
# Get the matcher for the supplied key and value. Will determine the class
|
40
|
+
# name from the key.
|
41
|
+
#
|
42
|
+
# @example Get the matcher.
|
43
|
+
# document.matcher(:title, { "$in" => [ "test" ] })
|
44
|
+
#
|
45
|
+
# @param [ Document ] document The document to check.
|
46
|
+
# @param [ Symbol, String ] key The field name.
|
47
|
+
# @param [ Object, Hash ] The value or selector.
|
48
|
+
#
|
49
|
+
# @return [ Matcher ] The matcher.
|
50
|
+
#
|
51
|
+
# @since 2.0.0.rc.7
|
52
|
+
def matcher(document, key, value)
|
53
|
+
if value.is_a?(Hash)
|
54
|
+
matcher = MATCHERS[value.keys.first]
|
55
|
+
if matcher
|
56
|
+
matcher.new(extract_attribute(document, key))
|
57
|
+
else
|
58
|
+
Default.new(extract_attribute(document, key))
|
59
|
+
end
|
60
|
+
else
|
61
|
+
case key
|
62
|
+
when "$or" then Matchers::Or.new(value, document)
|
63
|
+
when "$and" then Matchers::And.new(value, document)
|
64
|
+
else Default.new(extract_attribute(document, key))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
# Extract the attribute from the key, being smarter about dot notation.
|
72
|
+
#
|
73
|
+
# @example Extract the attribute.
|
74
|
+
# strategy.extract_attribute(doc, "info.field")
|
75
|
+
#
|
76
|
+
# @param [ Document ] document The document.
|
77
|
+
# @param [ String ] key The key.
|
78
|
+
#
|
79
|
+
# @return [ Object ] The value of the attribute.
|
80
|
+
#
|
81
|
+
# @since 2.2.1
|
82
|
+
def extract_attribute(document, key)
|
83
|
+
if (key_string = key.to_s) =~ /.+\..+/
|
84
|
+
key_string.split('.').inject(document.attributes) do |attribs, key|
|
85
|
+
attribs.try(:[], key)
|
86
|
+
end
|
87
|
+
else
|
88
|
+
document.attributes[key_string]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|