summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/keep_mutations.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/exec/keep_mutations.cpp')
-rw-r--r--src/mongo/db/exec/keep_mutations.cpp210
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