diff --git a/db/queryoptimizer.cpp b/db/queryoptimizer.cpp index da71b129ca0..d9fb4f26cf7 100644 --- a/db/queryoptimizer.cpp +++ b/db/queryoptimizer.cpp @@ -42,6 +42,7 @@ namespace mongo { direction_( 0 ), startKey_( startKey ), endKey_( endKey ), + endKeyInclusive_( endKey_.isEmpty() ), unhelpful_( false ) { // full table scan case if ( !index_ ) { @@ -144,7 +145,7 @@ namespace mongo { return findTableScan( fbs_.ns(), order_, startLoc ); massert( "newCursor() with start location not implemented for indexed plans", startLoc.isNull() ); //TODO This constructor should really take a const ref to the index details. - return auto_ptr< Cursor >( new BtreeCursor( *const_cast< IndexDetails* >( index_ ), startKey_, endKey_, true, direction_ >= 0 ? 1 : -1 ) ); + return auto_ptr< Cursor >( new BtreeCursor( *const_cast< IndexDetails* >( index_ ), startKey_, endKey_, endKeyInclusive_, direction_ >= 0 ? 1 : -1 ) ); } auto_ptr< Cursor > QueryPlan::newReverseCursor() const { diff --git a/db/queryoptimizer.h b/db/queryoptimizer.h index efc1e11962e..de4f32414e4 100644 --- a/db/queryoptimizer.h +++ b/db/queryoptimizer.h @@ -67,6 +67,7 @@ namespace mongo { int direction_; BSONObj startKey_; BSONObj endKey_; + bool endKeyInclusive_; bool unhelpful_; }; diff --git a/dbtests/querytests.cpp b/dbtests/querytests.cpp index 3c669b0dc41..36af257769f 100644 --- a/dbtests/querytests.cpp +++ b/dbtests/querytests.cpp @@ -562,11 +562,11 @@ namespace QueryTests { BSONObj hints[] = { BSONObj(), BSON( "a" << 1 << "b" << 1 ) }; for( int i = 0; i < 2; ++i ) { check( 0, 0, 3, 3, 4, hints[ i ] ); - check( 1, 1, 2, 2, 4, hints[ i ] ); - check( 1, 2, 2, 2, 3, hints[ i ] ); - check( 1, 2, 2, 1, 2, hints[ i ] ); + check( 1, 1, 2, 2, 3, hints[ i ] ); + check( 1, 2, 2, 2, 2, hints[ i ] ); + check( 1, 2, 2, 1, 1, hints[ i ] ); - auto_ptr< DBClientCursor > c = query( 1, 2, 2, 1, hints[ i ] ); + auto_ptr< DBClientCursor > c = query( 1, 2, 2, 2, hints[ i ] ); BSONObj obj = c->next(); ASSERT_EQUALS( 1, obj.getIntField( "a" ) ); ASSERT_EQUALS( 2, obj.getIntField( "b" ) ); diff --git a/jstests/minmax.js b/jstests/minmax.js index c8d5f2ffd8e..3723e33f9a5 100644 --- a/jstests/minmax.js +++ b/jstests/minmax.js @@ -12,25 +12,27 @@ t.drop(); t.ensureIndex( { a: 1, b: 1 } ); addData(); -assert.eq( 2, t.find().min( { a: 1, b: 2 } ).max( { a: 2, b: 1 } ).toArray().length ); +assert.eq( 1, t.find().min( { a: 1, b: 2 } ).max( { a: 2, b: 1 } ).toArray().length ); +assert.eq( 2, t.find().min( { a: 1, b: 2 } ).max( { a: 2, b: 1.5 } ).toArray().length ); +assert.eq( 2, t.find().min( { a: 1, b: 2 } ).max( { a: 2, b: 2 } ).toArray().length ); // just one bound assert.eq( 3, t.find().min( { a: 1, b: 2 } ).toArray().length ); -assert.eq( 3, t.find().max( { a: 2, b: 1 } ).toArray().length ); +assert.eq( 3, t.find().max( { a: 2, b: 1.5 } ).toArray().length ); assert.eq( 3, t.find().min( { a: 1, b: 2 } ).hint( { a: 1, b: 1 } ).toArray().length ); -assert.eq( 3, t.find().max( { a: 2, b: 1 } ).hint( { a: 1, b: 1 } ).toArray().length ); +assert.eq( 3, t.find().max( { a: 2, b: 1.5 } ).hint( { a: 1, b: 1 } ).toArray().length ); t.drop(); t.ensureIndex( { a: 1, b: -1 } ); addData(); assert.eq( 4, t.find().min( { a: 1, b: 2 } ).toArray().length ); -assert.eq( 4, t.find().max( { a: 2, b: 1 } ).toArray().length ); +assert.eq( 4, t.find().max( { a: 2, b: 0.5 } ).toArray().length ); assert.eq( 1, t.find().min( { a: 2, b: 1 } ).toArray().length ); -assert.eq( 1, t.find().max( { a: 1, b: 2 } ).toArray().length ); +assert.eq( 1, t.find().max( { a: 1, b: 1.5 } ).toArray().length ); assert.eq( 4, t.find().min( { a: 1, b: 2 } ).hint( { a: 1, b: -1 } ).toArray().length ); -assert.eq( 4, t.find().max( { a: 2, b: 1 } ).hint( { a: 1, b: -1 } ).toArray().length ); +assert.eq( 4, t.find().max( { a: 2, b: 0.5 } ).hint( { a: 1, b: -1 } ).toArray().length ); assert.eq( 1, t.find().min( { a: 2, b: 1 } ).hint( { a: 1, b: -1 } ).toArray().length ); -assert.eq( 1, t.find().max( { a: 1, b: 2 } ).hint( { a: 1, b: -1 } ).toArray().length ); +assert.eq( 1, t.find().max( { a: 1, b: 1.5 } ).hint( { a: 1, b: -1 } ).toArray().length ); // hint doesn't match assert.throws( function() { t.find().min( { a: 1 } ).hint( { a: 1, b: -1 } ).toArray() } );