mongoid-locomotive 2.0.0.beta9
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/MIT_LICENSE +20 -0
- data/README.rdoc +47 -0
- data/lib/mongoid.rb +141 -0
- data/lib/mongoid/associations.rb +306 -0
- data/lib/mongoid/associations/embedded_in.rb +74 -0
- data/lib/mongoid/associations/embeds_many.rb +280 -0
- data/lib/mongoid/associations/embeds_one.rb +97 -0
- data/lib/mongoid/associations/foreign_key.rb +35 -0
- data/lib/mongoid/associations/meta_data.rb +38 -0
- data/lib/mongoid/associations/options.rb +62 -0
- data/lib/mongoid/associations/proxy.rb +33 -0
- data/lib/mongoid/associations/referenced_in.rb +59 -0
- data/lib/mongoid/associations/references_many.rb +245 -0
- data/lib/mongoid/associations/references_many_as_array.rb +78 -0
- data/lib/mongoid/associations/references_one.rb +99 -0
- data/lib/mongoid/atomicity.rb +55 -0
- data/lib/mongoid/attributes.rb +242 -0
- data/lib/mongoid/callbacks.rb +21 -0
- data/lib/mongoid/collection.rb +120 -0
- data/lib/mongoid/collections.rb +71 -0
- data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
- data/lib/mongoid/collections/master.rb +29 -0
- data/lib/mongoid/collections/operations.rb +41 -0
- data/lib/mongoid/collections/slaves.rb +45 -0
- data/lib/mongoid/components.rb +34 -0
- data/lib/mongoid/config.rb +263 -0
- data/lib/mongoid/contexts.rb +24 -0
- data/lib/mongoid/contexts/enumerable.rb +156 -0
- data/lib/mongoid/contexts/ids.rb +25 -0
- data/lib/mongoid/contexts/mongo.rb +285 -0
- data/lib/mongoid/contexts/paging.rb +50 -0
- data/lib/mongoid/criteria.rb +248 -0
- data/lib/mongoid/criterion/complex.rb +21 -0
- data/lib/mongoid/criterion/exclusion.rb +65 -0
- data/lib/mongoid/criterion/inclusion.rb +110 -0
- data/lib/mongoid/criterion/optional.rb +189 -0
- data/lib/mongoid/cursor.rb +81 -0
- data/lib/mongoid/deprecation.rb +21 -0
- data/lib/mongoid/dirty.rb +252 -0
- data/lib/mongoid/document.rb +210 -0
- data/lib/mongoid/errors.rb +131 -0
- data/lib/mongoid/extensions.rb +115 -0
- data/lib/mongoid/extensions/array/accessors.rb +17 -0
- data/lib/mongoid/extensions/array/assimilation.rb +26 -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 +24 -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/accessors.rb +42 -0
- data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
- data/lib/mongoid/extensions/hash/conversions.rb +42 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
- data/lib/mongoid/extensions/hash/scoping.rb +12 -0
- data/lib/mongoid/extensions/integer/conversions.rb +20 -0
- data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
- data/lib/mongoid/extensions/object/conversions.rb +21 -0
- data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
- data/lib/mongoid/extensions/proc/scoping.rb +12 -0
- data/lib/mongoid/extensions/set/conversions.rb +20 -0
- data/lib/mongoid/extensions/string/conversions.rb +15 -0
- data/lib/mongoid/extensions/string/inflections.rb +97 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
- data/lib/mongoid/extensions/time_conversions.rb +35 -0
- data/lib/mongoid/extensions/true_class/equality.rb +13 -0
- data/lib/mongoid/extras.rb +61 -0
- data/lib/mongoid/factory.rb +20 -0
- data/lib/mongoid/field.rb +83 -0
- data/lib/mongoid/fields.rb +62 -0
- data/lib/mongoid/finders.rb +145 -0
- data/lib/mongoid/hierarchy.rb +74 -0
- data/lib/mongoid/identity.rb +47 -0
- data/lib/mongoid/indexes.rb +27 -0
- data/lib/mongoid/javascript.rb +21 -0
- data/lib/mongoid/javascript/functions.yml +37 -0
- data/lib/mongoid/logger.rb +19 -0
- data/lib/mongoid/matchers.rb +35 -0
- data/lib/mongoid/matchers/all.rb +11 -0
- data/lib/mongoid/matchers/default.rb +26 -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/size.rb +11 -0
- data/lib/mongoid/memoization.rb +33 -0
- data/lib/mongoid/named_scope.rb +37 -0
- data/lib/mongoid/paranoia.rb +106 -0
- data/lib/mongoid/paths.rb +61 -0
- data/lib/mongoid/persistence.rb +216 -0
- data/lib/mongoid/persistence/command.rb +39 -0
- data/lib/mongoid/persistence/insert.rb +48 -0
- data/lib/mongoid/persistence/insert_embedded.rb +44 -0
- data/lib/mongoid/persistence/remove.rb +39 -0
- data/lib/mongoid/persistence/remove_all.rb +38 -0
- data/lib/mongoid/persistence/remove_embedded.rb +50 -0
- data/lib/mongoid/persistence/update.rb +71 -0
- data/lib/mongoid/railtie.rb +67 -0
- data/lib/mongoid/railties/database.rake +60 -0
- data/lib/mongoid/scope.rb +75 -0
- data/lib/mongoid/state.rb +32 -0
- data/lib/mongoid/timestamps.rb +27 -0
- data/lib/mongoid/validations.rb +51 -0
- data/lib/mongoid/validations/associated.rb +32 -0
- data/lib/mongoid/validations/locale/en.yml +5 -0
- data/lib/mongoid/validations/uniqueness.rb +56 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +26 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
- data/lib/rails/generators/mongoid_generator.rb +61 -0
- data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
- data/spec/integration/mongoid/associations_spec.rb +768 -0
- data/spec/integration/mongoid/attributes_spec.rb +59 -0
- data/spec/integration/mongoid/callback_spec.rb +33 -0
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
- data/spec/integration/mongoid/criteria_spec.rb +281 -0
- data/spec/integration/mongoid/dirty_spec.rb +85 -0
- data/spec/integration/mongoid/document_spec.rb +741 -0
- data/spec/integration/mongoid/extensions_spec.rb +22 -0
- data/spec/integration/mongoid/finders_spec.rb +119 -0
- data/spec/integration/mongoid/inheritance_spec.rb +171 -0
- data/spec/integration/mongoid/named_scope_spec.rb +58 -0
- data/spec/integration/mongoid/paranoia_spec.rb +44 -0
- data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
- data/spec/integration/mongoid/persistence_spec.rb +311 -0
- data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
- data/spec/models/account.rb +5 -0
- data/spec/models/address.rb +40 -0
- data/spec/models/agent.rb +7 -0
- data/spec/models/animal.rb +15 -0
- data/spec/models/answer.rb +4 -0
- data/spec/models/callbacks.rb +47 -0
- data/spec/models/category.rb +13 -0
- data/spec/models/comment.rb +10 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/favorite.rb +8 -0
- data/spec/models/game.rb +9 -0
- data/spec/models/inheritance.rb +72 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/login.rb +6 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/paranoid_post.rb +18 -0
- data/spec/models/parents.rb +32 -0
- data/spec/models/patient.rb +15 -0
- data/spec/models/person.rb +106 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/post.rb +25 -0
- data/spec/models/preference.rb +7 -0
- data/spec/models/question.rb +8 -0
- data/spec/models/survey.rb +6 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/user.rb +6 -0
- data/spec/models/user_accout.rb +5 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/models/video.rb +5 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
- data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
- data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
- data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
- data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
- data/spec/unit/mongoid/associations/options_spec.rb +215 -0
- data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
- data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
- data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
- data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
- data/spec/unit/mongoid/associations_spec.rb +688 -0
- data/spec/unit/mongoid/atomicity_spec.rb +164 -0
- data/spec/unit/mongoid/attributes_spec.rb +646 -0
- data/spec/unit/mongoid/callbacks_spec.rb +85 -0
- data/spec/unit/mongoid/collection_spec.rb +187 -0
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
- data/spec/unit/mongoid/collections/master_spec.rb +41 -0
- data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
- data/spec/unit/mongoid/collections_spec.rb +98 -0
- data/spec/unit/mongoid/config_spec.rb +298 -0
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
- data/spec/unit/mongoid/contexts_spec.rb +25 -0
- data/spec/unit/mongoid/criteria_spec.rb +873 -0
- data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
- data/spec/unit/mongoid/cursor_spec.rb +80 -0
- data/spec/unit/mongoid/deprecation_spec.rb +24 -0
- data/spec/unit/mongoid/dirty_spec.rb +430 -0
- data/spec/unit/mongoid/document_spec.rb +623 -0
- data/spec/unit/mongoid/errors_spec.rb +154 -0
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +52 -0
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -0
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +145 -0
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +59 -0
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +29 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
- data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
- data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
- data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
- data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -0
- data/spec/unit/mongoid/extras_spec.rb +102 -0
- data/spec/unit/mongoid/factory_spec.rb +31 -0
- data/spec/unit/mongoid/field_spec.rb +169 -0
- data/spec/unit/mongoid/fields_spec.rb +181 -0
- data/spec/unit/mongoid/finders_spec.rb +439 -0
- data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
- data/spec/unit/mongoid/identity_spec.rb +109 -0
- data/spec/unit/mongoid/indexes_spec.rb +99 -0
- data/spec/unit/mongoid/javascript_spec.rb +48 -0
- data/spec/unit/mongoid/logger_spec.rb +38 -0
- data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
- data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
- data/spec/unit/mongoid/matchers_spec.rb +329 -0
- data/spec/unit/mongoid/memoization_spec.rb +75 -0
- data/spec/unit/mongoid/named_scope_spec.rb +123 -0
- data/spec/unit/mongoid/paranoia_spec.rb +108 -0
- data/spec/unit/mongoid/paths_spec.rb +272 -0
- data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
- data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
- data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
- data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
- data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
- data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
- data/spec/unit/mongoid/persistence_spec.rb +452 -0
- data/spec/unit/mongoid/scope_spec.rb +240 -0
- data/spec/unit/mongoid/serialization_spec.rb +43 -0
- data/spec/unit/mongoid/state_spec.rb +94 -0
- data/spec/unit/mongoid/timestamps_spec.rb +30 -0
- data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
- data/spec/unit/mongoid/validations_spec.rb +43 -0
- data/spec/unit/mongoid/versioning_spec.rb +41 -0
- data/spec/unit/mongoid_spec.rb +46 -0
- metadata +433 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Finders #:nodoc:
|
|
4
|
+
|
|
5
|
+
# Delegate to the criteria methods that are natural for creating a new
|
|
6
|
+
# criteria.
|
|
7
|
+
[ :all_in, :any_in, :asc, :ascending, :avg, :desc, :descending,
|
|
8
|
+
:excludes, :limit, :max, :min, :not_in, :only, :order_by,
|
|
9
|
+
:skip, :sum, :where ].each do |name|
|
|
10
|
+
define_method(name) do |*args|
|
|
11
|
+
criteria.send(name, *args)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Find +Documents+ given the conditions.
|
|
16
|
+
#
|
|
17
|
+
# Options:
|
|
18
|
+
#
|
|
19
|
+
# args: A +Hash+ with a conditions key and other options
|
|
20
|
+
#
|
|
21
|
+
# <tt>Person.all(:conditions => { :attribute => "value" })</tt>
|
|
22
|
+
def all(*args)
|
|
23
|
+
find(:all, *args)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Returns a count of matching records in the database based on the
|
|
27
|
+
# provided arguments.
|
|
28
|
+
#
|
|
29
|
+
# <tt>Person.count(:conditions => { :attribute => "value" })</tt>
|
|
30
|
+
def count(*args)
|
|
31
|
+
Criteria.translate(self, *args).count
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns true if there are on document in database based on the
|
|
35
|
+
# provided arguments.
|
|
36
|
+
#
|
|
37
|
+
# <tt>Person.exists?(:conditions => { :attribute => "value" })</tt>
|
|
38
|
+
def exists?(*args)
|
|
39
|
+
Criteria.translate(self, *args).limit(1).count == 1
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Helper to initialize a new +Criteria+ object for this class.
|
|
43
|
+
#
|
|
44
|
+
# Example:
|
|
45
|
+
#
|
|
46
|
+
# <tt>Person.criteria</tt>
|
|
47
|
+
def criteria
|
|
48
|
+
Criteria.new(self)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Find a +Document+ in several different ways.
|
|
52
|
+
#
|
|
53
|
+
# If a +String+ is provided, it will be assumed that it is a
|
|
54
|
+
# representation of a Mongo::ObjectID and will attempt to find a single
|
|
55
|
+
# +Document+ based on that id. If a +Symbol+ and +Hash+ is provided then
|
|
56
|
+
# it will attempt to find either a single +Document+ or multiples based
|
|
57
|
+
# on the conditions provided and the first parameter.
|
|
58
|
+
#
|
|
59
|
+
# <tt>Person.find(:first, :conditions => { :attribute => "value" })</tt>
|
|
60
|
+
#
|
|
61
|
+
# <tt>Person.find(:all, :conditions => { :attribute => "value" })</tt>
|
|
62
|
+
#
|
|
63
|
+
# <tt>Person.find(Mongo::ObjectID.new.to_s)</tt>
|
|
64
|
+
def find(*args)
|
|
65
|
+
raise Errors::InvalidOptions.new("Calling Document#find with nil is invalid") if args[0].nil?
|
|
66
|
+
type = args.delete_at(0) if args[0].is_a?(Symbol)
|
|
67
|
+
criteria = Criteria.translate(self, *args)
|
|
68
|
+
case type
|
|
69
|
+
when :first then return criteria.one
|
|
70
|
+
when :last then return criteria.last
|
|
71
|
+
else
|
|
72
|
+
return criteria
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Find the first +Document+ given the conditions, or creates a new document
|
|
77
|
+
# with the conditions that were supplied
|
|
78
|
+
#
|
|
79
|
+
# Options:
|
|
80
|
+
#
|
|
81
|
+
# args: A +Hash+ of attributes
|
|
82
|
+
#
|
|
83
|
+
# <tt>Person.find_or_create_by(:attribute => "value")</tt>
|
|
84
|
+
def find_or_create_by(attrs = {})
|
|
85
|
+
find_or(:create, attrs)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Find the first +Document+ given the conditions, or instantiates a new document
|
|
89
|
+
# with the conditions that were supplied
|
|
90
|
+
#
|
|
91
|
+
# Options:
|
|
92
|
+
#
|
|
93
|
+
# args: A +Hash+ of attributes
|
|
94
|
+
#
|
|
95
|
+
# <tt>Person.find_or_initialize_by(:attribute => "value")</tt>
|
|
96
|
+
def find_or_initialize_by(attrs = {})
|
|
97
|
+
find_or(:new, attrs)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Find the first +Document+ given the conditions.
|
|
101
|
+
#
|
|
102
|
+
# Options:
|
|
103
|
+
#
|
|
104
|
+
# args: A +Hash+ with a conditions key and other options
|
|
105
|
+
#
|
|
106
|
+
# <tt>Person.first(:conditions => { :attribute => "value" })</tt>
|
|
107
|
+
def first(*args)
|
|
108
|
+
find(:first, *args)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Find the last +Document+ given the conditions.
|
|
112
|
+
#
|
|
113
|
+
# Options:
|
|
114
|
+
#
|
|
115
|
+
# args: A +Hash+ with a conditions key and other options
|
|
116
|
+
#
|
|
117
|
+
# <tt>Person.last(:conditions => { :attribute => "value" })</tt>
|
|
118
|
+
def last(*args)
|
|
119
|
+
find(:last, *args)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Find all documents in paginated fashion given the supplied arguments.
|
|
123
|
+
# If no parameters are passed just default to offset 0 and limit 20.
|
|
124
|
+
#
|
|
125
|
+
# Options:
|
|
126
|
+
#
|
|
127
|
+
# params: A +Hash+ of params to pass to the Criteria API.
|
|
128
|
+
#
|
|
129
|
+
# Example:
|
|
130
|
+
#
|
|
131
|
+
# <tt>Person.paginate(:conditions => { :field => "Test" }, :page => 1,
|
|
132
|
+
# :per_page => 20)</tt>
|
|
133
|
+
#
|
|
134
|
+
# Returns paginated array of docs.
|
|
135
|
+
def paginate(params = {})
|
|
136
|
+
Criteria.translate(self, params).paginate
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
protected
|
|
140
|
+
# Find the first object or create/initialize it.
|
|
141
|
+
def find_or(method, attrs = {})
|
|
142
|
+
first(:conditions => attrs) || send(method, attrs)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc
|
|
3
|
+
module Hierarchy #:nodoc
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
cattr_accessor :hereditary
|
|
7
|
+
self.hereditary = false
|
|
8
|
+
|
|
9
|
+
attr_accessor :_parent
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module InstanceMethods #:nodoc:
|
|
13
|
+
|
|
14
|
+
# Get all child +Documents+ to this +Document+, going n levels deep if
|
|
15
|
+
# necessary. This is used when calling update persistence operations from
|
|
16
|
+
# the root document, where changes in the entire tree need to be
|
|
17
|
+
# determined. Note that persistence from the embedded documents will
|
|
18
|
+
# always be preferred, since they are optimized calls... This operation
|
|
19
|
+
# can get expensive in domains with large hierarchies.
|
|
20
|
+
#
|
|
21
|
+
# Example:
|
|
22
|
+
#
|
|
23
|
+
# <tt>person._children</tt>
|
|
24
|
+
#
|
|
25
|
+
# Returns:
|
|
26
|
+
#
|
|
27
|
+
# All child +Documents+ to this +Document+ in the entire hierarchy.
|
|
28
|
+
def _children
|
|
29
|
+
associations.inject([]) do |children, (name, metadata)|
|
|
30
|
+
if metadata.embedded? && name != "versions"
|
|
31
|
+
child = send(name)
|
|
32
|
+
child.to_a.each do |doc|
|
|
33
|
+
children.push(doc).concat(doc._children)
|
|
34
|
+
end unless child.blank?
|
|
35
|
+
end
|
|
36
|
+
children
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Is inheritance in play here?
|
|
41
|
+
#
|
|
42
|
+
# Returns:
|
|
43
|
+
#
|
|
44
|
+
# <tt>true</tt> if inheritance used, <tt>false</tt> if not.
|
|
45
|
+
def hereditary?
|
|
46
|
+
!!self.hereditary
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Sets up a child/parent association. This is used for newly created
|
|
50
|
+
# objects so they can be properly added to the graph.
|
|
51
|
+
#
|
|
52
|
+
# Options:
|
|
53
|
+
#
|
|
54
|
+
# abject: The parent object that needs to be set for the child.
|
|
55
|
+
# association_name: The name of the association for the child.
|
|
56
|
+
#
|
|
57
|
+
# Example:
|
|
58
|
+
#
|
|
59
|
+
# <tt>address.parentize(person, :addresses)</tt>
|
|
60
|
+
def parentize(object, association_name)
|
|
61
|
+
self._parent = object
|
|
62
|
+
self.association_name = association_name.to_s
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Return the root +Document+ in the object graph. If the current +Document+
|
|
66
|
+
# is the root object in the graph it will return self.
|
|
67
|
+
def _root
|
|
68
|
+
object = self
|
|
69
|
+
while (object._parent) do object = object._parent; end
|
|
70
|
+
object || self
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
class Identity #:nodoc:
|
|
4
|
+
# Create the identity for the +Document+.
|
|
5
|
+
#
|
|
6
|
+
# The id will be set in either in the form of a Mongo
|
|
7
|
+
# +ObjectID+ or a composite key set up by defining a key on the document.
|
|
8
|
+
#
|
|
9
|
+
# The _type will be set to the document's class name.
|
|
10
|
+
def create
|
|
11
|
+
identify!; type!
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Create the new identity generator - this will be expanded in the future
|
|
15
|
+
# to support pk generators.
|
|
16
|
+
#
|
|
17
|
+
# Options:
|
|
18
|
+
#
|
|
19
|
+
# document: The document to generate an id for.
|
|
20
|
+
def initialize(document)
|
|
21
|
+
@document = document
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
protected
|
|
25
|
+
# Return the proper id for the document.
|
|
26
|
+
def generate_id
|
|
27
|
+
id = BSON::ObjectID.new
|
|
28
|
+
Mongoid.use_object_ids ? id : id.to_s
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Set the id for the document.
|
|
32
|
+
def identify!
|
|
33
|
+
@document.id = compose.join(" ").identify if @document.primary_key
|
|
34
|
+
@document.id = generate_id if @document.id.blank?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Set the _type field on the @document.ment.
|
|
38
|
+
def type!
|
|
39
|
+
@document._type = @document.class.name if @document.hereditary?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Generates the composite key for a @document.ment.
|
|
43
|
+
def compose
|
|
44
|
+
@document.primary_key.collect { |key| @document.attributes[key] }.reject { |val| val.nil? }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc
|
|
3
|
+
module Indexes #:nodoc
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
included do
|
|
6
|
+
cattr_accessor :indexed
|
|
7
|
+
self.indexed = false
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module ClassMethods #:nodoc
|
|
11
|
+
# Add the default indexes to the root document if they do not already
|
|
12
|
+
# exist. Currently this is only _type.
|
|
13
|
+
def add_indexes
|
|
14
|
+
if hereditary && !indexed
|
|
15
|
+
self._collection.create_index(:_type, :unique => false, :background => true)
|
|
16
|
+
self.indexed = true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Adds an index on the field specified. Options can be :unique => true or
|
|
21
|
+
# :unique => false. It will default to the latter.
|
|
22
|
+
def index(name, options = { :unique => false })
|
|
23
|
+
collection.create_index(name, options)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
class Javascript
|
|
4
|
+
# Constant for the file that defines all the js functions.
|
|
5
|
+
FUNCTIONS = File.join(File.dirname(__FILE__), "javascript", "functions.yml")
|
|
6
|
+
|
|
7
|
+
# Load the javascript functions and define a class method for each one,
|
|
8
|
+
# that memoizes the value.
|
|
9
|
+
#
|
|
10
|
+
# Example:
|
|
11
|
+
#
|
|
12
|
+
# <tt>Mongoid::Javascript.aggregate</tt>
|
|
13
|
+
YAML.load(File.read(FUNCTIONS)).each_pair do |key, function|
|
|
14
|
+
(class << self; self; end).class_eval <<-EOT
|
|
15
|
+
def #{key}
|
|
16
|
+
@#{key} ||= "#{function}"
|
|
17
|
+
end
|
|
18
|
+
EOT
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
aggregate:
|
|
2
|
+
"function(obj, prev) {
|
|
3
|
+
prev.count++;
|
|
4
|
+
}"
|
|
5
|
+
|
|
6
|
+
group:
|
|
7
|
+
"function(obj, prev) {
|
|
8
|
+
prev.group.push(obj);
|
|
9
|
+
}"
|
|
10
|
+
|
|
11
|
+
max:
|
|
12
|
+
"function(obj, prev) {
|
|
13
|
+
if (prev.max == 'start') {
|
|
14
|
+
prev.max = obj.[field];
|
|
15
|
+
}
|
|
16
|
+
if (prev.max < obj.[field]) {
|
|
17
|
+
prev.max = obj.[field];
|
|
18
|
+
}
|
|
19
|
+
}"
|
|
20
|
+
|
|
21
|
+
min:
|
|
22
|
+
"function(obj, prev) {
|
|
23
|
+
if (prev.min == 'start') {
|
|
24
|
+
prev.min = obj.[field];
|
|
25
|
+
}
|
|
26
|
+
if (prev.min > obj.[field]) {
|
|
27
|
+
prev.min = obj.[field];
|
|
28
|
+
}
|
|
29
|
+
}"
|
|
30
|
+
|
|
31
|
+
sum:
|
|
32
|
+
"function(obj, prev) {
|
|
33
|
+
if (prev.sum == 'start') {
|
|
34
|
+
prev.sum = 0;
|
|
35
|
+
}
|
|
36
|
+
prev.sum += obj.[field];
|
|
37
|
+
}"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
class Logger
|
|
3
|
+
|
|
4
|
+
delegate :info, :debug, :error, :fatal, :unknown, :to => :logger, :allow_nil => true
|
|
5
|
+
|
|
6
|
+
def warn(message)
|
|
7
|
+
logger.warn(message) if logger && logger.respond_to?(:warn)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def logger
|
|
11
|
+
Mongoid.logger
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def inspect
|
|
15
|
+
"#<Mongoid::Logger:0x#{object_id.to_s(16)} @logger=#{logger.inspect}>"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "mongoid/matchers/default"
|
|
3
|
+
require "mongoid/matchers/all"
|
|
4
|
+
require "mongoid/matchers/exists"
|
|
5
|
+
require "mongoid/matchers/gt"
|
|
6
|
+
require "mongoid/matchers/gte"
|
|
7
|
+
require "mongoid/matchers/in"
|
|
8
|
+
require "mongoid/matchers/lt"
|
|
9
|
+
require "mongoid/matchers/lte"
|
|
10
|
+
require "mongoid/matchers/ne"
|
|
11
|
+
require "mongoid/matchers/nin"
|
|
12
|
+
require "mongoid/matchers/size"
|
|
13
|
+
|
|
14
|
+
module Mongoid #:nodoc:
|
|
15
|
+
module Matchers
|
|
16
|
+
# Determines if this document has the attributes to match the supplied
|
|
17
|
+
# MongoDB selector. Used for matching on embedded associations.
|
|
18
|
+
def matches?(selector)
|
|
19
|
+
selector.each_pair do |key, value|
|
|
20
|
+
return false unless matcher(key, value).matches?(value)
|
|
21
|
+
end; true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
protected
|
|
25
|
+
# Get the matcher for the supplied key and value. Will determine the class
|
|
26
|
+
# name from the key.
|
|
27
|
+
def matcher(key, value)
|
|
28
|
+
if value.is_a?(Hash)
|
|
29
|
+
name = "Mongoid::Matchers::#{value.keys.first.gsub("$", "").camelize}"
|
|
30
|
+
return name.constantize.new(attributes[key])
|
|
31
|
+
end
|
|
32
|
+
Default.new(attributes[key])
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid #:nodoc:
|
|
3
|
+
module Matchers #:nodoc:
|
|
4
|
+
class Default
|
|
5
|
+
# Creating a new matcher only requires the value.
|
|
6
|
+
def initialize(attribute)
|
|
7
|
+
@attribute = attribute
|
|
8
|
+
end
|
|
9
|
+
# Return true if the attribute and value are equal.
|
|
10
|
+
def matches?(value)
|
|
11
|
+
@attribute == value
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
protected
|
|
15
|
+
# Return the first value in the hash.
|
|
16
|
+
def first(value)
|
|
17
|
+
value.values.first
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# If object exists then compare, else return false
|
|
21
|
+
def determine(value, operator)
|
|
22
|
+
@attribute ? @attribute.send(operator, first(value)) : false
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|