diff options
Diffstat (limited to 'src/mongo/db/exec/text.h')
-rw-r--r-- | src/mongo/db/exec/text.h | 222 |
1 files changed, 112 insertions, 110 deletions
diff --git a/src/mongo/db/exec/text.h b/src/mongo/db/exec/text.h index 764abf41002..07fd2323dc1 100644 --- a/src/mongo/db/exec/text.h +++ b/src/mongo/db/exec/text.h @@ -46,151 +46,153 @@ namespace mongo { - using fts::FTSIndexFormat; - using fts::FTSMatcher; - using fts::FTSQuery; - using fts::FTSSpec; - using fts::MAX_WEIGHT; +using fts::FTSIndexFormat; +using fts::FTSMatcher; +using fts::FTSQuery; +using fts::FTSSpec; +using fts::MAX_WEIGHT; - class OperationContext; +class OperationContext; - struct TextStageParams { - TextStageParams(const FTSSpec& s) : spec(s) {} +struct TextStageParams { + TextStageParams(const FTSSpec& s) : spec(s) {} - // Text index descriptor. IndexCatalog owns this. - IndexDescriptor* index; + // Text index descriptor. IndexCatalog owns this. + IndexDescriptor* index; - // Index spec. - FTSSpec spec; + // Index spec. + FTSSpec spec; - // Index keys that precede the "text" index key. - BSONObj indexPrefix; + // Index keys that precede the "text" index key. + BSONObj indexPrefix; - // The text query. - FTSQuery query; - }; + // The text query. + FTSQuery query; +}; +/** + * Implements a blocking stage that returns text search results. + * + * Prerequisites: None; is a leaf node. + * Output type: LOC_AND_OBJ_UNOWNED. + * + * TODO: Should the TextStage ever generate NEED_FETCH requests? Right now this stage could + * reduce concurrency by failing to request a yield during fetch. + */ +class TextStage : public PlanStage { +public: /** - * Implements a blocking stage that returns text search results. - * - * Prerequisites: None; is a leaf node. - * Output type: LOC_AND_OBJ_UNOWNED. - * - * TODO: Should the TextStage ever generate NEED_FETCH requests? Right now this stage could - * reduce concurrency by failing to request a yield during fetch. + * The text stage has a few 'states' it transitions between. */ - class TextStage : public PlanStage { - public: - /** - * The text stage has a few 'states' it transitions between. - */ - enum State { - // 1. Initialize the index scans we use to retrieve term/score info. - INIT_SCANS, - - // 2. Read the terms/scores from the text index. - READING_TERMS, + enum State { + // 1. Initialize the index scans we use to retrieve term/score info. + INIT_SCANS, - // 3. Return results to our parent. - RETURNING_RESULTS, + // 2. Read the terms/scores from the text index. + READING_TERMS, - // 4. Done. - DONE, - }; + // 3. Return results to our parent. + RETURNING_RESULTS, - TextStage(OperationContext* txn, - const TextStageParams& params, - WorkingSet* ws, - const MatchExpression* filter); + // 4. Done. + DONE, + }; - virtual ~TextStage(); + TextStage(OperationContext* txn, + const TextStageParams& params, + WorkingSet* ws, + const MatchExpression* filter); - virtual StageState work(WorkingSetID* out); - virtual bool isEOF(); + virtual ~TextStage(); - virtual void saveState(); - virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(OperationContext* txn, const RecordId& dl, InvalidationType type); + virtual StageState work(WorkingSetID* out); + virtual bool isEOF(); - virtual std::vector<PlanStage*> getChildren() const; + virtual void saveState(); + virtual void restoreState(OperationContext* opCtx); + virtual void invalidate(OperationContext* txn, const RecordId& dl, InvalidationType type); - virtual StageType stageType() const { return STAGE_TEXT; } + virtual std::vector<PlanStage*> getChildren() const; - PlanStageStats* getStats(); + virtual StageType stageType() const { + return STAGE_TEXT; + } - virtual const CommonStats* getCommonStats(); + PlanStageStats* getStats(); - virtual const SpecificStats* getSpecificStats(); + virtual const CommonStats* getCommonStats(); - static const char* kStageType; + virtual const SpecificStats* getSpecificStats(); - private: - /** - * Initializes sub-scanners. - */ - StageState initScans(WorkingSetID* out); + static const char* kStageType; - /** - * Helper for buffering results array. Returns NEED_TIME (if any results were produced), - * IS_EOF, or FAILURE. - */ - StageState readFromSubScanners(WorkingSetID* out); +private: + /** + * Initializes sub-scanners. + */ + StageState initScans(WorkingSetID* out); - /** - * Helper called from readFromSubScanners to update aggregate score with a new-found (term, - * score) pair for this document. Also rejects documents that don't match this stage's - * filter. - */ - void addTerm(const BSONObj key, WorkingSetID wsid); + /** + * Helper for buffering results array. Returns NEED_TIME (if any results were produced), + * IS_EOF, or FAILURE. + */ + StageState readFromSubScanners(WorkingSetID* out); - /** - * Possibly return a result. FYI, this may perform a fetch directly if it is needed to - * evaluate all filters. - */ - StageState returnResults(WorkingSetID* out); + /** + * Helper called from readFromSubScanners to update aggregate score with a new-found (term, + * score) pair for this document. Also rejects documents that don't match this stage's + * filter. + */ + void addTerm(const BSONObj key, WorkingSetID wsid); - // transactional context for read locks. Not owned by us - OperationContext* _txn; + /** + * Possibly return a result. FYI, this may perform a fetch directly if it is needed to + * evaluate all filters. + */ + StageState returnResults(WorkingSetID* out); - // Parameters of this text stage. - TextStageParams _params; + // transactional context for read locks. Not owned by us + OperationContext* _txn; - // Text-specific phrase and negated term matcher. - FTSMatcher _ftsMatcher; + // Parameters of this text stage. + TextStageParams _params; - // Working set. Not owned by us. - WorkingSet* _ws; + // Text-specific phrase and negated term matcher. + FTSMatcher _ftsMatcher; - // Filter. Not owned by us. - const MatchExpression* _filter; + // Working set. Not owned by us. + WorkingSet* _ws; - // Stats. - CommonStats _commonStats; - TextStats _specificStats; + // Filter. Not owned by us. + const MatchExpression* _filter; - // What state are we in? See the State enum above. - State _internalState; + // Stats. + CommonStats _commonStats; + TextStats _specificStats; - // Used in INIT_SCANS and READING_TERMS. The index scans we're using to retrieve text - // terms. - OwnedPointerVector<PlanStage> _scanners; + // What state are we in? See the State enum above. + State _internalState; - // Which _scanners are we currently reading from? - size_t _currentIndexScanner; + // Used in INIT_SCANS and READING_TERMS. The index scans we're using to retrieve text + // terms. + OwnedPointerVector<PlanStage> _scanners; - // Map each buffered record id to this data. - struct TextRecordData { - TextRecordData() : wsid(WorkingSet::INVALID_ID), score(0.0) { } - WorkingSetID wsid; - double score; - }; + // Which _scanners are we currently reading from? + size_t _currentIndexScanner; - // Temporary score data filled out by sub-scans. Used in READING_TERMS and - // RETURNING_RESULTS. - // Maps from diskloc -> (aggregate score for doc, wsid). - typedef unordered_map<RecordId, TextRecordData, RecordId::Hasher> ScoreMap; - ScoreMap _scores; - ScoreMap::const_iterator _scoreIterator; + // Map each buffered record id to this data. + struct TextRecordData { + TextRecordData() : wsid(WorkingSet::INVALID_ID), score(0.0) {} + WorkingSetID wsid; + double score; }; -} // namespace mongo + // Temporary score data filled out by sub-scans. Used in READING_TERMS and + // RETURNING_RESULTS. + // Maps from diskloc -> (aggregate score for doc, wsid). + typedef unordered_map<RecordId, TextRecordData, RecordId::Hasher> ScoreMap; + ScoreMap _scores; + ScoreMap::const_iterator _scoreIterator; +}; + +} // namespace mongo |