summaryrefslogtreecommitdiff
path: root/src/mongo/db/fts/fts_query_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/fts/fts_query_impl.cpp')
-rw-r--r--src/mongo/db/fts/fts_query_impl.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/src/mongo/db/fts/fts_query_impl.cpp b/src/mongo/db/fts/fts_query_impl.cpp
index af03d2ed5da..674c8e84ab2 100644
--- a/src/mongo/db/fts/fts_query_impl.cpp
+++ b/src/mongo/db/fts/fts_query_impl.cpp
@@ -37,6 +37,7 @@
#include "mongo/db/fts/fts_tokenizer.h"
#include "mongo/util/mongoutils/str.h"
#include "mongo/util/stringutils.h"
+#include "mongo/stdx/memory.h"
namespace mongo {
@@ -49,18 +50,11 @@ using std::string;
using std::stringstream;
using std::vector;
-Status FTSQueryImpl::parse(const string& query,
- StringData language,
- bool caseSensitive,
- bool diacriticSensitive,
- TextIndexVersion textIndexVersion) {
- StatusWithFTSLanguage swl = FTSLanguage::make(language, textIndexVersion);
- if (!swl.getStatus().isOK()) {
- return swl.getStatus();
+Status FTSQueryImpl::parse(TextIndexVersion textIndexVersion) {
+ StatusWithFTSLanguage ftsLanguage = FTSLanguage::make(getLanguage(), textIndexVersion);
+ if (!ftsLanguage.getStatus().isOK()) {
+ return ftsLanguage.getStatus();
}
- _language = swl.getValue();
- _caseSensitive = caseSensitive;
- _diacriticSensitive = diacriticSensitive;
// Build a space delimited list of words to have the FtsTokenizer tokenize
string positiveTermSentence;
@@ -71,7 +65,7 @@ Status FTSQueryImpl::parse(const string& query,
unsigned quoteOffset = 0;
- FTSQueryParser i(query);
+ FTSQueryParser i(getQuery());
while (i.more()) {
QueryToken t = i.next();
@@ -105,7 +99,7 @@ Status FTSQueryImpl::parse(const string& query,
// end of a phrase
unsigned phraseStart = quoteOffset + 1;
unsigned phraseLength = t.offset - phraseStart;
- StringData phrase = StringData(query).substr(phraseStart, phraseLength);
+ StringData phrase = StringData(getQuery()).substr(phraseStart, phraseLength);
if (inNegation) {
_negatedPhrases.push_back(phrase.toString());
} else {
@@ -124,7 +118,7 @@ Status FTSQueryImpl::parse(const string& query,
}
}
- std::unique_ptr<FTSTokenizer> tokenizer(_language->createTokenizer());
+ std::unique_ptr<FTSTokenizer> tokenizer(ftsLanguage.getValue()->createTokenizer());
_addTerms(tokenizer.get(), positiveTermSentence, false);
_addTerms(tokenizer.get(), negativeTermSentence, true);
@@ -132,6 +126,20 @@ Status FTSQueryImpl::parse(const string& query,
return Status::OK();
}
+std::unique_ptr<FTSQuery> FTSQueryImpl::clone() const {
+ auto clonedQuery = stdx::make_unique<FTSQueryImpl>();
+ clonedQuery->setQuery(getQuery());
+ clonedQuery->setLanguage(getLanguage());
+ clonedQuery->setCaseSensitive(getCaseSensitive());
+ clonedQuery->setDiacriticSensitive(getDiacriticSensitive());
+ clonedQuery->_positiveTerms = _positiveTerms;
+ clonedQuery->_negatedTerms = _negatedTerms;
+ clonedQuery->_positivePhrases = _positivePhrases;
+ clonedQuery->_negatedPhrases = _negatedPhrases;
+ clonedQuery->_termsForBounds = _termsForBounds;
+ return std::move(clonedQuery);
+}
+
void FTSQueryImpl::_addTerms(FTSTokenizer* tokenizer, const string& sentence, bool negated) {
tokenizer->reset(sentence.c_str(), FTSTokenizer::kFilterStopWords);
@@ -150,21 +158,21 @@ void FTSQueryImpl::_addTerms(FTSTokenizer* tokenizer, const string& sentence, bo
// Compute the string corresponding to 'token' that will be used for the matcher.
// For case and diacritic insensitive queries, this is the same string as 'boundsTerm'
// computed above.
- if (!_caseSensitive && !_diacriticSensitive) {
+ if (!getCaseSensitive() && !getDiacriticSensitive()) {
activeTerms.insert(word);
}
}
- if (!_caseSensitive && !_diacriticSensitive) {
+ if (!getCaseSensitive() && !getDiacriticSensitive()) {
return;
}
FTSTokenizer::Options newOptions = FTSTokenizer::kFilterStopWords;
- if (_caseSensitive) {
+ if (getCaseSensitive()) {
newOptions |= FTSTokenizer::kGenerateCaseSensitiveTokens;
}
- if (_diacriticSensitive) {
+ if (getDiacriticSensitive()) {
newOptions |= FTSTokenizer::kGenerateDiacriticSensitiveTokens;
}