RUBY-192; Updates for Collection#ensure_index

This commit is contained in:
Kyle Banker 2011-01-03 16:16:24 -05:00
parent bc5dcdfc7f
commit ae202d590e
4 changed files with 36 additions and 11 deletions

View File

@ -415,6 +415,7 @@ module Mongo
opts[:dropDups] = opts.delete(:drop_dups) if opts[:drop_dups] opts[:dropDups] = opts.delete(:drop_dups) if opts[:drop_dups]
field_spec = parse_index_spec(spec) field_spec = parse_index_spec(spec)
name = opts.delete(:name) || generate_index_name(field_spec) name = opts.delete(:name) || generate_index_name(field_spec)
name = name.to_s if name
generate_indexes(field_spec, name, opts) generate_indexes(field_spec, name, opts)
name name
@ -437,18 +438,15 @@ module Mongo
# #
# @return [String] the name of the index. # @return [String] the name of the index.
def ensure_index(spec, opts={}) def ensure_index(spec, opts={})
valid = BSON::OrderedHash.new
now = Time.now.utc.to_i now = Time.now.utc.to_i
field_spec = parse_index_spec(spec) field_spec = parse_index_spec(spec)
field_spec.each do |key, value| name = opts.delete(:name) || generate_index_name(field_spec)
cache_key = generate_index_name({key => value}) name = name.to_s if name
timeout = @cache[cache_key] || 0
valid[key] = value if timeout <= now
end
name = opts.delete(:name) || generate_index_name(valid) if !@cache[name] || @cache[name] <= now
generate_indexes(valid, name, opts) if valid.any? generate_indexes(field_spec, name, opts)
end
# Reset the cache here in case there are any errors inserting. Best to be safe. # Reset the cache here in case there are any errors inserting. Best to be safe.
@cache[name] = now + @cache_time @cache[name] = now + @cache_time
@ -461,7 +459,7 @@ module Mongo
# #
# @core indexes # @core indexes
def drop_index(name) def drop_index(name)
@cache[name] = nil @cache[name.to_s] = nil
@db.drop_index(@name, name) @db.drop_index(@name, name)
end end

View File

@ -403,7 +403,7 @@ module Mongo
def drop_index(collection_name, index_name) def drop_index(collection_name, index_name)
oh = BSON::OrderedHash.new oh = BSON::OrderedHash.new
oh[:deleteIndexes] = collection_name oh[:deleteIndexes] = collection_name
oh[:index] = index_name oh[:index] = index_name.to_s
doc = command(oh, :check_response => false) doc = command(oh, :check_response => false)
ok?(doc) || raise(MongoDBError, "Error with drop_index command: #{doc.inspect}") ok?(doc) || raise(MongoDBError, "Error with drop_index command: #{doc.inspect}")
end end

View File

@ -600,6 +600,23 @@ class TestCollection < Test::Unit::TestCase
@@test.drop_index("a_1") @@test.drop_index("a_1")
end end
def test_ensure_index_timeout
@@db.cache_time = 2
coll = @@db['ensure_test']
coll.expects(:generate_indexes).twice
coll.ensure_index([['a', 1]])
# These will be cached
coll.ensure_index([['a', 1]])
coll.ensure_index([['a', 1]])
coll.ensure_index([['a', 1]])
coll.ensure_index([['a', 1]])
sleep(3)
# This won't be, so generate_indexes will be called twice
coll.ensure_index([['a', 1]])
end
context "Grouping" do context "Grouping" do
setup do setup do
@@test.remove @@test.remove
@ -693,6 +710,17 @@ class TestCollection < Test::Unit::TestCase
@geo = @@db.collection('geo') @geo = @@db.collection('geo')
end end
should "create index using symbols" do
@collection.create_index :foo, :name => :bar
@geo.create_index :goo, :name => :baz
assert @collection.index_information['bar']
@collection.drop_index :bar
assert_nil @collection.index_information['bar']
assert @geo.index_information['baz']
@geo.drop_index(:baz)
assert_nil @geo.index_information['baz']
end
should "create a geospatial index" do should "create a geospatial index" do
@geo.save({'loc' => [-100, 100]}) @geo.save({'loc' => [-100, 100]})
@geo.create_index([['loc', Mongo::GEO2D]]) @geo.create_index([['loc', Mongo::GEO2D]])

View File

@ -113,7 +113,6 @@ class CollectionTest < Test::Unit::TestCase
@coll.ensure_index [["x", Mongo::DESCENDING]] @coll.ensure_index [["x", Mongo::DESCENDING]]
@coll.ensure_index [["x", Mongo::DESCENDING]] @coll.ensure_index [["x", Mongo::DESCENDING]]
end end
should "call generate_indexes for each key when calling ensure_indexes" do should "call generate_indexes for each key when calling ensure_indexes" do