mongo 2.1.2 → 2.2.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 +0 -0
- data/README.md +10 -3
- data/Rakefile +1 -7
- data/lib/csasl/csasl.bundle +0 -0
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/bulk_write.rb +7 -1
- data/lib/mongo/client.rb +17 -15
- data/lib/mongo/cluster.rb +4 -2
- data/lib/mongo/collection.rb +36 -2
- data/lib/mongo/collection/view.rb +24 -21
- data/lib/mongo/collection/view/aggregation.rb +5 -42
- data/lib/mongo/collection/view/builder.rb +20 -0
- data/lib/mongo/collection/view/builder/aggregation.rb +98 -0
- data/lib/mongo/collection/view/builder/find_command.rb +111 -0
- data/lib/mongo/collection/view/builder/flags.rb +62 -0
- data/lib/mongo/collection/view/builder/map_reduce.rb +134 -0
- data/lib/mongo/collection/view/builder/modifiers.rb +80 -0
- data/lib/mongo/collection/view/builder/op_query.rb +83 -0
- data/lib/mongo/collection/view/explainable.rb +15 -0
- data/lib/mongo/collection/view/immutable.rb +5 -12
- data/lib/mongo/collection/view/iterable.rb +24 -2
- data/lib/mongo/collection/view/map_reduce.rb +18 -27
- data/lib/mongo/collection/view/readable.rb +70 -112
- data/lib/mongo/collection/view/writable.rb +23 -7
- data/lib/mongo/cursor.rb +76 -25
- data/lib/mongo/cursor/builder.rb +18 -0
- data/lib/mongo/cursor/builder/get_more_command.rb +71 -0
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +62 -0
- data/lib/mongo/cursor/builder/op_get_more.rb +61 -0
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +56 -0
- data/lib/mongo/database.rb +2 -2
- data/lib/mongo/database/view.rb +9 -5
- data/lib/mongo/dbref.rb +3 -3
- data/lib/mongo/error.rb +1 -0
- data/lib/mongo/error/invalid_write_concern.rb +35 -0
- data/lib/mongo/grid/file/chunk.rb +2 -2
- data/lib/mongo/index/view.rb +5 -2
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/commands.rb +2 -0
- data/lib/mongo/operation/commands/aggregate.rb +39 -45
- data/lib/mongo/operation/commands/aggregate/result.rb +54 -68
- data/lib/mongo/operation/commands/collections_info.rb +38 -36
- data/lib/mongo/operation/commands/collections_info/result.rb +17 -15
- data/lib/mongo/operation/commands/command.rb +24 -22
- data/lib/mongo/operation/commands/find.rb +27 -0
- data/lib/mongo/operation/commands/find/result.rb +62 -0
- data/lib/mongo/operation/commands/get_more.rb +27 -0
- data/lib/mongo/operation/commands/get_more/result.rb +62 -0
- data/lib/mongo/operation/commands/indexes.rb +41 -39
- data/lib/mongo/operation/commands/list_collections.rb +25 -31
- data/lib/mongo/operation/commands/list_collections/result.rb +63 -81
- data/lib/mongo/operation/commands/list_indexes.rb +27 -35
- data/lib/mongo/operation/commands/list_indexes/result.rb +67 -85
- data/lib/mongo/operation/commands/map_reduce.rb +29 -37
- data/lib/mongo/operation/commands/map_reduce/result.rb +85 -88
- data/lib/mongo/operation/commands/parallel_scan.rb +29 -33
- data/lib/mongo/operation/commands/parallel_scan/result.rb +34 -42
- data/lib/mongo/operation/commands/user_query.rb +40 -38
- data/lib/mongo/operation/commands/users_info.rb +24 -29
- data/lib/mongo/operation/commands/users_info/result.rb +13 -11
- data/lib/mongo/operation/object_id_generator.rb +36 -0
- data/lib/mongo/operation/result.rb +30 -0
- data/lib/mongo/operation/specifiable.rb +35 -1
- data/lib/mongo/operation/write/bulk/bulkable.rb +4 -3
- data/lib/mongo/operation/write/bulk/delete/result.rb +18 -25
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +2 -2
- data/lib/mongo/operation/write/command/delete.rb +3 -2
- data/lib/mongo/operation/write/command/insert.rb +4 -2
- data/lib/mongo/operation/write/command/update.rb +6 -3
- data/lib/mongo/operation/write/gle.rb +2 -1
- data/lib/mongo/operation/write/idable.rb +19 -2
- data/lib/mongo/options/mapper.rb +22 -0
- data/lib/mongo/protocol/bit_vector.rb +3 -3
- data/lib/mongo/protocol/delete.rb +15 -5
- data/lib/mongo/protocol/get_more.rb +10 -5
- data/lib/mongo/protocol/insert.rb +1 -6
- data/lib/mongo/protocol/kill_cursors.rb +14 -1
- data/lib/mongo/protocol/message.rb +32 -8
- data/lib/mongo/protocol/serializers.rb +15 -16
- data/lib/mongo/protocol/update.rb +35 -12
- data/lib/mongo/server/connectable.rb +3 -1
- data/lib/mongo/server/connection.rb +5 -5
- data/lib/mongo/server/description.rb +8 -2
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/monitor.rb +1 -12
- data/lib/mongo/server/monitor/connection.rb +30 -26
- data/lib/mongo/server_selector/selectable.rb +21 -4
- data/lib/mongo/uri.rb +2 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern.rb +21 -6
- data/mongo.gemspec +1 -2
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +13 -0
- data/spec/mongo/bulk_write_spec.rb +58 -0
- data/spec/mongo/client_spec.rb +6 -4
- data/spec/mongo/collection/view/builder/find_command_spec.rb +167 -0
- data/spec/mongo/collection/view/builder/flags_spec.rb +106 -0
- data/spec/mongo/collection/view/builder/modifiers_spec.rb +210 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +154 -0
- data/spec/mongo/collection/view/explainable_spec.rb +1 -2
- data/spec/mongo/collection/view/immutable_spec.rb +3 -52
- data/spec/mongo/collection/view/map_reduce_spec.rb +12 -12
- data/spec/mongo/collection/view/readable_spec.rb +86 -80
- data/spec/mongo/collection/view_spec.rb +109 -703
- data/spec/mongo/collection_spec.rb +594 -11
- data/spec/mongo/command_monitoring_spec.rb +40 -27
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +160 -0
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +52 -0
- data/spec/mongo/cursor_spec.rb +10 -60
- data/spec/mongo/database_spec.rb +24 -3
- data/spec/mongo/dbref_spec.rb +4 -4
- data/spec/mongo/grid/file/chunk_spec.rb +1 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +3 -3
- data/spec/mongo/index/view_spec.rb +41 -0
- data/spec/mongo/operation/{aggregate → commands/aggregate}/result_spec.rb +1 -1
- data/spec/mongo/operation/commands/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/commands/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/commands/command_spec.rb +1 -1
- data/spec/mongo/operation/commands/indexes_spec.rb +1 -1
- data/spec/mongo/operation/commands/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/write/command/delete_spec.rb +25 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +25 -0
- data/spec/mongo/operation/write/command/update_spec.rb +25 -0
- data/spec/mongo/protocol/delete_spec.rb +4 -4
- data/spec/mongo/protocol/get_more_spec.rb +4 -4
- data/spec/mongo/protocol/insert_spec.rb +3 -3
- data/spec/mongo/protocol/kill_cursors_spec.rb +3 -3
- data/spec/mongo/protocol/query_spec.rb +7 -7
- data/spec/mongo/protocol/update_spec.rb +5 -5
- data/spec/mongo/server/description/features_spec.rb +25 -0
- data/spec/mongo/write_concern_spec.rb +126 -0
- data/spec/spec_helper.rb +9 -19
- data/spec/support/command_monitoring.rb +8 -0
- data/spec/support/command_monitoring/find.yml +53 -4
- data/spec/support/matchers.rb +1 -1
- data/spec/support/shared/protocol.rb +5 -5
- data/spec/support/travis.rb +1 -1
- metadata +43 -10
- 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: dcc9c2c71373a6cf0c7ecc20e34dc665a3609113
|
4
|
+
data.tar.gz: b0586f936825521d4d1b720aaab115094c754b52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bd095acd88b753375c7b32441645a7f79bd6e79fa66c4b49d1d16f98a17a3ebb88628132d863dee8a49132b0ad06cd540fc329b37d3250e1793ecf0ce0fbb55
|
7
|
+
data.tar.gz: 8081fad549d197c92f9b573694b32a1813030fcde279e98ab117dd9d4b601b5bb2139a720c218b03fadd3315a8a9f391066f7ad96c99f194ce1cf186b6a56673
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
MongoDB Ruby Driver [![Build Status][travis-img]][travis-url] [![Code Climate][codeclimate-img]][codeclimate-url] [![
|
1
|
+
MongoDB Ruby Driver [![Build Status][travis-img]][travis-url] [![Code Climate][codeclimate-img]][codeclimate-url] [![Gem Version][rubygems-img]][rubygems-url]
|
2
2
|
-----
|
3
3
|
The officially supported Ruby driver for [MongoDB](http://www.mongodb.org).
|
4
4
|
|
@@ -40,6 +40,15 @@ When reporting an issue, please keep in mind that all information in JIRA for al
|
|
40
40
|
* Provide any sensitive data or server logs.
|
41
41
|
* Report potential security issues publicly (see 'Security Issues').
|
42
42
|
|
43
|
+
Running Tests
|
44
|
+
-----
|
45
|
+
|
46
|
+
The driver uses RSpec as it's primary testing tool. To run all tests simple run `rspec`.
|
47
|
+
|
48
|
+
To run a test at a specific location (where `42` is the line number), use:
|
49
|
+
|
50
|
+
rspec path/to/spec.rb:42
|
51
|
+
|
43
52
|
Security Issues
|
44
53
|
-----
|
45
54
|
|
@@ -74,5 +83,3 @@ License
|
|
74
83
|
[travis-url]: http://travis-ci.org/mongodb/mongo-ruby-driver?branch=master
|
75
84
|
[codeclimate-img]: https://codeclimate.com/github/mongodb/mongo-ruby-driver.png?branch=master
|
76
85
|
[codeclimate-url]: https://codeclimate.com/github/mongodb/mongo-ruby-driver?branch=master
|
77
|
-
[coveralls-img]: https://coveralls.io/repos/mongodb/mongo-ruby-driver/badge.png?branch=master
|
78
|
-
[coveralls-url]: https://coveralls.io/r/mongodb/mongo-ruby-driver?branch=master
|
data/Rakefile
CHANGED
@@ -19,13 +19,7 @@ RSpec::Core::RakeTask.new(:spec)
|
|
19
19
|
task :default => :spec
|
20
20
|
|
21
21
|
namespace :spec do
|
22
|
-
|
23
|
-
require 'coveralls/rake/task'
|
24
|
-
Coveralls::RakeTask.new
|
25
|
-
task :ci => [:spec, 'coveralls:push']
|
26
|
-
else
|
27
|
-
task :ci => [:spec]
|
28
|
-
end
|
22
|
+
task :ci => [:spec]
|
29
23
|
end
|
30
24
|
|
31
25
|
task :release => :spec do
|
Binary file
|
data/lib/mongo/auth/user/view.rb
CHANGED
data/lib/mongo/bulk_write.rb
CHANGED
@@ -37,6 +37,8 @@ module Mongo
|
|
37
37
|
# Delegate various methods to the collection.
|
38
38
|
def_delegators :@collection, :database, :cluster, :next_primary
|
39
39
|
|
40
|
+
def_delegators :database, :client
|
41
|
+
|
40
42
|
# Execute the bulk write operation.
|
41
43
|
#
|
42
44
|
# @example Execute the bulk write.
|
@@ -131,7 +133,10 @@ module Mongo
|
|
131
133
|
:coll_name => collection.name,
|
132
134
|
:write_concern => write_concern,
|
133
135
|
:ordered => ordered?,
|
134
|
-
:operation_id => operation_id
|
136
|
+
:operation_id => operation_id,
|
137
|
+
:bypass_document_validation => !!options[:bypass_document_validation],
|
138
|
+
:options => options,
|
139
|
+
:id_generator => client.options[:id_generator]
|
135
140
|
}
|
136
141
|
end
|
137
142
|
|
@@ -143,6 +148,7 @@ module Mongo
|
|
143
148
|
combiner.combine!(send(name, values, server, operation_id), values.size)
|
144
149
|
end
|
145
150
|
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
151
|
+
raise e if values.size <= 1
|
146
152
|
split_execute(name, values, server, operation_id, combiner)
|
147
153
|
end
|
148
154
|
end
|
data/lib/mongo/client.rb
CHANGED
@@ -33,33 +33,35 @@ module Mongo
|
|
33
33
|
# @since 2.1.2
|
34
34
|
VALID_OPTIONS = [
|
35
35
|
:auth_mech,
|
36
|
+
:auth_mech_properties,
|
36
37
|
:auth_source,
|
37
38
|
:connect,
|
39
|
+
:connect_timeout,
|
38
40
|
:database,
|
39
|
-
:auth_mech_properties,
|
40
41
|
:heartbeat_frequency,
|
42
|
+
:id_generator,
|
41
43
|
:local_threshold,
|
42
|
-
:
|
43
|
-
:password,
|
44
|
+
:logger,
|
44
45
|
:max_pool_size,
|
46
|
+
:max_read_retries,
|
45
47
|
:min_pool_size,
|
46
|
-
:
|
47
|
-
:
|
48
|
+
:monitoring,
|
49
|
+
:password,
|
48
50
|
:read,
|
49
|
-
:
|
51
|
+
:read_retry_interval,
|
50
52
|
:replica_set,
|
53
|
+
:server_selection_timeout,
|
54
|
+
:socket_timeout,
|
51
55
|
:ssl,
|
56
|
+
:ssl_ca_cert,
|
52
57
|
:ssl_cert,
|
53
58
|
:ssl_key,
|
54
59
|
:ssl_key_pass_phrase,
|
55
60
|
:ssl_verify,
|
56
|
-
:
|
57
|
-
:socket_timeout,
|
61
|
+
:truncate_logs,
|
58
62
|
:user,
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:logger,
|
62
|
-
:truncate_logs
|
63
|
+
:wait_queue_timeout,
|
64
|
+
:write
|
63
65
|
].freeze
|
64
66
|
|
65
67
|
# @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
|
@@ -160,8 +162,6 @@ module Mongo
|
|
160
162
|
# and local_threshold.
|
161
163
|
# :mode can be one of :secondary, :secondary_preferred, :primary,
|
162
164
|
# :primary_preferred, :nearest.
|
163
|
-
# @option options [ Array<Hash, String> ] :roles The list of roles for the
|
164
|
-
# user.
|
165
165
|
# @option options [ Symbol ] :replica_set The name of the replica set to
|
166
166
|
# connect to. Servers not in this replica set will be ignored.
|
167
167
|
# @option options [ true, false ] :ssl Whether to use SSL.
|
@@ -180,7 +180,7 @@ module Mongo
|
|
180
180
|
# execute operations on a socket.
|
181
181
|
# @option options [ String ] :user The user name.
|
182
182
|
# @option options [ Hash ] :write The write concern options. Can be :w =>
|
183
|
-
# Integer, :fsync => Boolean, :j => Boolean.
|
183
|
+
# Integer|String, :fsync => Boolean, :j => Boolean.
|
184
184
|
# @option options [ true, false ] :monitoring Initializes a client without
|
185
185
|
# any default monitoring if false is provided.
|
186
186
|
# @option options [ Logger ] :logger A custom logger if desired.
|
@@ -190,6 +190,8 @@ module Mongo
|
|
190
190
|
# retries on mongos query failures.
|
191
191
|
# @option options [ Float ] :read_retry_interval The interval, in seconds,
|
192
192
|
# in which reads on a mongos are retried.
|
193
|
+
# @option options [ Object ] :id_generator A custom object to generate ids
|
194
|
+
# for documents. Must respond to #generate.
|
193
195
|
#
|
194
196
|
# @since 2.0.0
|
195
197
|
def initialize(addresses_or_uri, options = Options::Redacted.new)
|
data/lib/mongo/cluster.rb
CHANGED
@@ -131,11 +131,13 @@ module Mongo
|
|
131
131
|
# @example Get the next primary server.
|
132
132
|
# cluster.next_primary
|
133
133
|
#
|
134
|
+
# @param [ true, false ] ping Whether to ping the server before selection.
|
135
|
+
#
|
134
136
|
# @return [ Mongo::Server ] A primary server.
|
135
137
|
#
|
136
138
|
# @since 2.0.0
|
137
|
-
def next_primary
|
138
|
-
ServerSelector.get(ServerSelector::PRIMARY.merge(options)).select_server(self)
|
139
|
+
def next_primary(ping = true)
|
140
|
+
ServerSelector.get(ServerSelector::PRIMARY.merge(options)).select_server(self, ping)
|
139
141
|
end
|
140
142
|
|
141
143
|
# Elect a primary server from the description that has just changed to a
|
data/lib/mongo/collection.rb
CHANGED
@@ -56,7 +56,7 @@ module Mongo
|
|
56
56
|
# Options that can be updated on a new Collection instance via the #with method.
|
57
57
|
#
|
58
58
|
# @since 2.1.0
|
59
|
-
CHANGEABLE_OPTIONS = [ :read, :write ]
|
59
|
+
CHANGEABLE_OPTIONS = [ :read, :read_concern, :write ].freeze
|
60
60
|
|
61
61
|
# Check if a collection is equal to another object. Will check the name and
|
62
62
|
# the database for equality.
|
@@ -91,6 +91,18 @@ module Mongo
|
|
91
91
|
@options = options.freeze
|
92
92
|
end
|
93
93
|
|
94
|
+
# Get the read concern for this collection instance.
|
95
|
+
#
|
96
|
+
# @example Get the read concern.
|
97
|
+
# collection.read_concern
|
98
|
+
#
|
99
|
+
# @return [ Hash ] The read concern.
|
100
|
+
#
|
101
|
+
# @since 2.2.0
|
102
|
+
def read_concern
|
103
|
+
@read_concern ||= options[:read_concern]
|
104
|
+
end
|
105
|
+
|
94
106
|
# Get the read preference on this collection.
|
95
107
|
#
|
96
108
|
# @example Get the read preference.
|
@@ -235,6 +247,8 @@ module Mongo
|
|
235
247
|
# aggregation to run.
|
236
248
|
# @option options [ true, false ] :use_cursor Indicates whether the command will request that the server
|
237
249
|
# provide results using a cursor.
|
250
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
251
|
+
# not to skip document level validation.
|
238
252
|
#
|
239
253
|
# @return [ Aggregation ] The aggregation object.
|
240
254
|
#
|
@@ -326,7 +340,9 @@ module Mongo
|
|
326
340
|
:db_name => database.name,
|
327
341
|
:coll_name => name,
|
328
342
|
:write_concern => write_concern,
|
329
|
-
:
|
343
|
+
:bypass_document_validation => !!options[:bypass_document_validation],
|
344
|
+
:options => options,
|
345
|
+
:id_generator => client.options[:id_generator]
|
330
346
|
).execute(next_primary.context)
|
331
347
|
end
|
332
348
|
end
|
@@ -359,6 +375,8 @@ module Mongo
|
|
359
375
|
# should be executed in order.
|
360
376
|
# @option options [ Hash ] :write_concern The write concern options.
|
361
377
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
378
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
379
|
+
# not to skip document level validation.
|
362
380
|
#
|
363
381
|
# @return [ BulkWrite::Result ] The result of the operation.
|
364
382
|
#
|
@@ -424,6 +442,8 @@ module Mongo
|
|
424
442
|
#
|
425
443
|
# @option options [ true, false ] :upsert Whether to upsert if the
|
426
444
|
# document doesn't exist.
|
445
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
446
|
+
# not to skip document level validation.
|
427
447
|
#
|
428
448
|
# @return [ Result ] The response from the database.
|
429
449
|
#
|
@@ -443,6 +463,8 @@ module Mongo
|
|
443
463
|
#
|
444
464
|
# @option options [ true, false ] :upsert Whether to upsert if the
|
445
465
|
# document doesn't exist.
|
466
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
467
|
+
# not to skip document level validation.
|
446
468
|
#
|
447
469
|
# @return [ Result ] The response from the database.
|
448
470
|
#
|
@@ -462,6 +484,8 @@ module Mongo
|
|
462
484
|
#
|
463
485
|
# @option options [ true, false ] :upsert Whether to upsert if the
|
464
486
|
# document doesn't exist.
|
487
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
488
|
+
# not to skip document level validation.
|
465
489
|
#
|
466
490
|
# @return [ Result ] The response from the database.
|
467
491
|
#
|
@@ -484,6 +508,8 @@ module Mongo
|
|
484
508
|
# @option options [ Hash ] :projection The fields to include or exclude in the returned doc.
|
485
509
|
# @option options [ Hash ] :sort The key and direction pairs by which the result set
|
486
510
|
# will be sorted.
|
511
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
512
|
+
# Defaults to the collection's write concern.
|
487
513
|
#
|
488
514
|
# @return [ BSON::Document, nil ] The document, if found.
|
489
515
|
#
|
@@ -512,6 +538,10 @@ module Mongo
|
|
512
538
|
# will be sorted.
|
513
539
|
# @option options [ Symbol ] :return_document Either :before or :after.
|
514
540
|
# @option options [ true, false ] :upsert Whether to upsert if the document doesn't exist.
|
541
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
542
|
+
# not to skip document level validation.
|
543
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
544
|
+
# Defaults to the collection's write concern.
|
515
545
|
#
|
516
546
|
# @return [ BSON::Document ] The document.
|
517
547
|
#
|
@@ -540,6 +570,10 @@ module Mongo
|
|
540
570
|
# will be sorted.
|
541
571
|
# @option options [ Symbol ] :return_document Either :before or :after.
|
542
572
|
# @option options [ true, false ] :upsert Whether to upsert if the document doesn't exist.
|
573
|
+
# @option options [ true, false ] :bypass_document_validation Whether or
|
574
|
+
# not to skip document level validation.
|
575
|
+
# @option options [ Hash ] :write_concern The write concern options.
|
576
|
+
# Defaults to the collection's write concern.
|
543
577
|
#
|
544
578
|
# @return [ BSON::Document ] The document.
|
545
579
|
#
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
require 'mongo/collection/view/builder'
|
15
16
|
require 'mongo/collection/view/immutable'
|
16
17
|
require 'mongo/collection/view/iterable'
|
17
18
|
require 'mongo/collection/view/explainable'
|
@@ -48,10 +49,11 @@ module Mongo
|
|
48
49
|
include Explainable
|
49
50
|
include Writable
|
50
51
|
|
51
|
-
# @return [
|
52
|
+
# @return [ Collection ] The +Collection+ to query.
|
52
53
|
attr_reader :collection
|
53
|
-
|
54
|
-
|
54
|
+
|
55
|
+
# @return [ Hash ] The query filter.
|
56
|
+
attr_reader :filter
|
55
57
|
|
56
58
|
# Delegate necessary operations to the collection.
|
57
59
|
def_delegators :collection, :client, :cluster, :database, :read_preference, :write_concern
|
@@ -59,25 +61,27 @@ module Mongo
|
|
59
61
|
# Delegate to the cluster for the next primary.
|
60
62
|
def_delegators :cluster, :next_primary
|
61
63
|
|
64
|
+
alias :selector :filter
|
65
|
+
|
62
66
|
# Compare two +View+ objects.
|
63
67
|
#
|
64
68
|
# @example Compare the view with another object.
|
65
69
|
# view == other
|
66
70
|
#
|
67
|
-
# @return [ true, false ] Equal if collection,
|
71
|
+
# @return [ true, false ] Equal if collection, filter, and options of two
|
68
72
|
# +View+ match.
|
69
73
|
#
|
70
74
|
# @since 2.0.0
|
71
75
|
def ==(other)
|
72
76
|
return false unless other.is_a?(View)
|
73
77
|
collection == other.collection &&
|
74
|
-
|
78
|
+
filter == other.filter &&
|
75
79
|
options == other.options
|
76
80
|
end
|
77
81
|
alias_method :eql?, :==
|
78
82
|
|
79
83
|
# A hash value for the +View+ composed of the collection namespace,
|
80
|
-
# hash of the options and hash of the
|
84
|
+
# hash of the options and hash of the filter.
|
81
85
|
#
|
82
86
|
# @example Get the hash value.
|
83
87
|
# view.hash
|
@@ -86,7 +90,7 @@ module Mongo
|
|
86
90
|
#
|
87
91
|
# @since 2.0.0
|
88
92
|
def hash
|
89
|
-
[ collection.namespace, options.hash,
|
93
|
+
[ collection.namespace, options.hash, filter.hash ].hash
|
90
94
|
end
|
91
95
|
|
92
96
|
# Creates a new +View+.
|
@@ -101,7 +105,7 @@ module Mongo
|
|
101
105
|
# View.new(collection, {:name => 'Emily'}, :read => :secondary_preferred)
|
102
106
|
#
|
103
107
|
# @param [ Collection ] collection The +Collection+ to query.
|
104
|
-
# @param [ Hash ]
|
108
|
+
# @param [ Hash ] filter The query filter.
|
105
109
|
# @param [ Hash ] options The additional query options.
|
106
110
|
#
|
107
111
|
# @option options :comment [ String ] Associate a comment with the query.
|
@@ -125,10 +129,10 @@ module Mongo
|
|
125
129
|
# results.
|
126
130
|
#
|
127
131
|
# @since 2.0.0
|
128
|
-
def initialize(collection,
|
129
|
-
validate_doc!(
|
132
|
+
def initialize(collection, filter = {}, options = {})
|
133
|
+
validate_doc!(filter)
|
130
134
|
@collection = collection
|
131
|
-
|
135
|
+
parse_parameters!(BSON::Document.new(filter.freeze), BSON::Document.new(options.freeze))
|
132
136
|
end
|
133
137
|
|
134
138
|
# Get a human-readable string representation of +View+.
|
@@ -140,8 +144,8 @@ module Mongo
|
|
140
144
|
#
|
141
145
|
# @since 2.0.0
|
142
146
|
def inspect
|
143
|
-
"#<Mongo::Collection::View:0x#{object_id} namespace='#{collection.namespace}" +
|
144
|
-
" @
|
147
|
+
"#<Mongo::Collection::View:0x#{object_id} namespace='#{collection.namespace}'" +
|
148
|
+
" @filter=#{filter.to_s} @options=#{options.to_s}>"
|
145
149
|
end
|
146
150
|
|
147
151
|
private
|
@@ -149,19 +153,18 @@ module Mongo
|
|
149
153
|
def initialize_copy(other)
|
150
154
|
@collection = other.collection
|
151
155
|
@options = other.options.dup
|
152
|
-
@
|
156
|
+
@filter = other.filter.dup
|
153
157
|
end
|
154
158
|
|
155
|
-
def
|
156
|
-
|
159
|
+
def parse_parameters!(filter, options)
|
160
|
+
query = filter.delete(QUERY)
|
161
|
+
modifiers = (filter || {}).merge(options.delete(MODIFIERS) || {})
|
162
|
+
@filter = query || filter
|
163
|
+
@options = Builder::Modifiers.map_driver_options(modifiers).merge!(options)
|
157
164
|
end
|
158
165
|
|
159
166
|
def new(options)
|
160
|
-
View.new(collection,
|
161
|
-
end
|
162
|
-
|
163
|
-
def send_initial_query(server)
|
164
|
-
initial_query_op.execute(server.context)
|
167
|
+
View.new(collection, filter, options)
|
165
168
|
end
|
166
169
|
|
167
170
|
def view; self; end
|
@@ -39,15 +39,6 @@ module Mongo
|
|
39
39
|
# Delegate necessary operations to the collection.
|
40
40
|
def_delegators :collection, :database
|
41
41
|
|
42
|
-
# Options mapping for an aggregation.
|
43
|
-
#
|
44
|
-
# @since 2.1.0
|
45
|
-
OPTIONS_MAP = {
|
46
|
-
:allow_disk_use => :allowDiskUse,
|
47
|
-
:max_time_ms => :maxTimeMS,
|
48
|
-
:explain => :explain
|
49
|
-
}.freeze
|
50
|
-
|
51
42
|
# The reroute message.
|
52
43
|
#
|
53
44
|
# @since 2.1.0
|
@@ -65,7 +56,7 @@ module Mongo
|
|
65
56
|
#
|
66
57
|
# @since 2.0.0
|
67
58
|
def allow_disk_use(value = nil)
|
68
|
-
configure(
|
59
|
+
configure(:allow_disk_use, value)
|
69
60
|
end
|
70
61
|
|
71
62
|
# Initialize the aggregation for the provided collection view, pipeline
|
@@ -94,41 +85,13 @@ module Mongo
|
|
94
85
|
#
|
95
86
|
# @since 2.0.0
|
96
87
|
def explain
|
97
|
-
self.class.new(view, pipeline, options.merge(
|
88
|
+
self.class.new(view, pipeline, options.merge(explain: true)).first
|
98
89
|
end
|
99
90
|
|
100
91
|
private
|
101
92
|
|
102
93
|
def aggregate_spec
|
103
|
-
|
104
|
-
:read => read,
|
105
|
-
:selector => {
|
106
|
-
:aggregate => collection.name,
|
107
|
-
:pipeline => pipeline,
|
108
|
-
:cursor => cursor,
|
109
|
-
}.merge!(agg_options)
|
110
|
-
}
|
111
|
-
end
|
112
|
-
|
113
|
-
def agg_options
|
114
|
-
@agg_options ||= options.each.reduce({}) do |opts, (key, value)|
|
115
|
-
OPTIONS_MAP[key] ? opts.merge!(OPTIONS_MAP[key] => value) : opts
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def cursor
|
120
|
-
if options[:use_cursor] == true || options[:use_cursor].nil?
|
121
|
-
batch_size_doc
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def batch_size_doc
|
126
|
-
(value = options[:batch_size] || view.batch_size) ?
|
127
|
-
{ :batchSize => value } : {}
|
128
|
-
end
|
129
|
-
|
130
|
-
def explain_options
|
131
|
-
{ :explain => true }
|
94
|
+
Builder::Aggregation.new(pipeline, view, options).specification
|
132
95
|
end
|
133
96
|
|
134
97
|
def new(options)
|
@@ -136,7 +99,7 @@ module Mongo
|
|
136
99
|
end
|
137
100
|
|
138
101
|
def initial_query_op
|
139
|
-
Operation::Aggregate.new(aggregate_spec)
|
102
|
+
Operation::Commands::Aggregate.new(aggregate_spec)
|
140
103
|
end
|
141
104
|
|
142
105
|
def valid_server?(server)
|
@@ -150,7 +113,7 @@ module Mongo
|
|
150
113
|
def send_initial_query(server)
|
151
114
|
unless valid_server?(server)
|
152
115
|
log_warn(REROUTE)
|
153
|
-
server = cluster.next_primary
|
116
|
+
server = cluster.next_primary(false)
|
154
117
|
end
|
155
118
|
initial_query_op.execute(server.context)
|
156
119
|
end
|