diff options
Diffstat (limited to 'db/queryoptimizer.cpp')
-rw-r--r-- | db/queryoptimizer.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/db/queryoptimizer.cpp b/db/queryoptimizer.cpp index 13dc63a1791..2d6d7033506 100644 --- a/db/queryoptimizer.cpp +++ b/db/queryoptimizer.cpp @@ -33,11 +33,11 @@ namespace mongo { QueryPlan::QueryPlan( NamespaceDetails *_d, int _idxNo, - const FieldBoundSet &fbs, const BSONObj &order, const IndexDetails *index, const BSONObj &startKey, const BSONObj &endKey ) : + const FieldBoundSet &fbs, const BSONObj &order, const BSONObj &startKey, const BSONObj &endKey ) : d(_d), idxNo(_idxNo), fbs_( fbs ), order_( order ), - index_( index ), + index_( 0 ), optimal_( false ), scanAndOrderRequired_( true ), exactKeyMatch_( false ), @@ -46,14 +46,17 @@ namespace mongo { endKey_( endKey ), endKeyInclusive_( endKey_.isEmpty() ), unhelpful_( false ) { - // full table scan case - if ( !index_ ) { + + if( idxNo >= 0 ) { + index_ = &d->indexes[idxNo]; + } else { + // full table scan case if ( order_.isEmpty() || !strcmp( order_.firstElement().fieldName(), "$natural" ) ) scanAndOrderRequired_ = false; return; } - BSONObj idxKey = index->keyPattern(); + BSONObj idxKey = index_->keyPattern(); BSONObjIterator o( order ); BSONObjIterator k( idxKey ); if ( !o.moreWithEOO() ) @@ -123,7 +126,7 @@ namespace mongo { optimal_ = true; if ( exactIndexedQueryCount == fbs.nNontrivialBounds() && orderFieldsUnindexed.size() == 0 && - exactIndexedQueryCount == index->keyPattern().nFields() && + exactIndexedQueryCount == index_->keyPattern().nFields() && exactIndexedQueryCount == fbs.query().nFields() ) { exactKeyMatch_ = true; } @@ -196,7 +199,7 @@ namespace mongo { massert( errmsg, indexDetailsForRange( fbs_.ns(), errmsg, min_, max_, keyPattern ) ); } NamespaceDetails *d = nsdetails(ns); - plans_.push_back( PlanPtr( new QueryPlan( d, d->idxNo(id), fbs_, order_, &id, min_, max_ ) ) ); + plans_.push_back( PlanPtr( new QueryPlan( d, d->idxNo(id), fbs_, order_, min_, max_ ) ) ); } void QueryPlanSet::init() { @@ -250,7 +253,7 @@ namespace mongo { BSONObj keyPattern; IndexDetails *idx = indexDetailsForRange( ns, errmsg, min_, max_, keyPattern ); massert( errmsg, idx ); - plans_.push_back( PlanPtr( new QueryPlan( d, d->idxNo(*idx), fbs_, order_, idx, min_, max_ ) ) ); + plans_.push_back( PlanPtr( new QueryPlan( d, d->idxNo(*idx), fbs_, order_, min_, max_ ) ) ); return; } @@ -268,7 +271,7 @@ namespace mongo { for (int i = 0; i < d->nIndexes; i++ ) { IndexDetails& ii = d->indexes[i]; if( ii.keyPattern().woCompare(bestIndex) == 0 ) { - plans_.push_back( PlanPtr( new QueryPlan( d, i, fbs_, order_, &ii ) ) ); + plans_.push_back( PlanPtr( new QueryPlan( d, i, fbs_, order_ ) ) ); return; } } @@ -295,7 +298,7 @@ namespace mongo { PlanSet plans; for( int i = 0; i < d->nIndexes; ++i ) { - PlanPtr p( new QueryPlan( d, i, fbs_, order_, &d->indexes[ i ] ) ); + PlanPtr p( new QueryPlan( d, i, fbs_, order_ ) ); if ( p->optimal() ) { addPlan( p, checkFirst ); return; |