diff options
Diffstat (limited to 'src/mongo/db/exec/keep_mutations.cpp')
-rw-r--r-- | src/mongo/db/exec/keep_mutations.cpp | 210 |
1 files changed, 105 insertions, 105 deletions
diff --git a/src/mongo/db/exec/keep_mutations.cpp b/src/mongo/db/exec/keep_mutations.cpp index 7c88a59fde5..c30d276782d 100644 --- a/src/mongo/db/exec/keep_mutations.cpp +++ b/src/mongo/db/exec/keep_mutations.cpp @@ -33,127 +33,127 @@ namespace mongo { - using std::unique_ptr; - using std::vector; - - // static - const char* KeepMutationsStage::kStageType = "KEEP_MUTATIONS"; - - KeepMutationsStage::KeepMutationsStage(const MatchExpression* filter, - WorkingSet* ws, - PlanStage* child) - : _workingSet(ws), - _child(child), - _filter(filter), - _doneReadingChild(false), - _doneReturningFlagged(false), - _commonStats(kStageType) { } - - KeepMutationsStage::~KeepMutationsStage() { } - - bool KeepMutationsStage::isEOF() { - return _doneReadingChild && _doneReturningFlagged; - } - - PlanStage::StageState KeepMutationsStage::work(WorkingSetID* out) { - ++_commonStats.works; +using std::unique_ptr; +using std::vector; - // Adds the amount of time taken by work() to executionTimeMillis. - ScopedTimer timer(&_commonStats.executionTimeMillis); +// static +const char* KeepMutationsStage::kStageType = "KEEP_MUTATIONS"; - // If we've returned as many results as we're limited to, isEOF will be true. - if (isEOF()) { return PlanStage::IS_EOF; } +KeepMutationsStage::KeepMutationsStage(const MatchExpression* filter, + WorkingSet* ws, + PlanStage* child) + : _workingSet(ws), + _child(child), + _filter(filter), + _doneReadingChild(false), + _doneReturningFlagged(false), + _commonStats(kStageType) {} - // Stream child results until the child is all done. - if (!_doneReadingChild) { - StageState status = _child->work(out); +KeepMutationsStage::~KeepMutationsStage() {} - // Child is still returning results. Pass them through. - if (PlanStage::IS_EOF != status) { - if (PlanStage::ADVANCED == status) { - ++_commonStats.advanced; - } - else if (PlanStage::NEED_TIME == status) { - ++_commonStats.needTime; - } - else if (PlanStage::NEED_YIELD == status) { - ++_commonStats.needYield; - } +bool KeepMutationsStage::isEOF() { + return _doneReadingChild && _doneReturningFlagged; +} - return status; - } +PlanStage::StageState KeepMutationsStage::work(WorkingSetID* out) { + ++_commonStats.works; - // Child is EOF. We want to stream flagged results if there are any. - _doneReadingChild = true; - - // Read out all of the flagged results from the working set. We can't iterate through - // the working set's flagged result set directly, since it may be modified later if - // further documents are invalidated during a yield. - std::copy(_workingSet->getFlagged().begin(), _workingSet->getFlagged().end(), - std::back_inserter(_flagged)); - _flaggedIterator = _flagged.begin(); - } + // Adds the amount of time taken by work() to executionTimeMillis. + ScopedTimer timer(&_commonStats.executionTimeMillis); - // We're streaming flagged results. - invariant(!_doneReturningFlagged); - if (_flaggedIterator == _flagged.end()) { - _doneReturningFlagged = true; - return PlanStage::IS_EOF; - } - - WorkingSetID idToTest = *_flaggedIterator; - _flaggedIterator++; - - WorkingSetMember* member = _workingSet->get(idToTest); - if (Filter::passes(member, _filter)) { - *out = idToTest; - ++_commonStats.advanced; - return PlanStage::ADVANCED; - } - else { - _workingSet->free(idToTest); - ++_commonStats.needTime; - return PlanStage::NEED_TIME; - } - } - - void KeepMutationsStage::saveState() { - ++_commonStats.yields; - _child->saveState(); + // If we've returned as many results as we're limited to, isEOF will be true. + if (isEOF()) { + return PlanStage::IS_EOF; } - void KeepMutationsStage::restoreState(OperationContext* opCtx) { - ++_commonStats.unyields; - _child->restoreState(opCtx); - } + // Stream child results until the child is all done. + if (!_doneReadingChild) { + StageState status = _child->work(out); + + // Child is still returning results. Pass them through. + if (PlanStage::IS_EOF != status) { + if (PlanStage::ADVANCED == status) { + ++_commonStats.advanced; + } else if (PlanStage::NEED_TIME == status) { + ++_commonStats.needTime; + } else if (PlanStage::NEED_YIELD == status) { + ++_commonStats.needYield; + } - void KeepMutationsStage::invalidate(OperationContext* txn, - const RecordId& dl, - InvalidationType type) { - ++_commonStats.invalidates; - _child->invalidate(txn, dl, type); - } + return status; + } - vector<PlanStage*> KeepMutationsStage::getChildren() const { - vector<PlanStage*> children; - children.push_back(_child.get()); - return children; - } + // Child is EOF. We want to stream flagged results if there are any. + _doneReadingChild = true; - PlanStageStats* KeepMutationsStage::getStats() { - _commonStats.isEOF = isEOF(); - unique_ptr<PlanStageStats> ret(new PlanStageStats(_commonStats, STAGE_KEEP_MUTATIONS)); - // Takes ownership of the object returned from _child->getStats(). - ret->children.push_back(_child->getStats()); - return ret.release(); + // Read out all of the flagged results from the working set. We can't iterate through + // the working set's flagged result set directly, since it may be modified later if + // further documents are invalidated during a yield. + std::copy(_workingSet->getFlagged().begin(), + _workingSet->getFlagged().end(), + std::back_inserter(_flagged)); + _flaggedIterator = _flagged.begin(); } - const CommonStats* KeepMutationsStage::getCommonStats() const { - return &_commonStats; + // We're streaming flagged results. + invariant(!_doneReturningFlagged); + if (_flaggedIterator == _flagged.end()) { + _doneReturningFlagged = true; + return PlanStage::IS_EOF; } - const SpecificStats* KeepMutationsStage::getSpecificStats() const { - return NULL; + WorkingSetID idToTest = *_flaggedIterator; + _flaggedIterator++; + + WorkingSetMember* member = _workingSet->get(idToTest); + if (Filter::passes(member, _filter)) { + *out = idToTest; + ++_commonStats.advanced; + return PlanStage::ADVANCED; + } else { + _workingSet->free(idToTest); + ++_commonStats.needTime; + return PlanStage::NEED_TIME; } +} + +void KeepMutationsStage::saveState() { + ++_commonStats.yields; + _child->saveState(); +} + +void KeepMutationsStage::restoreState(OperationContext* opCtx) { + ++_commonStats.unyields; + _child->restoreState(opCtx); +} + +void KeepMutationsStage::invalidate(OperationContext* txn, + const RecordId& dl, + InvalidationType type) { + ++_commonStats.invalidates; + _child->invalidate(txn, dl, type); +} + +vector<PlanStage*> KeepMutationsStage::getChildren() const { + vector<PlanStage*> children; + children.push_back(_child.get()); + return children; +} + +PlanStageStats* KeepMutationsStage::getStats() { + _commonStats.isEOF = isEOF(); + unique_ptr<PlanStageStats> ret(new PlanStageStats(_commonStats, STAGE_KEEP_MUTATIONS)); + // Takes ownership of the object returned from _child->getStats(). + ret->children.push_back(_child->getStats()); + return ret.release(); +} + +const CommonStats* KeepMutationsStage::getCommonStats() const { + return &_commonStats; +} + +const SpecificStats* KeepMutationsStage::getSpecificStats() const { + return NULL; +} } // namespace mongo |