summaryrefslogtreecommitdiff
path: root/src/mongo/db/fts
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2015-10-12 11:47:14 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2015-10-22 14:45:38 -0400
commit3f01c3b16025b23b68e3d975ac153cdbcaa398db (patch)
tree5a9e71fb60dd2ff5779d667338fa8020acde1236 /src/mongo/db/fts
parenta7863d44d31812ff24d5db4e1af650ad5411bea8 (diff)
downloadmongo-3f01c3b16025b23b68e3d975ac153cdbcaa398db.tar.gz
SERVER-20848: text search of document with language field uses the wrong text index version (2 instead of 3)
Diffstat (limited to 'src/mongo/db/fts')
-rw-r--r--src/mongo/db/fts/fts_basic_tokenizer_test.cpp1
-rw-r--r--src/mongo/db/fts/fts_element_iterator_test.cpp99
-rw-r--r--src/mongo/db/fts/fts_spec.cpp2
3 files changed, 101 insertions, 1 deletions
diff --git a/src/mongo/db/fts/fts_basic_tokenizer_test.cpp b/src/mongo/db/fts/fts_basic_tokenizer_test.cpp
index 0359da805d3..cf0c78e4e8f 100644
--- a/src/mongo/db/fts/fts_basic_tokenizer_test.cpp
+++ b/src/mongo/db/fts/fts_basic_tokenizer_test.cpp
@@ -34,6 +34,7 @@ namespace mongo {
namespace fts {
std::vector<std::string> tokenizeString(const char* str, const char* language) {
+ // To retrieve the FTSBasicTokenizer, use TEXT_INDEX_VERSION_2
StatusWithFTSLanguage swl = FTSLanguage::make(language, TEXT_INDEX_VERSION_2);
ASSERT_OK(swl);
diff --git a/src/mongo/db/fts/fts_element_iterator_test.cpp b/src/mongo/db/fts/fts_element_iterator_test.cpp
index 2a16c14b5a5..26e390d0f28 100644
--- a/src/mongo/db/fts/fts_element_iterator_test.cpp
+++ b/src/mongo/db/fts/fts_element_iterator_test.cpp
@@ -296,5 +296,104 @@ TEST(FTSElementIterator, Test6) {
ASSERT_EQUALS("danish", val._language->str());
ASSERT_EQUALS(5, val._weight);
}
+
+// Multi-language : Test Version 2 Language Override
+TEST(FTSElementIterator, LanguageOverrideV2) {
+ BSONObj obj = fromjson(
+ "{ a :"
+ " { b :"
+ " [ { c : \"walked\", language : \"english\" },"
+ " { c : \"camminato\", language : \"italian\" },"
+ " { c : \"ging\", language : \"german\" } ]"
+ " },"
+ " d : \"Feliz Año Nuevo!\","
+ " language : \"spanish\""
+ " }");
+
+ BSONObj indexSpec =
+ fromjson("{ key : { \"a.b.c\" : \"text\", d : \"text\" }, textIndexVersion: 2.0 }");
+
+ FTSSpec spec(FTSSpec::fixSpec(indexSpec));
+
+ FTSElementIterator it(spec, obj);
+
+ ASSERT(it.more());
+ FTSIteratorValue val = it.next();
+ ASSERT_EQUALS("walked", string(val._text));
+ ASSERT_EQUALS("english", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_2));
+ ASSERT_EQUALS(1, val._weight);
+
+ ASSERT(it.more());
+ val = it.next();
+ ASSERT_EQUALS("camminato", string(val._text));
+ ASSERT_EQUALS("italian", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_2));
+ ASSERT_EQUALS(1, val._weight);
+
+ ASSERT(it.more());
+ val = it.next();
+ ASSERT_EQUALS("ging", string(val._text));
+ ASSERT_EQUALS("german", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_2));
+ ASSERT_EQUALS(1, val._weight);
+
+ ASSERT(it.more());
+ val = it.next();
+ ASSERT_EQUALS("Feliz Año Nuevo!", string(val._text));
+ ASSERT_EQUALS("spanish", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_2));
+ ASSERT_EQUALS(1, val._weight);
}
+
+// Multi-language : Test Version 3 Language Override
+TEST(FTSElementIterator, LanguageOverrideV3) {
+ BSONObj obj = fromjson(
+ "{ a :"
+ " { b :"
+ " [ { c : \"walked\", language : \"english\" },"
+ " { c : \"camminato\", language : \"italian\" },"
+ " { c : \"ging\", language : \"german\" } ]"
+ " },"
+ " d : \"Feliz Año Nuevo!\","
+ " language : \"spanish\""
+ " }");
+
+ BSONObj indexSpec =
+ fromjson("{ key : { \"a.b.c\" : \"text\", d : \"text\" }, textIndexVersion: 3.0 }");
+
+ FTSSpec spec(FTSSpec::fixSpec(indexSpec));
+
+ FTSElementIterator it(spec, obj);
+
+ ASSERT(it.more());
+ FTSIteratorValue val = it.next();
+ ASSERT_EQUALS("walked", string(val._text));
+ ASSERT_EQUALS("english", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_3));
+ ASSERT_EQUALS(1, val._weight);
+
+ ASSERT(it.more());
+ val = it.next();
+ ASSERT_EQUALS("camminato", string(val._text));
+ ASSERT_EQUALS("italian", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_3));
+ ASSERT_EQUALS(1, val._weight);
+
+ ASSERT(it.more());
+ val = it.next();
+ ASSERT_EQUALS("ging", string(val._text));
+ ASSERT_EQUALS("german", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_3));
+ ASSERT_EQUALS(1, val._weight);
+
+ ASSERT(it.more());
+ val = it.next();
+ ASSERT_EQUALS("Feliz Año Nuevo!", string(val._text));
+ ASSERT_EQUALS("spanish", val._language->str());
+ ASSERT_EQUALS(val._language, FTSLanguage::make(val._language->str(), TEXT_INDEX_VERSION_3));
+ ASSERT_EQUALS(1, val._weight);
}
+
+} // namespace fts
+} // namespace mongo
diff --git a/src/mongo/db/fts/fts_spec.cpp b/src/mongo/db/fts/fts_spec.cpp
index 0f961a1dbc9..f825cce4ce7 100644
--- a/src/mongo/db/fts/fts_spec.cpp
+++ b/src/mongo/db/fts/fts_spec.cpp
@@ -163,7 +163,7 @@ const FTSLanguage* FTSSpec::_getLanguageToUseV2(const BSONObj& userDoc,
uassert(17261,
"found language override field in document with non-string type",
e.type() == mongo::String);
- StatusWithFTSLanguage swl = FTSLanguage::make(e.String(), TEXT_INDEX_VERSION_2);
+ StatusWithFTSLanguage swl = FTSLanguage::make(e.String(), getTextIndexVersion());
uassert(17262, "language override unsupported: " + e.String(), swl.getStatus().isOK());
return swl.getValue();
}