mongo-find_replace 0.18.3
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/LICENSE.txt +202 -0
- data/README.rdoc +358 -0
- data/Rakefile +133 -0
- data/bin/bson_benchmark.rb +59 -0
- data/bin/fail_if_no_c.rb +11 -0
- data/examples/admin.rb +42 -0
- data/examples/capped.rb +22 -0
- data/examples/cursor.rb +48 -0
- data/examples/gridfs.rb +88 -0
- data/examples/index_test.rb +126 -0
- data/examples/info.rb +31 -0
- data/examples/queries.rb +70 -0
- data/examples/simple.rb +24 -0
- data/examples/strict.rb +35 -0
- data/examples/types.rb +36 -0
- data/lib/mongo.rb +61 -0
- data/lib/mongo/admin.rb +95 -0
- data/lib/mongo/collection.rb +664 -0
- data/lib/mongo/connection.rb +555 -0
- data/lib/mongo/cursor.rb +393 -0
- data/lib/mongo/db.rb +527 -0
- data/lib/mongo/exceptions.rb +60 -0
- data/lib/mongo/gridfs.rb +22 -0
- data/lib/mongo/gridfs/chunk.rb +90 -0
- data/lib/mongo/gridfs/grid_store.rb +555 -0
- data/lib/mongo/types/binary.rb +48 -0
- data/lib/mongo/types/code.rb +36 -0
- data/lib/mongo/types/dbref.rb +38 -0
- data/lib/mongo/types/min_max_keys.rb +58 -0
- data/lib/mongo/types/objectid.rb +219 -0
- data/lib/mongo/types/regexp_of_holding.rb +45 -0
- data/lib/mongo/util/bson_c.rb +18 -0
- data/lib/mongo/util/bson_ruby.rb +595 -0
- data/lib/mongo/util/byte_buffer.rb +222 -0
- data/lib/mongo/util/conversions.rb +97 -0
- data/lib/mongo/util/ordered_hash.rb +135 -0
- data/lib/mongo/util/server_version.rb +69 -0
- data/lib/mongo/util/support.rb +26 -0
- data/lib/mongo/util/xml_to_ruby.rb +112 -0
- data/mongo-ruby-driver.gemspec +28 -0
- data/test/replica/count_test.rb +34 -0
- data/test/replica/insert_test.rb +50 -0
- data/test/replica/pooled_insert_test.rb +54 -0
- data/test/replica/query_test.rb +39 -0
- data/test/test_admin.rb +67 -0
- data/test/test_bson.rb +397 -0
- data/test/test_byte_buffer.rb +81 -0
- data/test/test_chunk.rb +82 -0
- data/test/test_collection.rb +534 -0
- data/test/test_connection.rb +160 -0
- data/test/test_conversions.rb +120 -0
- data/test/test_cursor.rb +386 -0
- data/test/test_db.rb +254 -0
- data/test/test_db_api.rb +783 -0
- data/test/test_db_connection.rb +16 -0
- data/test/test_grid_store.rb +306 -0
- data/test/test_helper.rb +42 -0
- data/test/test_objectid.rb +156 -0
- data/test/test_ordered_hash.rb +168 -0
- data/test/test_round_trip.rb +114 -0
- data/test/test_slave_connection.rb +36 -0
- data/test/test_threading.rb +87 -0
- data/test/threading/test_threading_large_pool.rb +90 -0
- data/test/unit/collection_test.rb +52 -0
- data/test/unit/connection_test.rb +59 -0
- data/test/unit/cursor_test.rb +94 -0
- data/test/unit/db_test.rb +97 -0
- metadata +123 -0
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'logger'
|
3
|
+
require 'stringio'
|
4
|
+
require 'thread'
|
5
|
+
|
6
|
+
# NOTE: assumes Mongo is running
|
7
|
+
class TestConnection < Test::Unit::TestCase
|
8
|
+
|
9
|
+
include Mongo
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@host = ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost'
|
13
|
+
@port = ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT
|
14
|
+
@mongo = Connection.new(@host, @port)
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
@mongo.db('ruby-mongo-test').error
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_server_info
|
22
|
+
server_info = @mongo.server_info
|
23
|
+
assert server_info.keys.include?("version")
|
24
|
+
assert_equal 1.0, server_info["ok"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_server_version
|
28
|
+
assert_match /\d\.\d+(\.\d+)?/, @mongo.server_version.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_invalid_database_names
|
32
|
+
assert_raise TypeError do @mongo.db(4) end
|
33
|
+
|
34
|
+
assert_raise InvalidName do @mongo.db('') end
|
35
|
+
assert_raise InvalidName do @mongo.db('te$t') end
|
36
|
+
assert_raise InvalidName do @mongo.db('te.t') end
|
37
|
+
assert_raise InvalidName do @mongo.db('te\\t') end
|
38
|
+
assert_raise InvalidName do @mongo.db('te/t') end
|
39
|
+
assert_raise InvalidName do @mongo.db('te st') end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_database_info
|
43
|
+
@mongo.drop_database('ruby-mongo-info-test')
|
44
|
+
@mongo.db('ruby-mongo-info-test').collection('info-test').insert('a' => 1)
|
45
|
+
|
46
|
+
info = @mongo.database_info
|
47
|
+
assert_not_nil info
|
48
|
+
assert_kind_of Hash, info
|
49
|
+
assert_not_nil info['ruby-mongo-info-test']
|
50
|
+
assert info['ruby-mongo-info-test'] > 0
|
51
|
+
|
52
|
+
@mongo.drop_database('ruby-mongo-info-test')
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_copy_database
|
56
|
+
@mongo.db('old').collection('copy-test').insert('a' => 1)
|
57
|
+
@mongo.copy_database('old', 'new')
|
58
|
+
old_object = @mongo.db('old').collection('copy-test').find.next_document
|
59
|
+
new_object = @mongo.db('new').collection('copy-test').find.next_document
|
60
|
+
assert_equal old_object, new_object
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_database_names
|
64
|
+
@mongo.drop_database('ruby-mongo-info-test')
|
65
|
+
@mongo.db('ruby-mongo-info-test').collection('info-test').insert('a' => 1)
|
66
|
+
|
67
|
+
names = @mongo.database_names
|
68
|
+
assert_not_nil names
|
69
|
+
assert_kind_of Array, names
|
70
|
+
assert names.length >= 1
|
71
|
+
assert names.include?('ruby-mongo-info-test')
|
72
|
+
|
73
|
+
@mongo.drop_database('ruby-mongo-info-test')
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_logging
|
77
|
+
output = StringIO.new
|
78
|
+
logger = Logger.new(output)
|
79
|
+
logger.level = Logger::DEBUG
|
80
|
+
db = Connection.new(@host, @port, :logger => logger).db('ruby-mongo-test')
|
81
|
+
assert output.string.include?("admin.$cmd.find")
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_connection_logger
|
85
|
+
output = StringIO.new
|
86
|
+
logger = Logger.new(output)
|
87
|
+
logger.level = Logger::DEBUG
|
88
|
+
connection = Connection.new(@host, @port, :logger => logger)
|
89
|
+
assert_equal logger, connection.logger
|
90
|
+
|
91
|
+
connection.logger.debug 'testing'
|
92
|
+
assert output.string.include?('testing')
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_drop_database
|
96
|
+
db = @mongo.db('ruby-mongo-will-be-deleted')
|
97
|
+
coll = db.collection('temp')
|
98
|
+
coll.remove
|
99
|
+
coll.insert(:name => 'temp')
|
100
|
+
assert_equal 1, coll.count()
|
101
|
+
assert @mongo.database_names.include?('ruby-mongo-will-be-deleted')
|
102
|
+
|
103
|
+
@mongo.drop_database('ruby-mongo-will-be-deleted')
|
104
|
+
assert !@mongo.database_names.include?('ruby-mongo-will-be-deleted')
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_nodes
|
108
|
+
db = Connection.new({:left => ['foo', 123]}, nil, :connect => false)
|
109
|
+
nodes = db.nodes
|
110
|
+
assert_equal 2, db.nodes.length
|
111
|
+
assert_equal ['foo', 123], nodes[0]
|
112
|
+
assert_equal ['localhost', Connection::DEFAULT_PORT], nodes[1]
|
113
|
+
|
114
|
+
db = Connection.new({:right => 'bar'}, nil, :connect => false)
|
115
|
+
nodes = db.nodes
|
116
|
+
assert_equal 2, nodes.length
|
117
|
+
assert_equal ['localhost', Connection::DEFAULT_PORT], nodes[0]
|
118
|
+
assert_equal ['bar', Connection::DEFAULT_PORT], nodes[1]
|
119
|
+
|
120
|
+
db = Connection.new({:right => ['foo', 123], :left => 'bar'}, nil, :connect => false)
|
121
|
+
nodes = db.nodes
|
122
|
+
assert_equal 2, nodes.length
|
123
|
+
assert_equal ['bar', Connection::DEFAULT_PORT], nodes[0]
|
124
|
+
assert_equal ['foo', 123], nodes[1]
|
125
|
+
end
|
126
|
+
|
127
|
+
context "Connection exceptions" do
|
128
|
+
setup do
|
129
|
+
@conn = Mongo::Connection.new('localhost', 27017, :pool_size => 10, :timeout => 10)
|
130
|
+
@coll = @conn['mongo-ruby-test']['test-connection-exceptions']
|
131
|
+
end
|
132
|
+
|
133
|
+
should "release connection if an exception is raised on send_message" do
|
134
|
+
@conn.stubs(:send_message_on_socket).raises(ConnectionFailure)
|
135
|
+
assert_equal 0, @conn.checked_out.size
|
136
|
+
assert_raise ConnectionFailure do
|
137
|
+
@coll.insert({:test => "insert"})
|
138
|
+
end
|
139
|
+
assert_equal 0, @conn.checked_out.size
|
140
|
+
end
|
141
|
+
|
142
|
+
should "release connection if an exception is raised on send_with_safe_check" do
|
143
|
+
@conn.stubs(:receive).raises(ConnectionFailure)
|
144
|
+
assert_equal 0, @conn.checked_out.size
|
145
|
+
assert_raise ConnectionFailure do
|
146
|
+
@coll.insert({:test => "insert"}, :safe => true)
|
147
|
+
end
|
148
|
+
assert_equal 0, @conn.checked_out.size
|
149
|
+
end
|
150
|
+
|
151
|
+
should "release connection if an exception is raised on receive_message" do
|
152
|
+
@conn.stubs(:receive).raises(ConnectionFailure)
|
153
|
+
assert_equal 0, @conn.checked_out.size
|
154
|
+
assert_raise ConnectionFailure do
|
155
|
+
@coll.find.to_a
|
156
|
+
end
|
157
|
+
assert_equal 0, @conn.checked_out.size
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'mongo/exceptions'
|
3
|
+
require 'mongo/util/conversions'
|
4
|
+
require 'mongo/util/ordered_hash'
|
5
|
+
|
6
|
+
class ConversionsTest < Test::Unit::TestCase
|
7
|
+
include Mongo::Conversions
|
8
|
+
|
9
|
+
def test_array_as_sort_parameters_with_array_of_key_and_value
|
10
|
+
params = array_as_sort_parameters(["field1", "asc"])
|
11
|
+
assert_equal({"field1" => 1}, params)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_array_as_sort_parameters_with_array_of_string_and_values
|
15
|
+
params = array_as_sort_parameters([["field1", :asc], ["field2", :desc]])
|
16
|
+
assert_equal({ "field1" => 1, "field2" => -1 }, params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_string_as_sort_parameters_with_string
|
20
|
+
params = string_as_sort_parameters("field")
|
21
|
+
assert_equal({ "field" => 1 }, params)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_string_as_sort_parameters_with_empty_string
|
25
|
+
params = string_as_sort_parameters("")
|
26
|
+
assert_equal({}, params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_symbol_as_sort_parameters
|
30
|
+
params = string_as_sort_parameters(:field)
|
31
|
+
assert_equal({ "field" => 1 }, params)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_sort_value_when_value_is_one
|
35
|
+
assert_equal 1, sort_value(1)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_sort_value_when_value_is_one_as_a_string
|
39
|
+
assert_equal 1, sort_value("1")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_sort_value_when_value_is_negative_one
|
43
|
+
assert_equal -1, sort_value(-1)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_sort_value_when_value_is_negative_one_as_a_string
|
47
|
+
assert_equal -1, sort_value("-1")
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_sort_value_when_value_is_ascending
|
51
|
+
assert_equal 1, sort_value("ascending")
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_sort_value_when_value_is_asc
|
55
|
+
assert_equal 1, sort_value("asc")
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_sort_value_when_value_is_uppercase_ascending
|
59
|
+
assert_equal 1, sort_value("ASCENDING")
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_sort_value_when_value_is_uppercase_asc
|
63
|
+
assert_equal 1, sort_value("ASC")
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_sort_value_when_value_is_symbol_ascending
|
67
|
+
assert_equal 1, sort_value(:ascending)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_sort_value_when_value_is_symbol_asc
|
71
|
+
assert_equal 1, sort_value(:asc)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_sort_value_when_value_is_symbol_uppercase_ascending
|
75
|
+
assert_equal 1, sort_value(:ASCENDING)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_sort_value_when_value_is_symbol_uppercase_asc
|
79
|
+
assert_equal 1, sort_value(:ASC)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_sort_value_when_value_is_descending
|
83
|
+
assert_equal -1, sort_value("descending")
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_sort_value_when_value_is_desc
|
87
|
+
assert_equal -1, sort_value("desc")
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_sort_value_when_value_is_uppercase_descending
|
91
|
+
assert_equal -1, sort_value("DESCENDING")
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_sort_value_when_value_is_uppercase_desc
|
95
|
+
assert_equal -1, sort_value("DESC")
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_sort_value_when_value_is_symbol_descending
|
99
|
+
assert_equal -1, sort_value(:descending)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_sort_value_when_value_is_symbol_desc
|
103
|
+
assert_equal -1, sort_value(:desc)
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_sort_value_when_value_is_uppercase_symbol_descending
|
107
|
+
assert_equal -1, sort_value(:DESCENDING)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_sort_value_when_value_is_uppercase_symbol_desc
|
111
|
+
assert_equal -1, sort_value(:DESC)
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_sort_value_when_value_is_invalid
|
115
|
+
assert_raise Mongo::InvalidSortValueError do
|
116
|
+
sort_value(2)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
data/test/test_cursor.rb
ADDED
@@ -0,0 +1,386 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
# NOTE: assumes Mongo is running
|
5
|
+
class CursorTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include Mongo
|
8
|
+
|
9
|
+
@@connection = Connection.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
|
10
|
+
ENV['MONGO_RUBY_DRIVER_PORT'] || Connection::DEFAULT_PORT)
|
11
|
+
@@db = @@connection.db('ruby-mongo-test')
|
12
|
+
@@coll = @@db.collection('test')
|
13
|
+
@@version = @@connection.server_version
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@@coll.remove
|
17
|
+
@@coll.insert('a' => 1) # collection not created until it's used
|
18
|
+
@@coll_full_name = 'ruby-mongo-test.test'
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_explain
|
22
|
+
cursor = @@coll.find('a' => 1)
|
23
|
+
explaination = cursor.explain
|
24
|
+
assert_not_nil explaination['cursor']
|
25
|
+
assert_kind_of Numeric, explaination['n']
|
26
|
+
assert_kind_of Numeric, explaination['millis']
|
27
|
+
assert_kind_of Numeric, explaination['nscanned']
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_count
|
31
|
+
@@coll.remove
|
32
|
+
|
33
|
+
assert_equal 0, @@coll.find().count()
|
34
|
+
|
35
|
+
10.times do |i|
|
36
|
+
@@coll.save("x" => i)
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_equal 10, @@coll.find().count()
|
40
|
+
assert_kind_of Integer, @@coll.find().count()
|
41
|
+
assert_equal 10, @@coll.find({}, :limit => 5).count()
|
42
|
+
assert_equal 10, @@coll.find({}, :skip => 5).count()
|
43
|
+
|
44
|
+
assert_equal 1, @@coll.find({"x" => 1}).count()
|
45
|
+
assert_equal 5, @@coll.find({"x" => {"$lt" => 5}}).count()
|
46
|
+
|
47
|
+
a = @@coll.find()
|
48
|
+
b = a.count()
|
49
|
+
a.each do |doc|
|
50
|
+
break
|
51
|
+
end
|
52
|
+
assert_equal b, a.count()
|
53
|
+
|
54
|
+
assert_equal 0, @@db['acollectionthatdoesn'].count()
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_next_object_deprecation
|
58
|
+
@@coll.remove
|
59
|
+
@@coll.insert({"a" => 1})
|
60
|
+
|
61
|
+
assert_equal 1, @@coll.find().next_object["a"]
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_sort
|
65
|
+
@@coll.remove
|
66
|
+
5.times{|x| @@coll.insert({"age" => x}) }
|
67
|
+
|
68
|
+
assert_kind_of Cursor, @@coll.find().sort(:age, 1)
|
69
|
+
|
70
|
+
assert_equal 0, @@coll.find().sort(:age, 1).next_document["age"]
|
71
|
+
assert_equal 4, @@coll.find().sort(:age, -1).next_document["age"]
|
72
|
+
assert_equal 0, @@coll.find().sort([["age", :asc]]).next_document["age"]
|
73
|
+
|
74
|
+
assert_kind_of Cursor, @@coll.find().sort([[:age, -1], [:b, 1]])
|
75
|
+
|
76
|
+
assert_equal 4, @@coll.find().sort(:age, 1).sort(:age, -1).next_document["age"]
|
77
|
+
assert_equal 0, @@coll.find().sort(:age, -1).sort(:age, 1).next_document["age"]
|
78
|
+
|
79
|
+
assert_equal 4, @@coll.find().sort([:age, :asc]).sort(:age, -1).next_document["age"]
|
80
|
+
assert_equal 0, @@coll.find().sort([:age, :desc]).sort(:age, 1).next_document["age"]
|
81
|
+
|
82
|
+
cursor = @@coll.find()
|
83
|
+
cursor.next_document
|
84
|
+
assert_raise InvalidOperation do
|
85
|
+
cursor.sort(["age"])
|
86
|
+
end
|
87
|
+
|
88
|
+
assert_raise InvalidSortValueError do
|
89
|
+
@@coll.find().sort(:age, 25).next_document
|
90
|
+
end
|
91
|
+
|
92
|
+
assert_raise InvalidSortValueError do
|
93
|
+
@@coll.find().sort(25).next_document
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_sort_date
|
98
|
+
@@coll.remove
|
99
|
+
5.times{|x| @@coll.insert({"created_at" => Time.utc(2000 + x)}) }
|
100
|
+
|
101
|
+
assert_equal 2000, @@coll.find().sort(:created_at, :asc).next_document["created_at"].year
|
102
|
+
assert_equal 2004, @@coll.find().sort(:created_at, :desc).next_document["created_at"].year
|
103
|
+
|
104
|
+
assert_equal 2000, @@coll.find().sort([:created_at, :asc]).next_document["created_at"].year
|
105
|
+
assert_equal 2004, @@coll.find().sort([:created_at, :desc]).next_document["created_at"].year
|
106
|
+
|
107
|
+
assert_equal 2000, @@coll.find().sort([[:created_at, :asc]]).next_document["created_at"].year
|
108
|
+
assert_equal 2004, @@coll.find().sort([[:created_at, :desc]]).next_document["created_at"].year
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_sort_min_max_keys
|
112
|
+
@@coll.remove
|
113
|
+
@@coll.insert({"n" => 1000000})
|
114
|
+
@@coll.insert({"n" => -1000000})
|
115
|
+
@@coll.insert({"n" => MaxKey.new})
|
116
|
+
@@coll.insert({"n" => MinKey.new})
|
117
|
+
|
118
|
+
results = @@coll.find.sort([:n, :asc]).to_a
|
119
|
+
|
120
|
+
assert_equal MinKey.new, results[0]['n']
|
121
|
+
assert_equal -1000000, results[1]['n']
|
122
|
+
assert_equal 1000000, results[2]['n']
|
123
|
+
assert_equal MaxKey.new, results[3]['n']
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_id_range_queries
|
127
|
+
@@coll.remove
|
128
|
+
|
129
|
+
t1 = Time.now
|
130
|
+
t1_id = ObjectID.from_time(t1)
|
131
|
+
@@coll.save({:t => 't1'})
|
132
|
+
@@coll.save({:t => 't1'})
|
133
|
+
@@coll.save({:t => 't1'})
|
134
|
+
sleep(2)
|
135
|
+
t2 = Time.now
|
136
|
+
t2_id = ObjectID.from_time(t2)
|
137
|
+
@@coll.save({:t => 't2'})
|
138
|
+
@@coll.save({:t => 't2'})
|
139
|
+
@@coll.save({:t => 't2'})
|
140
|
+
|
141
|
+
assert_equal 3, @@coll.find({'_id' => {'$gt' => t1_id}, '_id' => {'$lt' => t2_id}}).count
|
142
|
+
@@coll.find({'_id' => {'$gt' => t2_id}}).each do |doc|
|
143
|
+
assert_equal 't2', doc['t']
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_limit
|
148
|
+
@@coll.remove
|
149
|
+
|
150
|
+
10.times do |i|
|
151
|
+
@@coll.save("x" => i)
|
152
|
+
end
|
153
|
+
assert_equal 10, @@coll.find().count()
|
154
|
+
|
155
|
+
results = @@coll.find().limit(5).to_a
|
156
|
+
assert_equal 5, results.length
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_limit_exceptions
|
160
|
+
assert_raise ArgumentError do
|
161
|
+
cursor = @@coll.find().limit('not-an-integer')
|
162
|
+
end
|
163
|
+
|
164
|
+
cursor = @@coll.find()
|
165
|
+
firstResult = cursor.next_document
|
166
|
+
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
167
|
+
cursor.limit(1)
|
168
|
+
end
|
169
|
+
|
170
|
+
cursor = @@coll.find()
|
171
|
+
cursor.close
|
172
|
+
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
173
|
+
cursor.limit(1)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_skip
|
178
|
+
@@coll.remove
|
179
|
+
|
180
|
+
10.times do |i|
|
181
|
+
@@coll.save("x" => i)
|
182
|
+
end
|
183
|
+
assert_equal 10, @@coll.find().count()
|
184
|
+
|
185
|
+
all_results = @@coll.find().to_a
|
186
|
+
skip_results = @@coll.find().skip(2).to_a
|
187
|
+
assert_equal 10, all_results.length
|
188
|
+
assert_equal 8, skip_results.length
|
189
|
+
|
190
|
+
assert_equal all_results.slice(2...10), skip_results
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_skip_exceptions
|
194
|
+
assert_raise ArgumentError do
|
195
|
+
cursor = @@coll.find().skip('not-an-integer')
|
196
|
+
end
|
197
|
+
|
198
|
+
cursor = @@coll.find()
|
199
|
+
firstResult = cursor.next_document
|
200
|
+
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
201
|
+
cursor.skip(1)
|
202
|
+
end
|
203
|
+
|
204
|
+
cursor = @@coll.find()
|
205
|
+
cursor.close
|
206
|
+
assert_raise InvalidOperation, "Cannot modify the query once it has been run or closed." do
|
207
|
+
cursor.skip(1)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_limit_skip_chaining
|
212
|
+
@@coll.remove
|
213
|
+
10.times do |i|
|
214
|
+
@@coll.save("x" => i)
|
215
|
+
end
|
216
|
+
|
217
|
+
all_results = @@coll.find().to_a
|
218
|
+
limited_skip_results = @@coll.find().limit(5).skip(3).to_a
|
219
|
+
|
220
|
+
assert_equal all_results.slice(3...8), limited_skip_results
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_close_no_query_sent
|
224
|
+
begin
|
225
|
+
cursor = @@coll.find('a' => 1)
|
226
|
+
cursor.close
|
227
|
+
assert cursor.closed?
|
228
|
+
rescue => ex
|
229
|
+
fail ex.to_s
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_refill_via_get_more
|
234
|
+
assert_equal 1, @@coll.count
|
235
|
+
1000.times { |i|
|
236
|
+
assert_equal 1 + i, @@coll.count
|
237
|
+
@@coll.insert('a' => i)
|
238
|
+
}
|
239
|
+
|
240
|
+
assert_equal 1001, @@coll.count
|
241
|
+
count = 0
|
242
|
+
@@coll.find.each { |obj|
|
243
|
+
count += obj['a']
|
244
|
+
}
|
245
|
+
assert_equal 1001, @@coll.count
|
246
|
+
|
247
|
+
# do the same thing again for debugging
|
248
|
+
assert_equal 1001, @@coll.count
|
249
|
+
count2 = 0
|
250
|
+
@@coll.find.each { |obj|
|
251
|
+
count2 += obj['a']
|
252
|
+
}
|
253
|
+
assert_equal 1001, @@coll.count
|
254
|
+
|
255
|
+
assert_equal count, count2
|
256
|
+
assert_equal 499501, count
|
257
|
+
end
|
258
|
+
|
259
|
+
def test_refill_via_get_more_alt_coll
|
260
|
+
coll = @@db.collection('test-alt-coll')
|
261
|
+
coll.remove
|
262
|
+
coll.insert('a' => 1) # collection not created until it's used
|
263
|
+
assert_equal 1, coll.count
|
264
|
+
|
265
|
+
1000.times { |i|
|
266
|
+
assert_equal 1 + i, coll.count
|
267
|
+
coll.insert('a' => i)
|
268
|
+
}
|
269
|
+
|
270
|
+
assert_equal 1001, coll.count
|
271
|
+
count = 0
|
272
|
+
coll.find.each { |obj|
|
273
|
+
count += obj['a']
|
274
|
+
}
|
275
|
+
assert_equal 1001, coll.count
|
276
|
+
|
277
|
+
# do the same thing again for debugging
|
278
|
+
assert_equal 1001, coll.count
|
279
|
+
count2 = 0
|
280
|
+
coll.find.each { |obj|
|
281
|
+
count2 += obj['a']
|
282
|
+
}
|
283
|
+
assert_equal 1001, coll.count
|
284
|
+
|
285
|
+
assert_equal count, count2
|
286
|
+
assert_equal 499501, count
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_close_after_query_sent
|
290
|
+
begin
|
291
|
+
cursor = @@coll.find('a' => 1)
|
292
|
+
cursor.next_document
|
293
|
+
cursor.close
|
294
|
+
assert cursor.closed?
|
295
|
+
rescue => ex
|
296
|
+
fail ex.to_s
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def test_kill_cursors
|
301
|
+
@@coll.drop
|
302
|
+
|
303
|
+
client_cursors = @@db.command("cursorInfo" => 1)["clientCursors_size"]
|
304
|
+
by_location = @@db.command("cursorInfo" => 1)["byLocation_size"]
|
305
|
+
|
306
|
+
10000.times do |i|
|
307
|
+
@@coll.insert("i" => i)
|
308
|
+
end
|
309
|
+
|
310
|
+
assert_equal(client_cursors,
|
311
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
312
|
+
assert_equal(by_location,
|
313
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
314
|
+
|
315
|
+
10.times do |i|
|
316
|
+
@@coll.find_one()
|
317
|
+
end
|
318
|
+
|
319
|
+
assert_equal(client_cursors,
|
320
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
321
|
+
assert_equal(by_location,
|
322
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
323
|
+
|
324
|
+
10.times do |i|
|
325
|
+
a = @@coll.find()
|
326
|
+
a.next_document
|
327
|
+
a.close()
|
328
|
+
end
|
329
|
+
|
330
|
+
assert_equal(client_cursors,
|
331
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
332
|
+
assert_equal(by_location,
|
333
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
334
|
+
|
335
|
+
a = @@coll.find()
|
336
|
+
a.next_document
|
337
|
+
|
338
|
+
assert_not_equal(client_cursors,
|
339
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
340
|
+
assert_not_equal(by_location,
|
341
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
342
|
+
|
343
|
+
a.close()
|
344
|
+
|
345
|
+
assert_equal(client_cursors,
|
346
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
347
|
+
assert_equal(by_location,
|
348
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
349
|
+
|
350
|
+
a = @@coll.find({}, :limit => 10).next_document
|
351
|
+
|
352
|
+
assert_equal(client_cursors,
|
353
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
354
|
+
assert_equal(by_location,
|
355
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
356
|
+
|
357
|
+
@@coll.find() do |cursor|
|
358
|
+
cursor.next_document
|
359
|
+
end
|
360
|
+
|
361
|
+
assert_equal(client_cursors,
|
362
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
363
|
+
assert_equal(by_location,
|
364
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
365
|
+
|
366
|
+
@@coll.find() { |cursor|
|
367
|
+
cursor.next_document
|
368
|
+
}
|
369
|
+
|
370
|
+
assert_equal(client_cursors,
|
371
|
+
@@db.command("cursorInfo" => 1)["clientCursors_size"])
|
372
|
+
assert_equal(by_location,
|
373
|
+
@@db.command("cursorInfo" => 1)["byLocation_size"])
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_count_with_fields
|
377
|
+
@@coll.remove
|
378
|
+
@@coll.save("x" => 1)
|
379
|
+
|
380
|
+
if @@version < "1.1.3"
|
381
|
+
assert_equal(0, @@coll.find({}, :fields => ["a"]).count())
|
382
|
+
else
|
383
|
+
assert_equal(1, @@coll.find({}, :fields => ["a"]).count())
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|