mongo 1.10.2 → 1.11.1
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 +43 -9
- data/VERSION +1 -1
- data/lib/mongo.rb +1 -0
- data/lib/mongo/collection.rb +36 -21
- data/lib/mongo/connection/pool.rb +14 -22
- data/lib/mongo/cursor.rb +13 -0
- data/lib/mongo/db.rb +18 -13
- data/lib/mongo/functional.rb +0 -2
- data/lib/mongo/functional/authentication.rb +35 -25
- data/lib/mongo/legacy.rb +4 -4
- data/mongo.gemspec +0 -5
- data/test/functional/authentication_test.rb +3 -2
- data/test/functional/bulk_write_collection_view_test.rb +9 -14
- data/test/functional/client_test.rb +42 -43
- data/test/functional/collection_test.rb +1073 -995
- data/test/functional/collection_writer_test.rb +1 -1
- data/test/functional/cursor_fail_test.rb +3 -9
- data/test/functional/cursor_message_test.rb +14 -15
- data/test/functional/cursor_test.rb +224 -166
- data/test/functional/db_api_test.rb +262 -261
- data/test/functional/db_connection_test.rb +1 -3
- data/test/functional/db_test.rb +116 -115
- data/test/functional/grid_file_system_test.rb +108 -108
- data/test/functional/pool_test.rb +73 -0
- data/test/functional/timeout_test.rb +2 -0
- data/test/helpers/test_unit.rb +146 -11
- data/test/replica_set/authentication_test.rb +4 -2
- data/test/replica_set/basic_test.rb +5 -13
- data/test/replica_set/client_test.rb +8 -6
- data/test/replica_set/complex_connect_test.rb +3 -0
- data/test/replica_set/count_test.rb +2 -0
- data/test/replica_set/cursor_test.rb +5 -0
- data/test/replica_set/insert_test.rb +1 -1
- data/test/replica_set/max_values_test.rb +1 -1
- data/test/replica_set/pinning_test.rb +1 -1
- data/test/replica_set/query_test.rb +1 -1
- data/test/replica_set/read_preference_test.rb +7 -1
- data/test/replica_set/refresh_test.rb +11 -8
- data/test/replica_set/replication_ack_test.rb +2 -1
- data/test/sharded_cluster/basic_test.rb +17 -11
- data/test/shared/authentication/basic_auth_shared.rb +59 -98
- data/test/shared/authentication/bulk_api_auth_shared.rb +11 -21
- data/test/shared/authentication/gssapi_shared.rb +28 -21
- data/test/test_helper.rb +5 -0
- data/test/tools/mongo_config.rb +96 -11
- metadata +4 -5
- metadata.gz.sig +0 -0
- data/lib/mongo/functional/sasl_java.rb +0 -48
@@ -29,7 +29,7 @@ class CollectionWriterTest < Test::Unit::TestCase
|
|
29
29
|
COLLECTION_NAME = 'test'
|
30
30
|
|
31
31
|
def default_setup
|
32
|
-
@client = MongoClient.
|
32
|
+
@client = MongoClient.from_uri(TEST_URI)
|
33
33
|
@db = @client[DATABASE_NAME]
|
34
34
|
@collection = @db[COLLECTION_NAME]
|
35
35
|
@collection.drop
|
@@ -19,19 +19,13 @@ class CursorFailTest < Test::Unit::TestCase
|
|
19
19
|
|
20
20
|
include Mongo
|
21
21
|
|
22
|
-
@@connection = standard_connection
|
23
|
-
@@db = @@connection.db(TEST_DB)
|
24
|
-
@@coll = @@db.collection('test')
|
25
|
-
@@version = @@connection.server_version
|
26
|
-
|
27
22
|
def setup
|
28
|
-
|
29
|
-
|
30
|
-
@@coll_full_name = "#{TEST_DB}.test"
|
23
|
+
@connection = standard_connection
|
24
|
+
@db = @connection[TEST_DB]
|
31
25
|
end
|
32
26
|
|
33
27
|
def test_refill_via_get_more_alt_coll
|
34
|
-
coll =
|
28
|
+
coll = @db.collection('test-alt-coll')
|
35
29
|
coll.remove
|
36
30
|
coll.insert('a' => 1) # collection not created until it's used
|
37
31
|
assert_equal 1, coll.count
|
@@ -19,39 +19,38 @@ class CursorMessageTest < Test::Unit::TestCase
|
|
19
19
|
|
20
20
|
include Mongo
|
21
21
|
|
22
|
-
@@connection = standard_connection
|
23
|
-
@@db = @@connection.db(TEST_DB)
|
24
|
-
@@coll = @@db.collection('test')
|
25
|
-
@@version = @@connection.server_version
|
26
|
-
|
27
22
|
def setup
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
@connection = standard_connection
|
24
|
+
@db = @connection.db(TEST_DB)
|
25
|
+
@coll = @db.collection('test')
|
26
|
+
@version = @connection.server_version
|
27
|
+
@coll.remove
|
28
|
+
@coll.insert('a' => 1) # collection not created until it's used
|
29
|
+
@coll_full_name = "#{TEST_DB}.test"
|
31
30
|
end
|
32
31
|
|
33
32
|
def test_valid_batch_sizes
|
34
33
|
assert_raise ArgumentError do
|
35
|
-
|
34
|
+
@coll.find({}, :batch_size => 1, :limit => 5)
|
36
35
|
end
|
37
36
|
|
38
37
|
assert_raise ArgumentError do
|
39
|
-
|
38
|
+
@coll.find({}, :batch_size => -1, :limit => 5)
|
40
39
|
end
|
41
40
|
|
42
|
-
assert
|
41
|
+
assert @coll.find({}, :batch_size => 0, :limit => 5)
|
43
42
|
end
|
44
43
|
|
45
44
|
def test_batch_size
|
46
|
-
|
45
|
+
@coll.remove
|
47
46
|
200.times do |n|
|
48
|
-
|
47
|
+
@coll.insert({:a => n})
|
49
48
|
end
|
50
49
|
|
51
|
-
list =
|
50
|
+
list = @coll.find({}, :batch_size => 2, :limit => 6).to_a
|
52
51
|
assert_equal 6, list.length
|
53
52
|
|
54
|
-
list =
|
53
|
+
list = @coll.find({}, :batch_size => 100, :limit => 101).to_a
|
55
54
|
assert_equal 101, list.length
|
56
55
|
end
|
57
56
|
end
|
@@ -19,15 +19,14 @@ class CursorTest < Test::Unit::TestCase
|
|
19
19
|
include Mongo
|
20
20
|
include Mongo::Constants
|
21
21
|
|
22
|
-
@@connection = standard_connection
|
23
|
-
@@db = @@connection.db(TEST_DB)
|
24
|
-
@@coll = @@db.collection('test')
|
25
|
-
@@version = @@connection.server_version
|
26
|
-
|
27
22
|
def setup
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
@connection = standard_connection
|
24
|
+
@db = @connection.db(TEST_DB)
|
25
|
+
@coll = @db.collection('test')
|
26
|
+
@version = @connection.server_version
|
27
|
+
@coll.remove
|
28
|
+
@coll.insert('a' => 1) # collection not created until it's used
|
29
|
+
@coll_full_name = "#{TEST_DB}.test"
|
31
30
|
end
|
32
31
|
|
33
32
|
def test_alive
|
@@ -36,18 +35,18 @@ class CursorTest < Test::Unit::TestCase
|
|
36
35
|
batch << {:a => n}
|
37
36
|
end
|
38
37
|
|
39
|
-
|
40
|
-
cursor =
|
38
|
+
@coll.insert(batch)
|
39
|
+
cursor = @coll.find
|
41
40
|
assert !cursor.alive?
|
42
41
|
cursor.next
|
43
42
|
assert cursor.alive?
|
44
43
|
cursor.close
|
45
44
|
assert !cursor.alive?
|
46
|
-
|
45
|
+
@coll.remove
|
47
46
|
end
|
48
47
|
|
49
48
|
def test_add_and_remove_options
|
50
|
-
c =
|
49
|
+
c = @coll.find
|
51
50
|
assert_equal 0, c.options & OP_QUERY_EXHAUST
|
52
51
|
c.add_option(OP_QUERY_EXHAUST)
|
53
52
|
assert_equal OP_QUERY_EXHAUST, c.options & OP_QUERY_EXHAUST
|
@@ -65,19 +64,19 @@ class CursorTest < Test::Unit::TestCase
|
|
65
64
|
end
|
66
65
|
|
67
66
|
def test_exhaust
|
68
|
-
if
|
69
|
-
|
67
|
+
if @version >= "2.0"
|
68
|
+
@coll.remove
|
70
69
|
data = "1" * 10_000
|
71
70
|
5000.times do |n|
|
72
|
-
|
71
|
+
@coll.insert({:n => n, :data => data})
|
73
72
|
end
|
74
73
|
|
75
|
-
c = Cursor.new(
|
74
|
+
c = Cursor.new(@coll)
|
76
75
|
c.add_option(OP_QUERY_EXHAUST)
|
77
|
-
assert_equal
|
76
|
+
assert_equal @coll.count, c.to_a.size
|
78
77
|
assert c.closed?
|
79
78
|
|
80
|
-
c = Cursor.new(
|
79
|
+
c = Cursor.new(@coll)
|
81
80
|
c.add_option(OP_QUERY_EXHAUST)
|
82
81
|
4999.times do
|
83
82
|
c.next
|
@@ -87,16 +86,16 @@ class CursorTest < Test::Unit::TestCase
|
|
87
86
|
assert !c.has_next?
|
88
87
|
assert c.closed?
|
89
88
|
|
90
|
-
|
89
|
+
@coll.remove
|
91
90
|
end
|
92
91
|
end
|
93
92
|
|
94
93
|
def test_compile_regex_get_more
|
95
94
|
return unless defined?(BSON::BSON_RUBY) && BSON::BSON_CODER == BSON::BSON_RUBY
|
96
|
-
|
95
|
+
@coll.remove
|
97
96
|
n_docs = 3
|
98
|
-
n_docs.times { |n|
|
99
|
-
cursor =
|
97
|
+
n_docs.times { |n| @coll.insert({ 'n' => /.*/ }) }
|
98
|
+
cursor = @coll.find({}, :batch_size => (n_docs-1), :compile_regex => false)
|
100
99
|
cursor.expects(:send_get_more)
|
101
100
|
cursor.to_a.each do |doc|
|
102
101
|
assert_kind_of BSON::Regex, doc['n']
|
@@ -104,7 +103,7 @@ class CursorTest < Test::Unit::TestCase
|
|
104
103
|
end
|
105
104
|
|
106
105
|
def test_max_time_ms_error
|
107
|
-
cursor =
|
106
|
+
cursor = @coll.find
|
108
107
|
cursor.stubs(:send_initial_query).returns(true)
|
109
108
|
|
110
109
|
cursor.instance_variable_set(:@cache, [{
|
@@ -118,16 +117,16 @@ class CursorTest < Test::Unit::TestCase
|
|
118
117
|
end
|
119
118
|
|
120
119
|
def test_max_time_ms
|
121
|
-
with_forced_timeout(
|
120
|
+
with_forced_timeout(@connection) do
|
122
121
|
assert_raise ExecutionTimeout do
|
123
|
-
cursor =
|
122
|
+
cursor = @coll.find.max_time_ms(100)
|
124
123
|
cursor.to_a
|
125
124
|
end
|
126
125
|
end
|
127
126
|
end
|
128
127
|
|
129
128
|
def test_exhaust_after_limit_error
|
130
|
-
c = Cursor.new(
|
129
|
+
c = Cursor.new(@coll, :limit => 17)
|
131
130
|
assert_raise MongoArgumentError do
|
132
131
|
c.add_option(OP_QUERY_EXHAUST)
|
133
132
|
end
|
@@ -138,7 +137,7 @@ class CursorTest < Test::Unit::TestCase
|
|
138
137
|
end
|
139
138
|
|
140
139
|
def test_limit_after_exhaust_error
|
141
|
-
c = Cursor.new(
|
140
|
+
c = Cursor.new(@coll)
|
142
141
|
c.add_option(OP_QUERY_EXHAUST)
|
143
142
|
assert_raise MongoArgumentError do
|
144
143
|
c.limit(17)
|
@@ -146,8 +145,8 @@ class CursorTest < Test::Unit::TestCase
|
|
146
145
|
end
|
147
146
|
|
148
147
|
def test_exhaust_with_mongos
|
149
|
-
|
150
|
-
c = Cursor.new(
|
148
|
+
@connection.expects(:mongos?).returns(:true)
|
149
|
+
c = Cursor.new(@coll)
|
151
150
|
|
152
151
|
assert_raise MongoArgumentError do
|
153
152
|
c.add_option(OP_QUERY_EXHAUST)
|
@@ -156,110 +155,116 @@ class CursorTest < Test::Unit::TestCase
|
|
156
155
|
|
157
156
|
def test_inspect
|
158
157
|
selector = {:a => 1}
|
159
|
-
cursor =
|
160
|
-
assert_equal "<Mongo::Cursor:0x#{cursor.object_id.to_s(16)} namespace='#{
|
161
|
-
|
158
|
+
cursor = @coll.find(selector)
|
159
|
+
assert_equal "<Mongo::Cursor:0x#{cursor.object_id.to_s(16)} namespace='#{@db.name}.#{@coll.name}' " +
|
160
|
+
"@selector=#{selector.inspect} @cursor_id=#{cursor.cursor_id}>", cursor.inspect
|
162
161
|
end
|
163
162
|
|
164
163
|
def test_explain
|
165
|
-
cursor =
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
164
|
+
cursor = @coll.find('a' => 1)
|
165
|
+
explanation = cursor.explain
|
166
|
+
if @version < '2.7'
|
167
|
+
assert_not_nil explanation['cursor']
|
168
|
+
assert_kind_of Numeric, explanation['n']
|
169
|
+
assert_kind_of Numeric, explanation['millis']
|
170
|
+
assert_kind_of Numeric, explanation['nscanned']
|
171
|
+
else
|
172
|
+
cursor = @coll.find('a' => 1)
|
173
|
+
assert_not_nil explanation
|
174
|
+
assert explanation.keys.include?('executionStats')
|
175
|
+
end
|
171
176
|
end
|
172
177
|
|
173
178
|
def test_each_with_no_block
|
174
|
-
assert_kind_of(Enumerator,
|
179
|
+
assert_kind_of(Enumerator, @coll.find().each) if defined? Enumerator
|
175
180
|
end
|
176
181
|
|
177
182
|
def test_count
|
178
|
-
|
183
|
+
@coll.remove
|
179
184
|
|
180
|
-
assert_equal 0,
|
185
|
+
assert_equal 0, @coll.find().count()
|
181
186
|
|
182
187
|
10.times do |i|
|
183
|
-
|
188
|
+
@coll.save("x" => i)
|
184
189
|
end
|
185
190
|
|
186
|
-
assert_equal 10,
|
187
|
-
assert_kind_of Integer,
|
188
|
-
assert_equal 10,
|
189
|
-
assert_equal 10,
|
191
|
+
assert_equal 10, @coll.find().count()
|
192
|
+
assert_kind_of Integer, @coll.find().count()
|
193
|
+
assert_equal 10, @coll.find({}, :limit => 5).count()
|
194
|
+
assert_equal 10, @coll.find({}, :skip => 5).count()
|
190
195
|
|
191
|
-
assert_equal 5,
|
192
|
-
assert_equal 5,
|
193
|
-
assert_equal 2,
|
196
|
+
assert_equal 5, @coll.find({}, :limit => 5).count(true)
|
197
|
+
assert_equal 5, @coll.find({}, :skip => 5).count(true)
|
198
|
+
assert_equal 2, @coll.find({}, :skip => 5, :limit => 2).count(true)
|
194
199
|
|
195
|
-
assert_equal 1,
|
196
|
-
assert_equal 5,
|
200
|
+
assert_equal 1, @coll.find({"x" => 1}).count()
|
201
|
+
assert_equal 5, @coll.find({"x" => {"$lt" => 5}}).count()
|
197
202
|
|
198
|
-
a =
|
203
|
+
a = @coll.find()
|
199
204
|
b = a.count()
|
200
205
|
a.each do |doc|
|
201
206
|
break
|
202
207
|
end
|
203
208
|
assert_equal b, a.count()
|
204
209
|
|
205
|
-
assert_equal 0,
|
210
|
+
assert_equal 0, @db['acollectionthatdoesn'].count()
|
206
211
|
end
|
207
212
|
|
208
213
|
def test_sort
|
209
|
-
|
210
|
-
5.times{|x|
|
214
|
+
@coll.remove
|
215
|
+
5.times{|x| @coll.insert({"age" => x}) }
|
211
216
|
|
212
|
-
assert_kind_of Cursor,
|
217
|
+
assert_kind_of Cursor, @coll.find().sort(:age, 1)
|
213
218
|
|
214
|
-
assert_equal 0,
|
215
|
-
assert_equal 4,
|
216
|
-
assert_equal 0,
|
219
|
+
assert_equal 0, @coll.find().sort(:age, 1).next_document["age"]
|
220
|
+
assert_equal 4, @coll.find().sort(:age, -1).next_document["age"]
|
221
|
+
assert_equal 0, @coll.find().sort([["age", :asc]]).next_document["age"]
|
217
222
|
|
218
|
-
assert_kind_of Cursor,
|
223
|
+
assert_kind_of Cursor, @coll.find().sort([[:age, -1], [:b, 1]])
|
219
224
|
|
220
|
-
assert_equal 4,
|
221
|
-
assert_equal 0,
|
225
|
+
assert_equal 4, @coll.find().sort(:age, 1).sort(:age, -1).next_document["age"]
|
226
|
+
assert_equal 0, @coll.find().sort(:age, -1).sort(:age, 1).next_document["age"]
|
222
227
|
|
223
|
-
assert_equal 4,
|
224
|
-
assert_equal 0,
|
228
|
+
assert_equal 4, @coll.find().sort([:age, :asc]).sort(:age, -1).next_document["age"]
|
229
|
+
assert_equal 0, @coll.find().sort([:age, :desc]).sort(:age, 1).next_document["age"]
|
225
230
|
|
226
|
-
cursor =
|
231
|
+
cursor = @coll.find()
|
227
232
|
cursor.next_document
|
228
233
|
assert_raise InvalidOperation do
|
229
234
|
cursor.sort(["age"])
|
230
235
|
end
|
231
236
|
|
232
237
|
assert_raise InvalidSortValueError do
|
233
|
-
|
238
|
+
@coll.find().sort(:age, 25).next_document
|
234
239
|
end
|
235
240
|
|
236
241
|
assert_raise InvalidSortValueError do
|
237
|
-
|
242
|
+
@coll.find().sort(25).next_document
|
238
243
|
end
|
239
244
|
end
|
240
245
|
|
241
246
|
def test_sort_date
|
242
|
-
|
243
|
-
5.times{|x|
|
247
|
+
@coll.remove
|
248
|
+
5.times{|x| @coll.insert({"created_at" => Time.utc(2000 + x)}) }
|
244
249
|
|
245
|
-
assert_equal 2000,
|
246
|
-
assert_equal 2004,
|
250
|
+
assert_equal 2000, @coll.find().sort(:created_at, :asc).next_document["created_at"].year
|
251
|
+
assert_equal 2004, @coll.find().sort(:created_at, :desc).next_document["created_at"].year
|
247
252
|
|
248
|
-
assert_equal 2000,
|
249
|
-
assert_equal 2004,
|
253
|
+
assert_equal 2000, @coll.find().sort([:created_at, :asc]).next_document["created_at"].year
|
254
|
+
assert_equal 2004, @coll.find().sort([:created_at, :desc]).next_document["created_at"].year
|
250
255
|
|
251
|
-
assert_equal 2000,
|
252
|
-
assert_equal 2004,
|
256
|
+
assert_equal 2000, @coll.find().sort([[:created_at, :asc]]).next_document["created_at"].year
|
257
|
+
assert_equal 2004, @coll.find().sort([[:created_at, :desc]]).next_document["created_at"].year
|
253
258
|
end
|
254
259
|
|
255
260
|
def test_sort_min_max_keys
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
+
@coll.remove
|
262
|
+
@coll.insert({"n" => 1000000})
|
263
|
+
@coll.insert({"n" => -1000000})
|
264
|
+
@coll.insert({"n" => MaxKey.new})
|
265
|
+
@coll.insert({"n" => MinKey.new})
|
261
266
|
|
262
|
-
results =
|
267
|
+
results = @coll.find.sort([:n, :asc]).to_a
|
263
268
|
|
264
269
|
assert_equal MinKey.new, results[0]['n']
|
265
270
|
assert_equal(-1000000, results[1]['n'])
|
@@ -268,73 +273,73 @@ class CursorTest < Test::Unit::TestCase
|
|
268
273
|
end
|
269
274
|
|
270
275
|
def test_id_range_queries
|
271
|
-
|
276
|
+
@coll.remove
|
272
277
|
|
273
278
|
t1 = Time.now
|
274
279
|
t1_id = ObjectId.from_time(t1)
|
275
|
-
|
276
|
-
|
277
|
-
|
280
|
+
@coll.save({:t => 't1'})
|
281
|
+
@coll.save({:t => 't1'})
|
282
|
+
@coll.save({:t => 't1'})
|
278
283
|
sleep(1)
|
279
284
|
t2 = Time.now
|
280
285
|
t2_id = ObjectId.from_time(t2)
|
281
|
-
|
282
|
-
|
283
|
-
|
286
|
+
@coll.save({:t => 't2'})
|
287
|
+
@coll.save({:t => 't2'})
|
288
|
+
@coll.save({:t => 't2'})
|
284
289
|
|
285
|
-
assert_equal 3,
|
286
|
-
|
290
|
+
assert_equal 3, @coll.find({'_id' => {'$gt' => t1_id, '$lt' => t2_id}}).count
|
291
|
+
@coll.find({'_id' => {'$gt' => t2_id}}).each do |doc|
|
287
292
|
assert_equal 't2', doc['t']
|
288
293
|
end
|
289
294
|
end
|
290
295
|
|
291
296
|
def test_limit
|
292
|
-
|
297
|
+
@coll.remove
|
293
298
|
|
294
299
|
10.times do |i|
|
295
|
-
|
300
|
+
@coll.save("x" => i)
|
296
301
|
end
|
297
|
-
assert_equal 10,
|
302
|
+
assert_equal 10, @coll.find().count()
|
298
303
|
|
299
|
-
results =
|
304
|
+
results = @coll.find().limit(5).to_a
|
300
305
|
assert_equal 5, results.length
|
301
306
|
end
|
302
307
|
|
303
308
|
def test_timeout_options
|
304
|
-
cursor = Cursor.new(
|
309
|
+
cursor = Cursor.new(@coll)
|
305
310
|
assert_equal true, cursor.timeout
|
306
311
|
|
307
|
-
cursor =
|
312
|
+
cursor = @coll.find
|
308
313
|
assert_equal true, cursor.timeout
|
309
314
|
|
310
|
-
cursor =
|
315
|
+
cursor = @coll.find({}, :timeout => nil)
|
311
316
|
assert_equal true, cursor.timeout
|
312
317
|
|
313
|
-
cursor = Cursor.new(
|
318
|
+
cursor = Cursor.new(@coll, :timeout => false)
|
314
319
|
assert_equal false, cursor.timeout
|
315
320
|
|
316
|
-
|
321
|
+
@coll.find({}, :timeout => false) do |c|
|
317
322
|
assert_equal false, c.timeout
|
318
323
|
end
|
319
324
|
end
|
320
325
|
|
321
326
|
def test_timeout
|
322
|
-
opts = Cursor.new(
|
327
|
+
opts = Cursor.new(@coll).options
|
323
328
|
assert_equal 0, opts & Mongo::Constants::OP_QUERY_NO_CURSOR_TIMEOUT
|
324
329
|
|
325
|
-
opts = Cursor.new(
|
330
|
+
opts = Cursor.new(@coll, :timeout => false).options
|
326
331
|
assert_equal Mongo::Constants::OP_QUERY_NO_CURSOR_TIMEOUT,
|
327
|
-
|
332
|
+
opts & Mongo::Constants::OP_QUERY_NO_CURSOR_TIMEOUT
|
328
333
|
end
|
329
334
|
|
330
335
|
def test_limit_exceptions
|
331
|
-
cursor =
|
336
|
+
cursor = @coll.find()
|
332
337
|
cursor.next_document
|
333
338
|
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
334
339
|
cursor.limit(1)
|
335
340
|
end
|
336
341
|
|
337
|
-
cursor =
|
342
|
+
cursor = @coll.find()
|
338
343
|
cursor.close
|
339
344
|
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
340
345
|
cursor.limit(1)
|
@@ -342,15 +347,15 @@ class CursorTest < Test::Unit::TestCase
|
|
342
347
|
end
|
343
348
|
|
344
349
|
def test_skip
|
345
|
-
|
350
|
+
@coll.remove
|
346
351
|
|
347
352
|
10.times do |i|
|
348
|
-
|
353
|
+
@coll.save("x" => i)
|
349
354
|
end
|
350
|
-
assert_equal 10,
|
355
|
+
assert_equal 10, @coll.find().count()
|
351
356
|
|
352
|
-
all_results =
|
353
|
-
skip_results =
|
357
|
+
all_results = @coll.find().to_a
|
358
|
+
skip_results = @coll.find().skip(2).to_a
|
354
359
|
assert_equal 10, all_results.length
|
355
360
|
assert_equal 8, skip_results.length
|
356
361
|
|
@@ -358,13 +363,13 @@ class CursorTest < Test::Unit::TestCase
|
|
358
363
|
end
|
359
364
|
|
360
365
|
def test_skip_exceptions
|
361
|
-
cursor =
|
366
|
+
cursor = @coll.find()
|
362
367
|
cursor.next_document
|
363
368
|
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
364
369
|
cursor.skip(1)
|
365
370
|
end
|
366
371
|
|
367
|
-
cursor =
|
372
|
+
cursor = @coll.find()
|
368
373
|
cursor.close
|
369
374
|
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
370
375
|
cursor.skip(1)
|
@@ -372,20 +377,20 @@ class CursorTest < Test::Unit::TestCase
|
|
372
377
|
end
|
373
378
|
|
374
379
|
def test_limit_skip_chaining
|
375
|
-
|
380
|
+
@coll.remove
|
376
381
|
10.times do |i|
|
377
|
-
|
382
|
+
@coll.save("x" => i)
|
378
383
|
end
|
379
384
|
|
380
|
-
all_results =
|
381
|
-
limited_skip_results =
|
385
|
+
all_results = @coll.find().to_a
|
386
|
+
limited_skip_results = @coll.find().limit(5).skip(3).to_a
|
382
387
|
|
383
388
|
assert_equal all_results.slice(3...8), limited_skip_results
|
384
389
|
end
|
385
390
|
|
386
391
|
def test_close_no_query_sent
|
387
392
|
begin
|
388
|
-
cursor =
|
393
|
+
cursor = @coll.find('a' => 1)
|
389
394
|
cursor.close
|
390
395
|
assert cursor.closed?
|
391
396
|
rescue => ex
|
@@ -394,33 +399,33 @@ class CursorTest < Test::Unit::TestCase
|
|
394
399
|
end
|
395
400
|
|
396
401
|
def test_refill_via_get_more
|
397
|
-
assert_equal 1,
|
402
|
+
assert_equal 1, @coll.count
|
398
403
|
1000.times { |i|
|
399
|
-
assert_equal 1 + i,
|
400
|
-
|
404
|
+
assert_equal 1 + i, @coll.count
|
405
|
+
@coll.insert('a' => i)
|
401
406
|
}
|
402
407
|
|
403
|
-
assert_equal 1001,
|
408
|
+
assert_equal 1001, @coll.count
|
404
409
|
count = 0
|
405
|
-
|
410
|
+
@coll.find.each { |obj|
|
406
411
|
count += obj['a']
|
407
412
|
}
|
408
|
-
assert_equal 1001,
|
413
|
+
assert_equal 1001, @coll.count
|
409
414
|
|
410
415
|
# do the same thing again for debugging
|
411
|
-
assert_equal 1001,
|
416
|
+
assert_equal 1001, @coll.count
|
412
417
|
count2 = 0
|
413
|
-
|
418
|
+
@coll.find.each { |obj|
|
414
419
|
count2 += obj['a']
|
415
420
|
}
|
416
|
-
assert_equal 1001,
|
421
|
+
assert_equal 1001, @coll.count
|
417
422
|
|
418
423
|
assert_equal count, count2
|
419
424
|
assert_equal 499501, count
|
420
425
|
end
|
421
426
|
|
422
427
|
def test_refill_via_get_more_alt_coll
|
423
|
-
coll =
|
428
|
+
coll = @db.collection('test-alt-coll')
|
424
429
|
coll.remove
|
425
430
|
coll.insert('a' => 1) # collection not created until it's used
|
426
431
|
assert_equal 1, coll.count
|
@@ -451,7 +456,7 @@ class CursorTest < Test::Unit::TestCase
|
|
451
456
|
|
452
457
|
def test_close_after_query_sent
|
453
458
|
begin
|
454
|
-
cursor =
|
459
|
+
cursor = @coll.find('a' => 1)
|
455
460
|
cursor.next_document
|
456
461
|
cursor.close
|
457
462
|
assert cursor.closed?
|
@@ -461,82 +466,135 @@ class CursorTest < Test::Unit::TestCase
|
|
461
466
|
end
|
462
467
|
|
463
468
|
def test_kill_cursors
|
464
|
-
|
469
|
+
@coll.drop
|
465
470
|
|
466
|
-
client_cursors =
|
471
|
+
client_cursors = @db.command("cursorInfo" => 1)["clientCursors_size"]
|
467
472
|
|
468
473
|
10000.times do |i|
|
469
|
-
|
474
|
+
@coll.insert("i" => i)
|
470
475
|
end
|
471
476
|
|
472
477
|
assert_equal(client_cursors,
|
473
|
-
|
478
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
474
479
|
|
475
480
|
10.times do |i|
|
476
|
-
|
481
|
+
@coll.find_one()
|
477
482
|
end
|
478
483
|
|
479
484
|
assert_equal(client_cursors,
|
480
|
-
|
485
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
481
486
|
|
482
487
|
10.times do |i|
|
483
|
-
a =
|
488
|
+
a = @coll.find()
|
484
489
|
a.next_document
|
485
490
|
a.close()
|
486
491
|
end
|
487
492
|
|
488
493
|
assert_equal(client_cursors,
|
489
|
-
|
494
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
490
495
|
|
491
|
-
a =
|
496
|
+
a = @coll.find()
|
492
497
|
a.next_document
|
493
498
|
|
494
499
|
assert_not_equal(client_cursors,
|
495
|
-
|
500
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
496
501
|
|
497
502
|
a.close()
|
498
503
|
|
499
504
|
assert_equal(client_cursors,
|
500
|
-
|
505
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
501
506
|
|
502
|
-
a =
|
507
|
+
a = @coll.find({}, :limit => 10).next_document
|
503
508
|
|
504
509
|
assert_equal(client_cursors,
|
505
|
-
|
510
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
506
511
|
|
507
|
-
|
512
|
+
@coll.find() do |cursor|
|
508
513
|
cursor.next_document
|
509
514
|
end
|
510
515
|
|
511
516
|
assert_equal(client_cursors,
|
512
|
-
|
517
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
513
518
|
|
514
|
-
|
519
|
+
@coll.find() { |cursor|
|
515
520
|
cursor.next_document
|
516
521
|
}
|
517
522
|
|
518
523
|
assert_equal(client_cursors,
|
519
|
-
|
524
|
+
@db.command("cursorInfo" => 1)["clientCursors_size"])
|
520
525
|
end
|
521
526
|
|
522
527
|
def test_count_with_fields
|
523
|
-
|
524
|
-
|
528
|
+
@coll.remove
|
529
|
+
@coll.save("x" => 1)
|
525
530
|
|
526
|
-
if
|
527
|
-
assert_equal(0,
|
531
|
+
if @version < "1.1.3"
|
532
|
+
assert_equal(0, @coll.find({}, :fields => ["a"]).count())
|
533
|
+
else
|
534
|
+
assert_equal(1, @coll.find({}, :fields => ["a"]).count())
|
535
|
+
end
|
536
|
+
end
|
537
|
+
|
538
|
+
def test_count_with_hint
|
539
|
+
@coll.drop
|
540
|
+
@coll.save(:i => 1)
|
541
|
+
@coll.save(:i => 2)
|
542
|
+
assert_equal 2, @coll.find.count
|
543
|
+
|
544
|
+
@coll.ensure_index(BSON::OrderedHash[:i, Mongo::ASCENDING])
|
545
|
+
|
546
|
+
# Check that a named_hint can be specified
|
547
|
+
assert_equal 1, @coll.find({ :i => 1 }, :named_hint => '_id_').count
|
548
|
+
assert_equal 2, @coll.find({ }, :named_hint => '_id_').count
|
549
|
+
|
550
|
+
# Verify that the hint is being sent to the server by providing a bad hint
|
551
|
+
if @version > '2.6'
|
552
|
+
assert_raise Mongo::OperationFailure do
|
553
|
+
@coll.find({ :i => 1 }, :hint => 'bad_hint').count
|
554
|
+
end
|
528
555
|
else
|
529
|
-
assert_equal
|
556
|
+
assert_equal 1, @coll.find({ :i => 1 }, :hint => 'bad_hint').count
|
530
557
|
end
|
558
|
+
|
559
|
+
# Verify that the named_hint is being sent to the server by providing a bad hint
|
560
|
+
if @version > '2.6'
|
561
|
+
assert_raise Mongo::OperationFailure do
|
562
|
+
@coll.find({ :i => 1 }, :named_hint => 'bad_hint').count
|
563
|
+
end
|
564
|
+
else
|
565
|
+
assert_equal 1, @coll.find({ :i => 1 }, :named_hint => 'bad_hint').count
|
566
|
+
end
|
567
|
+
|
568
|
+
@coll.ensure_index(BSON::OrderedHash[:x, Mongo::ASCENDING], :sparse => true)
|
569
|
+
|
570
|
+
# The sparse index won't have any entries.
|
571
|
+
# Check that count returns 0 when using the hint.
|
572
|
+
expected = @version > '2.6' ? 0 : 1
|
573
|
+
assert_equal expected, @coll.find({ :i => 1 }, :hint => { 'x' => 1 }).count
|
574
|
+
assert_equal expected, @coll.find({ :i => 1 }, :hint => 'x').count
|
575
|
+
assert_equal expected, @coll.find({ :i => 1 }, :named_hint => 'x_1').count
|
576
|
+
|
577
|
+
# Verify that the hint / named hint set on the collection is used.
|
578
|
+
@coll.hint = { 'x' => 1 }
|
579
|
+
assert_equal expected, @coll.find(:i => 1).count
|
580
|
+
|
581
|
+
@coll.hint = 'x'
|
582
|
+
assert_equal expected, @coll.find(:i => 1).count
|
583
|
+
|
584
|
+
@coll.named_hint = 'x_1'
|
585
|
+
assert_equal expected, @coll.find(:i => 1).count
|
586
|
+
|
587
|
+
assert_equal 2, @coll.find({ }, :hint => 'x').count
|
588
|
+
assert_equal 2, @coll.find({ }, :named_hint => 'x_1').count
|
531
589
|
end
|
532
590
|
|
533
591
|
def test_has_next
|
534
|
-
|
592
|
+
@coll.remove
|
535
593
|
200.times do |n|
|
536
|
-
|
594
|
+
@coll.save("x" => n)
|
537
595
|
end
|
538
596
|
|
539
|
-
cursor =
|
597
|
+
cursor = @coll.find
|
540
598
|
n = 0
|
541
599
|
while cursor.has_next?
|
542
600
|
assert cursor.next
|
@@ -548,12 +606,12 @@ class CursorTest < Test::Unit::TestCase
|
|
548
606
|
end
|
549
607
|
|
550
608
|
def test_cursor_invalid
|
551
|
-
|
609
|
+
@coll.remove
|
552
610
|
10000.times do |n|
|
553
|
-
|
611
|
+
@coll.insert({:a => n})
|
554
612
|
end
|
555
613
|
|
556
|
-
cursor =
|
614
|
+
cursor = @coll.find({})
|
557
615
|
|
558
616
|
assert_raise_error Mongo::OperationFailure, "CURSOR_NOT_FOUND" do
|
559
617
|
9999.times do
|
@@ -564,26 +622,26 @@ class CursorTest < Test::Unit::TestCase
|
|
564
622
|
end
|
565
623
|
|
566
624
|
def test_enumberables
|
567
|
-
|
625
|
+
@coll.remove
|
568
626
|
100.times do |n|
|
569
|
-
|
627
|
+
@coll.insert({:a => n})
|
570
628
|
end
|
571
629
|
|
572
|
-
assert_equal 100,
|
573
|
-
assert_equal 100,
|
630
|
+
assert_equal 100, @coll.find.to_a.length
|
631
|
+
assert_equal 100, @coll.find.to_set.length
|
574
632
|
|
575
|
-
cursor =
|
633
|
+
cursor = @coll.find
|
576
634
|
50.times { |n| cursor.next_document }
|
577
635
|
assert_equal 50, cursor.to_a.length
|
578
636
|
end
|
579
637
|
|
580
638
|
def test_rewind
|
581
|
-
|
639
|
+
@coll.remove
|
582
640
|
100.times do |n|
|
583
|
-
|
641
|
+
@coll.insert({:a => n})
|
584
642
|
end
|
585
643
|
|
586
|
-
cursor =
|
644
|
+
cursor = @coll.find
|
587
645
|
cursor.to_a
|
588
646
|
assert_equal [], cursor.map {|doc| doc }
|
589
647
|
|
@@ -598,14 +656,14 @@ class CursorTest < Test::Unit::TestCase
|
|
598
656
|
|
599
657
|
def test_transformer
|
600
658
|
transformer = Proc.new { |doc| doc }
|
601
|
-
cursor = Cursor.new(
|
659
|
+
cursor = Cursor.new(@coll, :transformer => transformer)
|
602
660
|
assert_equal(transformer, cursor.transformer)
|
603
661
|
end
|
604
662
|
|
605
663
|
def test_instance_transformation_with_next
|
606
664
|
klass = Struct.new(:id, :a)
|
607
665
|
transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
|
608
|
-
cursor = Cursor.new(
|
666
|
+
cursor = Cursor.new(@coll, :transformer => transformer)
|
609
667
|
instance = cursor.next
|
610
668
|
|
611
669
|
assert_instance_of(klass, instance)
|
@@ -616,7 +674,7 @@ class CursorTest < Test::Unit::TestCase
|
|
616
674
|
def test_instance_transformation_with_each
|
617
675
|
klass = Struct.new(:id, :a)
|
618
676
|
transformer = Proc.new { |doc| klass.new(doc['_id'], doc['a']) }
|
619
|
-
cursor = Cursor.new(
|
677
|
+
cursor = Cursor.new(@coll, :transformer => transformer)
|
620
678
|
|
621
679
|
cursor.each do |instance|
|
622
680
|
assert_instance_of(klass, instance)
|