0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00

make $max query parameter an exclusive bound

This commit is contained in:
Aaron 2009-05-06 14:02:44 -04:00
parent 0189992754
commit d42d6b340c
4 changed files with 16 additions and 12 deletions

View File

@ -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 {

View File

@ -67,6 +67,7 @@ namespace mongo {
int direction_;
BSONObj startKey_;
BSONObj endKey_;
bool endKeyInclusive_;
bool unhelpful_;
};

View File

@ -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" ) );

View File

@ -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() } );