summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/projection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/exec/projection.cpp')
-rw-r--r--src/mongo/db/exec/projection.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/mongo/db/exec/projection.cpp b/src/mongo/db/exec/projection.cpp
index 60c0aa221f3..c4c8388462f 100644
--- a/src/mongo/db/exec/projection.cpp
+++ b/src/mongo/db/exec/projection.cpp
@@ -50,6 +50,8 @@ namespace mongo {
_commonStats(kStageType),
_projImpl(params.projImpl) {
+ _projObj = params.projObj;
+
if (ProjectionStageParams::NO_FAST_PATH == _projImpl) {
_exec.reset(new ProjectionExec(params.projObj,
params.fullExpression,
@@ -59,8 +61,6 @@ namespace mongo {
// We shouldn't need the full expression if we're fast-pathing.
invariant(NULL == params.fullExpression);
- _projObj = params.projObj;
-
// Sanity-check the input.
invariant(_projObj.isOwned());
invariant(!_projObj.isEmpty());
@@ -197,6 +197,9 @@ namespace mongo {
PlanStage::StageState ProjectionStage::work(WorkingSetID* out) {
++_commonStats.works;
+ // Adds the amount of time taken by work() to executionTimeMillis.
+ ScopedTimer timer(&_commonStats.executionTimeMillis);
+
WorkingSetID id = WorkingSet::INVALID_ID;
StageState status = _child->work(&id);
@@ -247,11 +250,20 @@ namespace mongo {
_child->invalidate(dl, type);
}
+ vector<PlanStage*> ProjectionStage::getChildren() const {
+ vector<PlanStage*> children;
+ children.push_back(_child.get());
+ return children;
+ }
+
PlanStageStats* ProjectionStage::getStats() {
_commonStats.isEOF = isEOF();
- _specificStats.projObj = _projObj;
auto_ptr<PlanStageStats> ret(new PlanStageStats(_commonStats, STAGE_PROJECTION));
- ret->specific.reset(new ProjectionStats(_specificStats));
+
+ ProjectionStats* projStats = new ProjectionStats(_specificStats);
+ projStats->projObj = _projObj;
+ ret->specific.reset(projStats);
+
ret->children.push_back(_child->getStats());
return ret.release();
}