mongoid 6.0.3 → 6.1.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +3 -2
- data/lib/config/locales/en.yml +15 -0
- data/lib/mongoid.rb +5 -0
- data/lib/mongoid/clients.rb +10 -2
- data/lib/mongoid/clients/factory.rb +2 -0
- data/lib/mongoid/config.rb +1 -0
- data/lib/mongoid/contextual/map_reduce.rb +20 -115
- data/lib/mongoid/contextual/memory.rb +1 -0
- data/lib/mongoid/contextual/mongo.rb +16 -13
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +14 -0
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/in_memory_collation_not_supported.rb +20 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/extensions/decimal128.rb +39 -0
- data/lib/mongoid/indexable/validators/options.rb +2 -1
- data/lib/mongoid/persistable/deletable.rb +3 -7
- data/lib/mongoid/query_cache.rb +2 -2
- data/lib/mongoid/relations/metadata.rb +3 -3
- data/lib/mongoid/relations/referenced/many.rb +2 -2
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +4 -0
- data/spec/app/models/band.rb +1 -0
- data/spec/config/mongoid.yml +19 -0
- data/spec/mongoid/clients/factory_spec.rb +8 -0
- data/spec/mongoid/clients_spec.rb +69 -0
- data/spec/mongoid/config_spec.rb +34 -2
- data/spec/mongoid/contextual/atomic_spec.rb +342 -76
- data/spec/mongoid/contextual/map_reduce_spec.rb +102 -135
- data/spec/mongoid/contextual/memory_spec.rb +316 -56
- data/spec/mongoid/contextual/mongo_spec.rb +366 -4
- data/spec/mongoid/criteria/queryable/optional_spec.rb +13 -0
- data/spec/mongoid/criteria_spec.rb +19 -0
- data/spec/mongoid/extensions/boolean_spec.rb +14 -0
- data/spec/mongoid/extensions/decimal128_spec.rb +44 -0
- data/spec/mongoid/indexable_spec.rb +43 -0
- data/spec/mongoid/query_cache_spec.rb +34 -0
- data/spec/mongoid/relations/metadata_spec.rb +0 -1
- data/spec/mongoid/relations/referenced/many_spec.rb +11 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +11 -0
- data/spec/mongoid/scopable_spec.rb +12 -0
- data/spec/spec_helper.rb +9 -0
- metadata +17 -7
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd1c5f3e10aa8f29d9a04da6580f7b2bd22b67e1
|
4
|
+
data.tar.gz: 0244eacd65adceb037276b870846e0a5fca9407a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28d80be687ea4b751298f72401eb18a45a3350c362cd78d83bd2a7fe6f51be41259dabec2ba856c752747b071dd4c18b41661325d7ba6f9e015a29557eb641f9
|
7
|
+
data.tar.gz: 22091327a5876754cba1a2cfaea2362e07abbf9e5613ac1a272637f06e379ca9d72878379ceb52e0bc2687baf5e007b27bb1569112c6545abc1e29682bc031ef
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
�
|
2
|
-
|
1
|
+
V����J���R���Q���b#��YĐ�3�Z=խ7��>�Zh3����� Wt���F63�@�$>�"(bh�5��n)SW�j���� B()�_�
|
2
|
+
�����8XOGi�7w���_[��݁�Ҟ��H��pļ\ D�0��@�WU=������j.���
|
3
|
+
�3�������U%��h�:w2A���R����(٘0�PbK����:Q4( ���)Q����T�ݧ~�F��:�[�U��=@:�<̯�1�.�
|
data/lib/config/locales/en.yml
CHANGED
@@ -76,6 +76,12 @@ en:
|
|
76
76
|
resolution: "For access to the collection that the embedded document is
|
77
77
|
in, use %{klass}#_root.collection, or do not attempt to persist an
|
78
78
|
embedded document without a parent set."
|
79
|
+
in_memory_collation_not_supported:
|
80
|
+
message: "A collation option cannot be applied when querying documents in-memory."
|
81
|
+
summary: "The query being run against documents in memory has a collation option set.
|
82
|
+
A collation option is only supported if the query is executed on a MongoDB server
|
83
|
+
with version >= 3.4."
|
84
|
+
resolution: "Remove the collation option from the query."
|
79
85
|
invalid_config_option:
|
80
86
|
message: "Invalid configuration option: %{name}."
|
81
87
|
summary: "A invalid configuration option was provided in your
|
@@ -134,9 +140,18 @@ en:
|
|
134
140
|
\_\_min: 1\n
|
135
141
|
\_\_max: 1\n
|
136
142
|
\_\_bits: 26\n
|
143
|
+
\_\_key: 26\n
|
137
144
|
\_\_bucket_size : 1\n
|
145
|
+
\_\_sphere_version : 1\n
|
146
|
+
\_\_text_version : 1\n
|
147
|
+
\_\_version : 1\n
|
138
148
|
\_\_weights: { content: 1, title: 2 }\n
|
139
149
|
\_\_expire_after_seconds: number_of_seconds\n
|
150
|
+
\_\_partial_filter_expression\n
|
151
|
+
\_\_storage_engine\n
|
152
|
+
\_\_language_override\n
|
153
|
+
\_\_default_language\n
|
154
|
+
\_\_collation\n
|
140
155
|
Valid types are: 1, -1, '2d', '2dsphere', 'geoHaystack', 'text', 'hashed'\n\n
|
141
156
|
Example:\n
|
142
157
|
\_\_class Band\n
|
data/lib/mongoid.rb
CHANGED
@@ -36,6 +36,11 @@ module Mongoid
|
|
36
36
|
extend Loggable
|
37
37
|
extend self
|
38
38
|
|
39
|
+
# A string added to the platform details of Ruby driver client handshake documents.
|
40
|
+
#
|
41
|
+
# @since 6.1.0
|
42
|
+
PLATFORM_DETAILS = "mongoid-#{VERSION}".freeze
|
43
|
+
|
39
44
|
# The minimum MongoDB version supported.
|
40
45
|
MONGODB_VERSION = "2.4.0"
|
41
46
|
|
data/lib/mongoid/clients.rb
CHANGED
@@ -33,7 +33,7 @@ module Mongoid
|
|
33
33
|
#
|
34
34
|
# @since 3.0.0
|
35
35
|
def default
|
36
|
-
|
36
|
+
with_name(:default)
|
37
37
|
end
|
38
38
|
|
39
39
|
# Disconnect all active clients.
|
@@ -61,7 +61,11 @@ module Mongoid
|
|
61
61
|
#
|
62
62
|
# @since 3.0.0
|
63
63
|
def with_name(name)
|
64
|
-
|
64
|
+
name_as_symbol = name.to_sym
|
65
|
+
return clients[name_as_symbol] if clients[name_as_symbol]
|
66
|
+
CREATE_LOCK.synchronize do
|
67
|
+
clients[name_as_symbol] ||= Clients::Factory.create(name)
|
68
|
+
end
|
65
69
|
end
|
66
70
|
|
67
71
|
def set(name, client)
|
@@ -71,6 +75,10 @@ module Mongoid
|
|
71
75
|
def clients
|
72
76
|
@clients ||= {}
|
73
77
|
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
CREATE_LOCK = Mutex.new
|
74
82
|
end
|
75
83
|
end
|
76
84
|
end
|
@@ -71,6 +71,8 @@ module Mongoid
|
|
71
71
|
def options(configuration)
|
72
72
|
config = configuration.dup
|
73
73
|
options = config.delete(:options) || {}
|
74
|
+
options[:platform] = PLATFORM_DETAILS
|
75
|
+
options[:app_name] = Mongoid::Config.app_name if Mongoid::Config.app_name
|
74
76
|
options.reject{ |k, v| k == :hosts }.to_hash.symbolize_keys!
|
75
77
|
end
|
76
78
|
end
|
data/lib/mongoid/config.rb
CHANGED
@@ -26,6 +26,7 @@ module Mongoid
|
|
26
26
|
option :use_utc, default: false
|
27
27
|
option :log_level, default: :info
|
28
28
|
option :belongs_to_required_by_default, default: true
|
29
|
+
option :app_name, default: nil
|
29
30
|
|
30
31
|
# Has Mongoid been configured? This is checking that at least a valid
|
31
32
|
# client config exists.
|
@@ -32,12 +32,13 @@ module Mongoid
|
|
32
32
|
#
|
33
33
|
# @since 3.0.0
|
34
34
|
def each
|
35
|
+
validate_out!
|
35
36
|
if block_given?
|
36
|
-
|
37
|
+
@map_reduce.each do |doc|
|
37
38
|
yield doc
|
38
39
|
end
|
39
40
|
else
|
40
|
-
to_enum
|
41
|
+
@map_reduce.to_enum
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
@@ -64,7 +65,7 @@ module Mongoid
|
|
64
65
|
#
|
65
66
|
# @since 3.0.0
|
66
67
|
def finalize(function)
|
67
|
-
|
68
|
+
@map_reduce = @map_reduce.finalize(function)
|
68
69
|
self
|
69
70
|
end
|
70
71
|
|
@@ -79,10 +80,9 @@ module Mongoid
|
|
79
80
|
#
|
80
81
|
# @since 3.0.0
|
81
82
|
def initialize(collection, criteria, map, reduce)
|
82
|
-
@collection
|
83
|
-
|
84
|
-
|
85
|
-
apply_criteria_options
|
83
|
+
@collection = collection
|
84
|
+
@criteria = criteria
|
85
|
+
@map_reduce = @criteria.view.map_reduce(map, reduce)
|
86
86
|
end
|
87
87
|
|
88
88
|
# Get the number of documents that were input into the map/reduce.
|
@@ -106,7 +106,7 @@ module Mongoid
|
|
106
106
|
#
|
107
107
|
# @since 3.0.0
|
108
108
|
def js_mode
|
109
|
-
|
109
|
+
@map_reduce = @map_reduce.js_mode(true)
|
110
110
|
self
|
111
111
|
end
|
112
112
|
|
@@ -134,7 +134,7 @@ module Mongoid
|
|
134
134
|
normalized.update_values do |value|
|
135
135
|
value.is_a?(::Symbol) ? value.to_s : value
|
136
136
|
end
|
137
|
-
|
137
|
+
@map_reduce = @map_reduce.out(normalized)
|
138
138
|
self
|
139
139
|
end
|
140
140
|
|
@@ -159,8 +159,12 @@ module Mongoid
|
|
159
159
|
#
|
160
160
|
# @since 3.0.0
|
161
161
|
def raw
|
162
|
-
|
162
|
+
validate_out!
|
163
|
+
cmd = command
|
164
|
+
opts = { read: cmd.delete(:read).options } if cmd[:read]
|
165
|
+
@map_reduce.database.command(cmd, opts || {}).first
|
163
166
|
end
|
167
|
+
alias :results :raw
|
164
168
|
|
165
169
|
# Execute the map/reduce, returning the raw output.
|
166
170
|
# Useful when you don't care about map/reduce's ouptut.
|
@@ -196,7 +200,7 @@ module Mongoid
|
|
196
200
|
#
|
197
201
|
# @since 3.0.0
|
198
202
|
def scope(object)
|
199
|
-
|
203
|
+
@map_reduce = @map_reduce.scope(object)
|
200
204
|
self
|
201
205
|
end
|
202
206
|
|
@@ -232,113 +236,14 @@ module Mongoid
|
|
232
236
|
}
|
233
237
|
end
|
234
238
|
|
235
|
-
|
236
|
-
|
237
|
-
# Apply criteria specific options - query, sort, limit.
|
238
|
-
#
|
239
|
-
# @api private
|
240
|
-
#
|
241
|
-
# @example Apply the criteria options
|
242
|
-
# map_reduce.apply_criteria_options
|
243
|
-
#
|
244
|
-
# @return [ nil ] Nothing.
|
245
|
-
#
|
246
|
-
# @since 3.0.0
|
247
|
-
def apply_criteria_options
|
248
|
-
command[:query] = criteria.selector
|
249
|
-
if sort = criteria.options[:sort]
|
250
|
-
command[:sort] = sort
|
251
|
-
end
|
252
|
-
if limit = criteria.options[:limit]
|
253
|
-
command[:limit] = limit
|
254
|
-
end
|
239
|
+
def command
|
240
|
+
@map_reduce.send(:map_reduce_spec)[:selector]
|
255
241
|
end
|
256
242
|
|
257
|
-
|
258
|
-
# then we grab them from the results key. If the output was a temp
|
259
|
-
# collection then we need to execute a find on that collection.
|
260
|
-
#
|
261
|
-
# @api private
|
262
|
-
#
|
263
|
-
# @example Get the documents.
|
264
|
-
# map_reduce.documents
|
265
|
-
#
|
266
|
-
# @return [ Array, Cursor ] The documents.
|
267
|
-
#
|
268
|
-
# @since 3.0.0
|
269
|
-
def documents
|
270
|
-
return results["results"] if results.has_key?("results")
|
271
|
-
view = output_database[output_collection].find
|
272
|
-
view.no_cursor_timeout if criteria.options[:timeout] == false
|
273
|
-
view
|
274
|
-
end
|
275
|
-
|
276
|
-
# Get the database that the map/reduce results were stored in.
|
277
|
-
#
|
278
|
-
# @api private
|
279
|
-
#
|
280
|
-
# @example Get the output database.
|
281
|
-
# map_reduce.output_database
|
282
|
-
#
|
283
|
-
# @return [ Mongo::Database ] The output database.
|
284
|
-
#
|
285
|
-
# @since 6.0.0
|
286
|
-
def output_database
|
287
|
-
if db = command[:out].fetch(:db, command[:out]['db'])
|
288
|
-
client.with(database: db).database
|
289
|
-
else
|
290
|
-
client.database
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
# Get the collection that the map/reduce results were stored in.
|
295
|
-
#
|
296
|
-
# @api private
|
297
|
-
#
|
298
|
-
# @example Get the output collection.
|
299
|
-
# map_reduce.output_collection
|
300
|
-
#
|
301
|
-
# @return [ Symbol, String ] The output collection.
|
302
|
-
#
|
303
|
-
# @since 3.0.0
|
304
|
-
def output_collection
|
305
|
-
command[:out].values.first
|
306
|
-
end
|
307
|
-
|
308
|
-
# Execute the map/reduce command and get the results.
|
309
|
-
#
|
310
|
-
# @api private
|
311
|
-
#
|
312
|
-
# @example Get the results.
|
313
|
-
# map_reduce.results
|
314
|
-
#
|
315
|
-
# @return [ Hash ] The results of the command.
|
316
|
-
#
|
317
|
-
# @since 3.0.0
|
318
|
-
def results
|
319
|
-
raise Errors::NoMapReduceOutput.new(command) unless command[:out]
|
320
|
-
@results ||= __client__.command(command,__client__.options).first
|
321
|
-
end
|
243
|
+
private
|
322
244
|
|
323
|
-
|
324
|
-
|
325
|
-
# @api private
|
326
|
-
#
|
327
|
-
# @note We can use eventual if the output is set to inline.
|
328
|
-
#
|
329
|
-
# @example Get the client.
|
330
|
-
# map_reduce.__client__
|
331
|
-
#
|
332
|
-
# @return [ Mongo::Client ] The client with consistency set.
|
333
|
-
#
|
334
|
-
# @since 3.0.15
|
335
|
-
def __client__
|
336
|
-
if command[:out][:inline] != 1
|
337
|
-
# @todo: close
|
338
|
-
client.with(read: { mode: :primary })
|
339
|
-
else
|
340
|
-
client
|
341
|
-
end
|
245
|
+
def validate_out!
|
246
|
+
raise Errors::NoMapReduceOutput.new({}) unless @map_reduce.out
|
342
247
|
end
|
343
248
|
end
|
344
249
|
end
|
@@ -18,7 +18,19 @@ module Mongoid
|
|
18
18
|
# Options constant.
|
19
19
|
#
|
20
20
|
# @since 5.0.0
|
21
|
-
OPTIONS = [ :hint,
|
21
|
+
OPTIONS = [ :hint,
|
22
|
+
:limit,
|
23
|
+
:skip,
|
24
|
+
:sort,
|
25
|
+
:batch_size,
|
26
|
+
:max_scan,
|
27
|
+
:max_time_ms,
|
28
|
+
:snapshot,
|
29
|
+
:comment,
|
30
|
+
:read,
|
31
|
+
:cursor_type,
|
32
|
+
:collation
|
33
|
+
].freeze
|
22
34
|
|
23
35
|
# @attribute [r] view The Mongo collection view.
|
24
36
|
attr_reader :view
|
@@ -68,9 +80,7 @@ module Mongoid
|
|
68
80
|
#
|
69
81
|
# @since 3.0.0
|
70
82
|
def delete
|
71
|
-
|
72
|
-
view.delete_many
|
73
|
-
end
|
83
|
+
view.delete_many.deleted_count
|
74
84
|
end
|
75
85
|
alias :delete_all :delete
|
76
86
|
|
@@ -83,11 +93,10 @@ module Mongoid
|
|
83
93
|
#
|
84
94
|
# @since 3.0.0
|
85
95
|
def destroy
|
86
|
-
|
87
|
-
each do |doc|
|
96
|
+
each.inject(0) do |count, doc|
|
88
97
|
doc.destroy
|
98
|
+
count += 1
|
89
99
|
end
|
90
|
-
destroyed
|
91
100
|
end
|
92
101
|
alias :destroy_all :destroy
|
93
102
|
|
@@ -568,12 +577,6 @@ module Mongoid
|
|
568
577
|
if criteria.options[:timeout] == false
|
569
578
|
@view = view.no_cursor_timeout
|
570
579
|
end
|
571
|
-
if criteria.options[:cursor_type]
|
572
|
-
# @todo: update to use #cursor_type method on view when driver 2.3 is released.
|
573
|
-
# See RUBY-1080
|
574
|
-
@view = view.clone
|
575
|
-
@view.options.merge!(cursor_type: criteria.options[:cursor_type])
|
576
|
-
end
|
577
580
|
end
|
578
581
|
|
579
582
|
# Apply an option.
|
@@ -324,6 +324,20 @@ module Mongoid
|
|
324
324
|
clone.tap { |query| query.options.store(:cursor_type, type) }
|
325
325
|
end
|
326
326
|
|
327
|
+
# Set the collation.
|
328
|
+
#
|
329
|
+
# @example Set the collation.
|
330
|
+
# optional.collation(locale: 'fr', strength: 2)
|
331
|
+
#
|
332
|
+
# @param [ Hash ] collation_doc The document describing the collation to use.
|
333
|
+
#
|
334
|
+
# @return [ Optional ] The cloned optional.
|
335
|
+
#
|
336
|
+
# @since 6.1.0
|
337
|
+
def collation(collation_doc)
|
338
|
+
clone.tap { |query| query.options.store(:collation, collation_doc) }
|
339
|
+
end
|
340
|
+
|
327
341
|
private
|
328
342
|
|
329
343
|
# Add a single sort option.
|
data/lib/mongoid/errors.rb
CHANGED
@@ -5,6 +5,7 @@ require "mongoid/errors/callback"
|
|
5
5
|
require "mongoid/errors/document_not_destroyed"
|
6
6
|
require "mongoid/errors/document_not_found"
|
7
7
|
require "mongoid/errors/eager_load"
|
8
|
+
require "mongoid/errors/in_memory_collation_not_supported"
|
8
9
|
require "mongoid/errors/invalid_collection"
|
9
10
|
require "mongoid/errors/invalid_config_option"
|
10
11
|
require "mongoid/errors/invalid_field"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Errors
|
4
|
+
|
5
|
+
# This error is raised when attempting to do a query with a
|
6
|
+
# collation on documents in memory.
|
7
|
+
class InMemoryCollationNotSupported < MongoidError
|
8
|
+
|
9
|
+
# Create the new error.
|
10
|
+
#
|
11
|
+
# @example Create the new unsupported collation error.
|
12
|
+
# InMemoryCollationNotSupported.new
|
13
|
+
#
|
14
|
+
# @since 6.1.0
|
15
|
+
def initialize
|
16
|
+
super(compose_message("in_memory_collation_not_supported"))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -19,7 +19,7 @@ module Mongoid
|
|
19
19
|
# @return [ String ] The composed message.
|
20
20
|
#
|
21
21
|
# @since 3.0.0
|
22
|
-
def compose_message(key, attributes)
|
22
|
+
def compose_message(key, attributes = {})
|
23
23
|
@problem = translate_problem(key, attributes)
|
24
24
|
@summary = translate_summary(key, attributes)
|
25
25
|
@resolution = translate_resolution(key, attributes)
|