overhaul create_index - don't allow clients to specify their own name, allow descending indexes

This commit is contained in:
Mike Dirolf 2009-02-26 12:06:03 -05:00
parent 576ce7db59
commit 9b9f14ce2e
7 changed files with 56 additions and 28 deletions

View File

@ -23,7 +23,7 @@ p db.collection_names
p db.collections_info
# Index information
db.create_index('test', 'index_name', ['a'])
db.create_index('test', 'a')
p db.index_information('test')
# Destroy the collection

View File

@ -59,7 +59,7 @@ pp coll.find('a' => /[1|2]/).explain()
# collection, in which case they will be used with all queries, or they can be
# specified per query, in which case that hint overrides the hint associated
# with the collection if any.
coll.create_index('test_a_index', 'a')
coll.create_index('a')
coll.hint = 'a'
# You will see a different explanation now that the hint is in place

View File

@ -10,3 +10,10 @@ require 'mongo/db'
require 'mongo/cursor'
require 'mongo/collection'
require 'mongo/admin'
module XGen
module Mongo
ASCENDING = 1
DESCENDING = -1
end
end

View File

@ -113,11 +113,12 @@ module XGen
@db.modify_in_db(@name, selector, modifier_obj)
end
# Create a new index named +index_name+. +fields+ should be an array
# of field names.
def create_index(name, *fields)
fields = *fields if fields.kind_of?(Array) && fields.length == 1
@db.create_index(@name, name, fields)
# Create a new index. +field_or_spec+
# should be either a single field name or a Array of [field name,
# direction] pairs. Directions should be specified as
# XGen::Mongo::ASCENDING or XGen::Mongo::DESCENDING.
def create_index(field_or_spec)
@db.create_index(@name, field_or_spec)
end
# Drop index +name+.

View File

@ -401,17 +401,28 @@ module XGen
}
end
# Create a new index on +collection_name+ named +index_name+. +fields+
# should be an array of field names. Normally called by
# Collection#create_index.
def create_index(collection_name, index_name, fields)
sel = {:name => index_name, :ns => full_coll_name(collection_name)}
field_h = {}
fields.each { |f| field_h[f] = 1 }
sel[:key] = field_h
# Create a new index on +collection_name+. +field_or_spec+
# should be either a single field name or a Array of [field name,
# direction] pairs. Directions should be specified as
# XGen::Mongo::ASCENDING or XGen::Mongo::DESCENDING. Normally called
# by Collection#create_index.
def create_index(collection_name, field_or_spec)
field_h = OrderedHash.new
if field_or_spec.is_a? String
field_h[field_or_spec] = 1
else
field_or_spec.each { |f| field_h[f[0]] = f[1] }
end
name = gen_index_name(field_h)
sel = {
:name => name,
:ns => full_coll_name(collection_name),
:key => field_h
}
@semaphore.synchronize {
send_to_db(InsertMessage.new(@name, SYSTEM_INDEX_COLLECTION, sel))
}
name
end
# Insert +objects+ into +collection_name+. Normally called by
@ -471,6 +482,13 @@ module XGen
Digest::MD5.hexdigest("#{username}:mongo:#{plaintext}")
end
def gen_index_name(spec)
temp = []
spec.each_pair { |field, direction|
temp = temp.push("#{field}_#{direction}")
}
return temp.join("_")
end
end
end
end

View File

@ -157,7 +157,7 @@ module XGen
@curr_chunk = nth_chunk(0)
@position = 0
when 'w'
chunk_collection.create_index("chunk_index", ['files_id', 'n'])
chunk_collection.create_index([['files_id', XGen::Mongo::ASCENDING], ['n', XGen::Mongo::ASCENDING]])
delete_chunks
@curr_chunk = Chunk.new(self, 'n' => 0)
@content_type = options[:content_type] if options[:content_type]
@ -165,7 +165,7 @@ module XGen
@metadata = options[:metadata] if options[:metadata]
@position = 0
when 'w+'
chunk_collection.create_index("chunk_index", ['files_id', 'n'])
chunk_collection.create_index([['files_id', XGen::Mongo::ASCENDING], ['n', XGen::Mongo::ASCENDING]])
@curr_chunk = nth_chunk(last_chunk_number) || Chunk.new(self, 'n' => 0) # might be empty
@curr_chunk.pos = @curr_chunk.data.length if @curr_chunk
@metadata = options[:metadata] if options[:metadata]

View File

@ -4,7 +4,7 @@ require 'test/unit'
# NOTE: assumes Mongo is running
class DBAPITest < Test::Unit::TestCase
include XGen::Mongo
include XGen::Mongo::Driver
@@db = Mongo.new(ENV['MONGO_RUBY_DRIVER_HOST'] || 'localhost',
@ -275,28 +275,30 @@ class DBAPITest < Test::Unit::TestCase
end
def test_index_information
@@db.create_index(@@coll.name, 'index_name', ['a'])
name = @@db.create_index(@@coll.name, 'a')
list = @@db.index_information(@@coll.name)
assert_equal 1, list.length
info = list[0]
assert_equal 'index_name', info[:name]
assert_equal name, 'a_1'
assert_equal name, info[:name]
assert_equal 1, info[:keys]['a']
ensure
@@db.drop_index(@@coll.name, 'index_name')
@@db.drop_index(@@coll.name, name)
end
def test_multiple_index_cols
@@db.create_index(@@coll.name, 'index_name', ['a', 'b', 'c'])
name = @@db.create_index(@@coll.name, [['a', DESCENDING], ['b', ASCENDING], ['c', DESCENDING]])
list = @@db.index_information(@@coll.name)
assert_equal 1, list.length
info = list[0]
assert_equal 'index_name', info[:name]
assert_equal name, 'a_-1_b_1_c_-1'
assert_equal name, info[:name]
keys = info[:keys].keys
assert_equal ['a', 'b', 'c'], keys.sort
ensure
@@db.drop_index(@@coll.name, 'index_name')
@@db.drop_index(@@coll.name, name)
end
def test_array
@ -403,7 +405,7 @@ class DBAPITest < Test::Unit::TestCase
end
def test_hint
@@coll.create_index('test_a_index', 'a')
name = @@coll.create_index('a')
begin
assert_nil @@coll.hint
assert_equal 1, @@coll.find({'a' => 1}, :hint => 'a').to_a.size
@ -426,7 +428,7 @@ class DBAPITest < Test::Unit::TestCase
assert_nil @@coll.hint
assert_equal 1, @@coll.find('a' => 1).to_a.size
ensure
@@coll.drop_index('test_a_index')
@@coll.drop_index(name)
end
end