Bug fixes:
- Make sure Query#fields returns a hash, not an array. - Fix query limit by passing limit number to cursor and having it enforce the limit. (Database returns limit as first batch, but will continue to return data after the limit if requested.) Improvements: - Query#new can take a single field name instead of an array - A few doc comment improvements here and there.
This commit is contained in:
parent
cecbebb1e9
commit
26b88efd3b
|
@ -54,6 +54,9 @@ type
|
|||
|
||||
= To Do
|
||||
|
||||
* Only update message sizes once, not after every write of a value. This will
|
||||
require an explicit call to update_message_length in each message subclass.
|
||||
|
||||
* Tests for update and repsert.
|
||||
|
||||
* Add a way to specify a collection of databases on startup (a simple array of
|
||||
|
|
|
@ -29,14 +29,16 @@ module XGen
|
|||
|
||||
RESPONSE_HEADER_SIZE = 20
|
||||
|
||||
def initialize(db, collection)
|
||||
@db, @collection = db, collection
|
||||
def initialize(db, collection, num_to_return=0)
|
||||
@db, @collection, @num_to_return = db, collection, num_to_return
|
||||
@objects_returned = 0
|
||||
@objects = []
|
||||
@closed = false
|
||||
read_all
|
||||
end
|
||||
|
||||
# Return +true+ if there are more records to retrieve.
|
||||
# Return +true+ if there are more records to retrieve. We do not check
|
||||
# @num_to_return; #each is responsible for doing that.
|
||||
def more?
|
||||
num_remaining > 0
|
||||
end
|
||||
|
@ -49,10 +51,14 @@ module XGen
|
|||
o
|
||||
end
|
||||
|
||||
# Iterate over each object, yielding it to the given block.
|
||||
# Iterate over each object, yielding it to the given block. At most
|
||||
# @num_to_return records are returned (or all of them, if
|
||||
# @num_to_return is 0).
|
||||
def each
|
||||
while more?
|
||||
num_returned = 0
|
||||
while more? && (@num_to_return <= 0 || num_returned < @num_to_return)
|
||||
yield next_object()
|
||||
num_returned += 1
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -163,7 +163,7 @@ module XGen
|
|||
def query(collection_name, query)
|
||||
# TODO synchronize
|
||||
send_to_db(QueryMessage.new(@name, collection_name, query))
|
||||
return Cursor.new(self, collection_name)
|
||||
return Cursor.new(self, collection_name, query.number_to_return)
|
||||
end
|
||||
|
||||
# Remove the records that match +selector+ from +collection_name+.
|
||||
|
|
|
@ -27,20 +27,21 @@ module XGen
|
|||
class Query
|
||||
|
||||
attr_accessor :number_to_skip, :number_to_return, :order_by
|
||||
attr_reader :selector, :fields # writers defined below
|
||||
attr_reader :selector # writer defined below
|
||||
|
||||
# sel :: A hash describing the query. See the Mongo docs for details.
|
||||
#
|
||||
# return_fields :: If not +nil+, an array of field names. Only those
|
||||
# fields will be returned. (Called :fields in calls
|
||||
# to Collection#find.)
|
||||
# return_fields :: If not +nil+, a single field name or an array of
|
||||
# field names. Only those fields will be returned.
|
||||
# (Called :fields in calls to Collection#find.)
|
||||
#
|
||||
# number_to_skip :: Number of records to skip before returning
|
||||
# records. (Called :offset in calls to
|
||||
# Collection#find.)
|
||||
# Collection#find.) Default is 0.
|
||||
#
|
||||
# number_to_return :: Max number of records to return. (Called :limit
|
||||
# in calls to Collection#find.)
|
||||
# in calls to Collection#find.) Default is 0 (all
|
||||
# records).
|
||||
#
|
||||
# order_by :: If not +nil+, specifies record sort order. May be either
|
||||
# a hash or an array. If an array, it should be an array
|
||||
|
@ -77,6 +78,23 @@ module XGen
|
|||
@fields = val
|
||||
@fields = nil if @fields && @fields.empty?
|
||||
end
|
||||
|
||||
def fields
|
||||
case @fields
|
||||
when String
|
||||
{@fields => 1}
|
||||
when Array
|
||||
if @fields.length == 0
|
||||
nil
|
||||
else
|
||||
h = {}
|
||||
@fields.each { |field| h[field] = 1 }
|
||||
h
|
||||
end
|
||||
else # nil, anything else
|
||||
nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -183,6 +183,8 @@ class DBAPITest < Test::Unit::TestCase
|
|||
assert_equal 4, docs.size
|
||||
docs = @coll.find({}).map{ |x| x }
|
||||
assert_equal 4, docs.size
|
||||
docs = @coll.find({}, :limit => 99).map{ |x| x }
|
||||
assert_equal 4, docs.size
|
||||
end
|
||||
|
||||
def test_close
|
||||
|
|
Loading…
Reference in New Issue