diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2015-10-12 11:47:14 -0400 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2015-10-22 14:45:38 -0400 |
commit | 3f01c3b16025b23b68e3d975ac153cdbcaa398db (patch) | |
tree | 5a9e71fb60dd2ff5779d667338fa8020acde1236 | |
parent | a7863d44d31812ff24d5db4e1af650ad5411bea8 (diff) | |
download | mongo-3f01c3b16025b23b68e3d975ac153cdbcaa398db.tar.gz |
SERVER-20848: text search of document with language field uses the wrong text index version (2 instead of 3)
-rw-r--r-- | src/mongo/db/fts/fts_basic_tokenizer_test.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_element_iterator_test.cpp | 99 | ||||
-rw-r--r-- | src/mongo/db/fts/fts_spec.cpp | 2 |
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(); } |