PlanStage::StageState S2NearStage::work(WorkingSetID* out) { if (!_initted) { init(); } if (_failed) { mongoutils::str::stream ss; ss << "unable to load geo index " << _params.indexKeyPattern; Status status(ErrorCodes::IndexNotFound, ss); *out = WorkingSetCommon::allocateStatusMember( _ws, status); return PlanStage::FAILURE; } if (isEOF()) { return PlanStage::IS_EOF; } ++_commonStats.works; // If we haven't opened up our very first ixscan+fetch children, do it. This is kind of // heavy so we don't want to do it in the ctor. if (!_worked) { nextAnnulus(); _worked = true; } // If we're still reading results from the child, do that. if (NULL != _child.get()) { return addResultToQueue(out); } // Not reading results. Perhaps we're returning buffered results. if (!_results.empty()) { Result result = _results.top(); _results.pop(); *out = result.id; // Remove from invalidation map. WorkingSetMember* member = _ws->get(*out); if (member->hasLoc()) { unordered_map<DiskLoc, WorkingSetID, DiskLoc::Hasher>::iterator it = _invalidationMap.find(member->loc); verify(_invalidationMap.end() != it); _invalidationMap.erase(it); } ++_commonStats.advanced; return PlanStage::ADVANCED; } // Not EOF, not reading results, not returning any buffered results. Look in the next shell // for results. nextAnnulus(); return PlanStage::NEED_TIME; }
PlanStage::StageState S2NearStage::work(WorkingSetID* out) { if (_failed) { return PlanStage::FAILURE; } if (isEOF()) { return PlanStage::IS_EOF; } ++_commonStats.works; // If we haven't opened up our very first ixscan+fetch children, do it. This is kind of // heavy so we don't want to do it in the ctor. if (!_worked) { nextAnnulus(); _worked = true; } // If we're still reading results from the child, do that. if (NULL != _child.get()) { return addResultToQueue(out); } // Not reading results. Perhaps we're returning buffered results. if (!_results.empty()) { Result result = _results.top(); _results.pop(); *out = result.id; // Remove from invalidation map. WorkingSetMember* member = _ws->get(*out); if (member->hasLoc()) { unordered_map<DiskLoc, WorkingSetID, DiskLoc::Hasher>::iterator it = _invalidationMap.find(member->loc); verify(_invalidationMap.end() != it); _invalidationMap.erase(it); } // Drop flagged results. if (_ws->isFlagged(*out)) { _ws->free(*out); return PlanStage::NEED_TIME; } ++_commonStats.advanced; return PlanStage::ADVANCED; } // Not EOF, not reading results, not returning any buffered results. Look in the next shell // for results. nextAnnulus(); return PlanStage::NEED_TIME; }