diff options
Diffstat (limited to 'jstests/core/hashindex1.js')
-rw-r--r-- | jstests/core/hashindex1.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/jstests/core/hashindex1.js b/jstests/core/hashindex1.js new file mode 100644 index 00000000000..34bd6dc0725 --- /dev/null +++ b/jstests/core/hashindex1.js @@ -0,0 +1,94 @@ +var t = db.hashindex1; +t.drop() + +//test non-single field hashed indexes don't get created (maybe change later) +var badspec = {a : "hashed" , b : 1}; +t.ensureIndex( badspec ); +assert.eq( t.getIndexes().length , 1 , "only _id index should be created"); + +//test unique index not created (maybe change later) +var goodspec = {a : "hashed"}; +t.ensureIndex( goodspec , {"unique" : true}); +assert.eq( t.getIndexes().length , 1 , "unique index got created."); + +//now test that non-unique index does get created +t.ensureIndex(goodspec); +assert.eq( t.getIndexes().length , 2 , "hashed index didn't get created"); + +//test basic inserts +for(i=0; i < 10; i++ ){ + t.insert( {a:i } ); +} +assert.eq( t.find().count() , 10 , "basic insert didn't work"); +assert.eq( t.find().hint(goodspec).toArray().length , 10 , "basic insert didn't work"); +assert.eq( t.find({a : 3}).hint({_id : 1}).toArray()[0]._id , + t.find({a : 3}).hint(goodspec).toArray()[0]._id , + "hashindex lookup didn't work" ); + + +//make sure things with the same hash are not both returned +t.insert( {a: 3.1} ); +assert.eq( t.find().count() , 11 , "additional insert didn't work"); +assert.eq( t.find({a : 3.1}).hint(goodspec).toArray().length , 1); +assert.eq( t.find({a : 3}).hint(goodspec).toArray().length , 1); +//test right obj is found +assert.eq( t.find({a : 3.1}).hint(goodspec).toArray()[0].a , 3.1); + +//test that hashed cursor is used when it should be +var cursorname = "BtreeCursor a_hashed"; +assert.eq( t.find({a : 1}).explain().cursor , + cursorname , + "not using hashed cursor"); + +// SERVER-12222 +//printjson( t.find({a : {$gte : 3 , $lte : 3}}).explain() ) +//assert.eq( t.find({a : {$gte : 3 , $lte : 3}}).explain().cursor , +// cursorname , +// "not using hashed cursor"); +assert.neq( t.find({c : 1}).explain().cursor , + cursorname , + "using irrelevant hashed cursor"); + +printjson( t.find({a : {$in : [1,2]}}).explain() ) +// Hash index used with a $in set membership predicate. +assert.eq( t.find({a : {$in : [1,2]}}).explain()["cursor"], + "BtreeCursor a_hashed", + "not using hashed cursor"); + +// Hash index used with a singleton $and predicate conjunction. +assert.eq( t.find({$and : [{a : 1}]}).explain()["cursor"], + "BtreeCursor a_hashed", + "not using hashed cursor"); + +// Hash index used with a non singleton $and predicate conjunction. +assert.eq( t.find({$and : [{a : {$in : [1,2]}},{a : {$gt : 1}}]}).explain()["cursor"], + "BtreeCursor a_hashed", + "not using hashed cursor"); + +//test creation of index based on hash of _id index +var goodspec2 = {'_id' : "hashed"}; +t.ensureIndex( goodspec2 ); +assert.eq( t.getIndexes().length , 3 , "_id index didn't get created"); + +var newid = t.findOne()["_id"]; +assert.eq( t.find( {_id : newid} ).hint( {_id : 1} ).toArray()[0]._id , + t.find( {_id : newid} ).hint( goodspec2 ).toArray()[0]._id, + "using hashed index and different index returns different docs"); + + +//test creation of sparse hashed index +var sparseindex = {b : "hashed"}; +t.ensureIndex( sparseindex , {"sparse" : true}); +assert.eq( t.getIndexes().length , 4 , "sparse index didn't get created"); + +//test sparse index has smaller total items on after inserts +for(i=0; i < 10; i++ ){ + t.insert( {b : i} ); +} +var totalb = t.find().hint(sparseindex).toArray().length; +assert.eq( totalb , 10 , "sparse index has wrong total"); + +var total = t.find().hint({"_id" : 1}).toArray().length; +var totala = t.find().hint(goodspec).toArray().length; +assert.eq(total , totala , "non-sparse index has wrong total"); +assert.lt(totalb , totala , "sparse index should have smaller total"); |