mongodb-mongo 0.3.1 → 0.3.2
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/lib/mongo/collection.rb +26 -14
- data/lib/mongo/cursor.rb +0 -22
- data/lib/mongo/message/query_message.rb +2 -2
- data/lib/mongo/query.rb +8 -4
- data/mongo-ruby-driver.gemspec +1 -1
- data/tests/test_cursor.rb +0 -9
- data/tests/test_db.rb +3 -2
- data/tests/test_db_api.rb +27 -0
- metadata +1 -1
data/lib/mongo/collection.rb
CHANGED
@@ -23,27 +23,18 @@ module XGen
|
|
23
23
|
# A named collection of records in a database.
|
24
24
|
class Collection
|
25
25
|
|
26
|
-
attr_reader :db, :name, :
|
26
|
+
attr_reader :db, :name, :hint
|
27
27
|
|
28
28
|
def initialize(db, name)
|
29
29
|
@db = db
|
30
30
|
@name = name
|
31
31
|
end
|
32
32
|
|
33
|
-
# Set hint fields to use and return +self+.
|
33
|
+
# Set hint fields to use and return +self+. hint may be a
|
34
34
|
# single field name, array of field names, or a hash whose keys will
|
35
35
|
# become the hint field names. May be +nil+.
|
36
|
-
def hint(
|
37
|
-
@
|
38
|
-
when String
|
39
|
-
[hint_fields]
|
40
|
-
when Hash
|
41
|
-
hint_fields.keys
|
42
|
-
when nil
|
43
|
-
nil
|
44
|
-
else
|
45
|
-
hint_fields.to_a
|
46
|
-
end
|
36
|
+
def hint=(hint)
|
37
|
+
@hint = normalize_hint_fields(hint)
|
47
38
|
self
|
48
39
|
end
|
49
40
|
|
@@ -57,14 +48,21 @@ module XGen
|
|
57
48
|
# :sort :: Either hash of field names as keys and 1/-1 as values; 1 ==
|
58
49
|
# ascending, -1 == descending, or array of field names (all
|
59
50
|
# assumed to be sorted in ascending order).
|
51
|
+
# :hint :: See #hint. This option overrides the collection-wide value.
|
60
52
|
def find(selector={}, options={})
|
61
53
|
fields = options.delete(:fields)
|
62
54
|
fields = nil if fields && fields.empty?
|
63
55
|
offset = options.delete(:offset) || 0
|
64
56
|
limit = options.delete(:limit) || 0
|
65
57
|
sort = options.delete(:sort)
|
58
|
+
hint = options.delete(:hint)
|
59
|
+
if hint
|
60
|
+
hint = normalize_hint_fields(hint)
|
61
|
+
else
|
62
|
+
hint = @hint
|
63
|
+
end
|
66
64
|
raise RuntimeError, "Unknown options [#{options.inspect}]" unless options.empty?
|
67
|
-
@db.query(self, Query.new(selector, fields, offset, limit, sort))
|
65
|
+
@db.query(self, Query.new(selector, fields, offset, limit, sort, hint))
|
68
66
|
end
|
69
67
|
|
70
68
|
# Insert +objects+, which are hashes. "<<" is aliased to this method.
|
@@ -154,6 +152,20 @@ module XGen
|
|
154
152
|
@db.count(@name, selector || {})
|
155
153
|
end
|
156
154
|
|
155
|
+
protected
|
156
|
+
|
157
|
+
def normalize_hint_fields(hint)
|
158
|
+
case hint
|
159
|
+
when String
|
160
|
+
[hint]
|
161
|
+
when Hash
|
162
|
+
hint.keys
|
163
|
+
when nil
|
164
|
+
nil
|
165
|
+
else
|
166
|
+
hint.to_a
|
167
|
+
end
|
168
|
+
end
|
157
169
|
end
|
158
170
|
end
|
159
171
|
end
|
data/lib/mongo/cursor.rb
CHANGED
@@ -42,24 +42,6 @@ module XGen
|
|
42
42
|
|
43
43
|
def closed?; @closed; end
|
44
44
|
|
45
|
-
# Set hint fields to use and return +self+. hint_fields may be a
|
46
|
-
# single field name, array of field names, or a hash whose keys will
|
47
|
-
# become the hint field names. May be +nil+. If no hint fields are
|
48
|
-
# specified, the ones in the collection are used if they exist.
|
49
|
-
def hint(hint_fields)
|
50
|
-
@hint_fields = case hint_fields
|
51
|
-
when String
|
52
|
-
[hint_fields]
|
53
|
-
when Hash
|
54
|
-
hint_fields.keys
|
55
|
-
when nil
|
56
|
-
nil
|
57
|
-
else
|
58
|
-
hint_fields.to_a
|
59
|
-
end
|
60
|
-
self
|
61
|
-
end
|
62
|
-
|
63
45
|
# Return +true+ if there are more records to retrieve. We do not check
|
64
46
|
# @num_to_return; #each is responsible for doing that.
|
65
47
|
def more?
|
@@ -223,12 +205,8 @@ module XGen
|
|
223
205
|
def send_query_if_needed
|
224
206
|
# Run query first time we request an object from the wire
|
225
207
|
unless @query_run
|
226
|
-
hints = @hint_fields || @collection.hint_fields
|
227
|
-
old_hints = @query.hint_fields
|
228
|
-
@query.hint_fields = hints
|
229
208
|
@db.send_query_message(QueryMessage.new(@db.name, @collection.name, @query))
|
230
209
|
@query_run = true
|
231
|
-
@query.hint_fields = old_hints
|
232
210
|
read_all
|
233
211
|
end
|
234
212
|
end
|
@@ -44,9 +44,9 @@ module XGen
|
|
44
44
|
raise "illegal order_by: is a #{query.order_by.class.name}, must be String, Array, Hash, or OrderedHash"
|
45
45
|
end
|
46
46
|
end
|
47
|
-
if query.
|
47
|
+
if query.hint && query.hint.length > 0
|
48
48
|
hints = OrderedHash.new
|
49
|
-
query.
|
49
|
+
query.hint.each { |hf| hints[hf] = 1 }
|
50
50
|
sel['$hint'] = hints
|
51
51
|
end
|
52
52
|
if query.explain
|
data/lib/mongo/query.rb
CHANGED
@@ -29,7 +29,7 @@ module XGen
|
|
29
29
|
# If true, $explain will be set in QueryMessage that uses this query.
|
30
30
|
attr_accessor :explain
|
31
31
|
# Either +nil+ or an array of hint field names.
|
32
|
-
attr_accessor :
|
32
|
+
attr_accessor :hint
|
33
33
|
attr_reader :selector # writer defined below
|
34
34
|
|
35
35
|
# sel :: A hash describing the query. See the Mongo docs for details.
|
@@ -58,8 +58,12 @@ module XGen
|
|
58
58
|
# probably will not be what you intend because key order
|
59
59
|
# is not preserved. (order_by is called :sort in calls to
|
60
60
|
# Collection#find.)
|
61
|
-
|
62
|
-
|
61
|
+
#
|
62
|
+
# hint :: If not +nil+, specifies query hint fields. See
|
63
|
+
# Collection#hint.
|
64
|
+
def initialize(sel={}, return_fields=nil, number_to_skip=0, number_to_return=0, order_by=nil, hint=nil)
|
65
|
+
@number_to_skip, @number_to_return, @order_by, @hint =
|
66
|
+
number_to_skip, number_to_return, order_by, hint
|
63
67
|
self.selector = sel
|
64
68
|
self.fields = return_fields
|
65
69
|
end
|
@@ -102,7 +106,7 @@ module XGen
|
|
102
106
|
end
|
103
107
|
|
104
108
|
def contains_special_fields
|
105
|
-
(@order_by != nil && @order_by.length > 0) || @explain || @
|
109
|
+
(@order_by != nil && @order_by.length > 0) || @explain || @hint
|
106
110
|
end
|
107
111
|
end
|
108
112
|
end
|
data/mongo-ruby-driver.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'mongo'
|
3
|
-
s.version = '0.3.
|
3
|
+
s.version = '0.3.2'
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.summary = 'Simple pure-Ruby driver for the 10gen Mongo DB'
|
6
6
|
s.description = 'A pure-Ruby driver for the 10gen Mongo DB. For more information about Mongo, see http://www.mongodb.org.'
|
data/tests/test_cursor.rb
CHANGED
data/tests/test_db.rb
CHANGED
@@ -62,16 +62,17 @@ class DBTest < Test::Unit::TestCase
|
|
62
62
|
coll = db.collection('test')
|
63
63
|
coll.clear
|
64
64
|
|
65
|
+
# new id gets added to returned object
|
65
66
|
obj = coll.insert('name' => 'Fred', 'age' => 42)
|
66
67
|
row = coll.find({'name' => 'Fred'}, :limit => 1).next_object
|
67
|
-
oid = row
|
68
|
+
oid = row['_id']
|
68
69
|
assert_not_nil oid
|
69
70
|
assert_equal obj, row
|
70
71
|
|
71
72
|
oid = XGen::Mongo::Driver::ObjectID.new
|
72
73
|
obj = coll.insert('_id' => oid, 'name' => 'Barney', 'age' => 41)
|
73
74
|
row = coll.find({'name' => 'Barney'}, :limit => 1).next_object
|
74
|
-
db_oid = row
|
75
|
+
db_oid = row['_id']
|
75
76
|
assert_equal oid, db_oid
|
76
77
|
assert_equal obj, row
|
77
78
|
|
data/tests/test_db_api.rb
CHANGED
@@ -372,4 +372,31 @@ class DBAPITest < Test::Unit::TestCase
|
|
372
372
|
assert_equal "#{@db.host}:#{@db.port}", @db.master
|
373
373
|
end
|
374
374
|
|
375
|
+
def test_hint
|
376
|
+
begin
|
377
|
+
assert_nil @coll.hint
|
378
|
+
assert_equal 1, @coll.find({'a' => 1}, :hint => 'a').to_a.size
|
379
|
+
assert_equal 1, @coll.find({'a' => 1}, :hint => ['a']).to_a.size
|
380
|
+
assert_equal 1, @coll.find({'a' => 1}, :hint => {'a' => 1}).to_a.size
|
381
|
+
|
382
|
+
@coll.hint = 'a'
|
383
|
+
assert_equal ['a'], @coll.hint
|
384
|
+
assert_equal 1, @coll.find('a' => 1).to_a.size
|
385
|
+
|
386
|
+
@coll.hint = ['a']
|
387
|
+
assert_equal ['a'], @coll.hint
|
388
|
+
assert_equal 1, @coll.find('a' => 1).to_a.size
|
389
|
+
|
390
|
+
@coll.hint = {'a' => 1}
|
391
|
+
assert_equal ['a'], @coll.hint
|
392
|
+
assert_equal 1, @coll.find('a' => 1).to_a.size
|
393
|
+
|
394
|
+
@coll.hint = nil
|
395
|
+
assert_nil @coll.hint
|
396
|
+
assert_equal 1, @coll.find('a' => 1).to_a.size
|
397
|
+
rescue => ex
|
398
|
+
fail ex.to_s
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
375
402
|
end
|