diff options
Diffstat (limited to 'src/mongo/db/fts/fts_element_iterator_test.cpp')
-rw-r--r-- | src/mongo/db/fts/fts_element_iterator_test.cpp | 536 |
1 files changed, 262 insertions, 274 deletions
diff --git a/src/mongo/db/fts/fts_element_iterator_test.cpp b/src/mongo/db/fts/fts_element_iterator_test.cpp index 6d5694c5990..2a16c14b5a5 100644 --- a/src/mongo/db/fts/fts_element_iterator_test.cpp +++ b/src/mongo/db/fts/fts_element_iterator_test.cpp @@ -34,279 +34,267 @@ #include "mongo/unittest/unittest.h" namespace mongo { - namespace fts { - - using std::string; - - TEST( FTSElementIterator, Test1 ) { - - BSONObj obj = fromjson( - "{ b : \"walking\"," - " c : { e: \"walked\" }," - " d : \"walker\"" - " }" ); - - BSONObj indexSpec = fromjson( - "{ key : { a : \"text\" }, weights : { b : 10, d : 5 } }" ); - - FTSSpec spec( FTSSpec::fixSpec( indexSpec ) ); - Weights::const_iterator itt = spec.weights().begin(); - ASSERT( itt != spec.weights().end() ); - ASSERT_EQUALS( "a", itt->first ); - ASSERT_EQUALS( 1, itt->second ); - ++itt; - ASSERT( itt != spec.weights().end() ); - ASSERT_EQUALS( "b", itt->first ); - ASSERT_EQUALS( 10, itt->second ); - ++itt; - ASSERT( itt != spec.weights().end() ); - ASSERT_EQUALS( "d", itt->first ); - ASSERT_EQUALS( 5, itt->second ); - ++itt; - - FTSElementIterator it( spec, obj ); - - ASSERT( it.more() ); - FTSIteratorValue val = it.next(); - ASSERT_EQUALS( "walking", string(val._text) ); - ASSERT_EQUALS( "english", val._language->str() ); - ASSERT_EQUALS( 10, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "walker", string(val._text) ); - ASSERT_EQUALS( "english", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - } - - // Multi-language : test - TEST( FTSElementIterator, Test2 ) { - - 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\" } }" ); - - 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( 1, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "camminato", string(val._text) ); - ASSERT_EQUALS( "italian", val._language->str() ); - 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( 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( 1, val._weight ); - } - - // Multi-language : test nested stemming per sub-document - TEST( FTSElementIterator, Test3 ) { - - BSONObj obj = fromjson( - "{ language : \"english\"," - " a :" - " { language : \"danish\"," - " b :" - " [ { c : \"foredrag\" }," - " { c : \"foredragsholder\" }," - " { c : \"lector\" } ]" - " }" - "}" ); - - BSONObj indexSpec = fromjson( - "{ key : { a : \"text\", \"a.b.c\" : \"text\" }, weights : { \"a.b.c\" : 5 } }" ); - - FTSSpec spec( FTSSpec::fixSpec( indexSpec ) ); - Weights::const_iterator itt = spec.weights().begin(); - ASSERT( itt != spec.weights().end() ); - ASSERT_EQUALS( "a", itt->first ); - ASSERT_EQUALS( 1, itt->second ); - ++itt; - ASSERT( itt != spec.weights().end() ); - ASSERT_EQUALS( "a.b.c", itt->first ); - ASSERT_EQUALS( 5, itt->second ); - - FTSElementIterator it( spec, obj ); - - ASSERT( it.more() ); - FTSIteratorValue val = it.next(); - ASSERT_EQUALS( "foredrag", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "foredragsholder", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "lector", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - } - - // Multi-language : test nested arrays - TEST( FTSElementIterator, Test4 ) { - - BSONObj obj = fromjson( - "{ language : \"english\"," - " a : [" - " { language : \"danish\"," - " b :" - " [ { c : [\"foredrag\"] }," - " { c : [\"foredragsholder\"] }," - " { c : [\"lector\"] } ]" - " } ]" - "}" ); - - BSONObj indexSpec = fromjson( - "{ key : { \"a.b.c\" : \"text\" }, weights : { \"a.b.c\" : 5 } }" ); - - FTSSpec spec( FTSSpec::fixSpec( indexSpec ) ); - FTSElementIterator it( spec, obj ); - - ASSERT( it.more() ); - FTSIteratorValue val = it.next(); - ASSERT_EQUALS( "foredrag", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "foredragsholder", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "lector", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - } - - // Multi-language : test wildcard spec - TEST( FTSElementIterator, Test5 ) { - - BSONObj obj = fromjson( - "{ language : \"english\"," - " b : \"these boots were made for walking\"," - " c : { e: \"I walked half way to the market before seeing the sunrise\" }," - " d : " - " { language : \"danish\"," - " e :" - " [ { f : \"foredrag\", g : 12 }," - " { f : \"foredragsholder\", g : 13 }," - " { f : \"lector\", g : 14 } ]" - " }" - "}" ); - - BSONObj indexSpec = fromjson( - "{ key : { a : \"text\" }, weights : { b : 20, c : 10, \"d.e.f\" : 5 } }" ); - - FTSSpec spec( FTSSpec::fixSpec( indexSpec ) ); - FTSElementIterator it( spec, obj ); - - ASSERT( it.more() ); - FTSIteratorValue val = it.next(); - ASSERT_EQUALS( "these boots were made for walking", string(val._text) ); - ASSERT_EQUALS( "english", val._language->str() ); - ASSERT_EQUALS( 20, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "foredrag", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "foredragsholder", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "lector", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - } - - // Multi-language : test wildcard spec - TEST( FTSElementIterator, Test6 ) { - - BSONObj obj = fromjson( - "{ language : \"english\"," - " b : \"these boots were made for walking\"," - " c : { e: \"I walked half way to the market before seeing the sunrise\" }," - " d : " - " { language : \"danish\"," - " e :" - " [ { f : \"foredrag\", g : 12 }," - " { f : \"foredragsholder\", g : 13 }," - " { f : \"lector\", g : 14 } ]" - " }" - "}" ); - - BSONObj indexSpec = fromjson( - "{ key : { a : \"text\" }, weights : { b : 20, c : 10, \"d.e.f\" : 5 } }" ); - - FTSSpec spec( FTSSpec::fixSpec( indexSpec ) ); - FTSElementIterator it( spec, obj ); - - ASSERT( it.more() ); - FTSIteratorValue val = it.next(); - ASSERT_EQUALS( "these boots were made for walking", string(val._text) ); - ASSERT_EQUALS( "english", val._language->str() ); - ASSERT_EQUALS( 20, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "foredrag", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "foredragsholder", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - - ASSERT( it.more() ); - val = it.next(); - ASSERT_EQUALS( "lector", string(val._text) ); - ASSERT_EQUALS( "danish", val._language->str() ); - ASSERT_EQUALS( 5, val._weight ); - } - } +namespace fts { + +using std::string; + +TEST(FTSElementIterator, Test1) { + BSONObj obj = fromjson( + "{ b : \"walking\"," + " c : { e: \"walked\" }," + " d : \"walker\"" + " }"); + + BSONObj indexSpec = fromjson("{ key : { a : \"text\" }, weights : { b : 10, d : 5 } }"); + + FTSSpec spec(FTSSpec::fixSpec(indexSpec)); + Weights::const_iterator itt = spec.weights().begin(); + ASSERT(itt != spec.weights().end()); + ASSERT_EQUALS("a", itt->first); + ASSERT_EQUALS(1, itt->second); + ++itt; + ASSERT(itt != spec.weights().end()); + ASSERT_EQUALS("b", itt->first); + ASSERT_EQUALS(10, itt->second); + ++itt; + ASSERT(itt != spec.weights().end()); + ASSERT_EQUALS("d", itt->first); + ASSERT_EQUALS(5, itt->second); + ++itt; + + FTSElementIterator it(spec, obj); + + ASSERT(it.more()); + FTSIteratorValue val = it.next(); + ASSERT_EQUALS("walking", string(val._text)); + ASSERT_EQUALS("english", val._language->str()); + ASSERT_EQUALS(10, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("walker", string(val._text)); + ASSERT_EQUALS("english", val._language->str()); + ASSERT_EQUALS(5, val._weight); } +// Multi-language : test +TEST(FTSElementIterator, Test2) { + 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\" } }"); + + 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(1, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("camminato", string(val._text)); + ASSERT_EQUALS("italian", val._language->str()); + 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(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(1, val._weight); +} + +// Multi-language : test nested stemming per sub-document +TEST(FTSElementIterator, Test3) { + BSONObj obj = fromjson( + "{ language : \"english\"," + " a :" + " { language : \"danish\"," + " b :" + " [ { c : \"foredrag\" }," + " { c : \"foredragsholder\" }," + " { c : \"lector\" } ]" + " }" + "}"); + + BSONObj indexSpec = + fromjson("{ key : { a : \"text\", \"a.b.c\" : \"text\" }, weights : { \"a.b.c\" : 5 } }"); + + FTSSpec spec(FTSSpec::fixSpec(indexSpec)); + Weights::const_iterator itt = spec.weights().begin(); + ASSERT(itt != spec.weights().end()); + ASSERT_EQUALS("a", itt->first); + ASSERT_EQUALS(1, itt->second); + ++itt; + ASSERT(itt != spec.weights().end()); + ASSERT_EQUALS("a.b.c", itt->first); + ASSERT_EQUALS(5, itt->second); + + FTSElementIterator it(spec, obj); + + ASSERT(it.more()); + FTSIteratorValue val = it.next(); + ASSERT_EQUALS("foredrag", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("foredragsholder", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("lector", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); +} + +// Multi-language : test nested arrays +TEST(FTSElementIterator, Test4) { + BSONObj obj = fromjson( + "{ language : \"english\"," + " a : [" + " { language : \"danish\"," + " b :" + " [ { c : [\"foredrag\"] }," + " { c : [\"foredragsholder\"] }," + " { c : [\"lector\"] } ]" + " } ]" + "}"); + + BSONObj indexSpec = fromjson("{ key : { \"a.b.c\" : \"text\" }, weights : { \"a.b.c\" : 5 } }"); + + FTSSpec spec(FTSSpec::fixSpec(indexSpec)); + FTSElementIterator it(spec, obj); + + ASSERT(it.more()); + FTSIteratorValue val = it.next(); + ASSERT_EQUALS("foredrag", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("foredragsholder", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("lector", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); +} + +// Multi-language : test wildcard spec +TEST(FTSElementIterator, Test5) { + BSONObj obj = fromjson( + "{ language : \"english\"," + " b : \"these boots were made for walking\"," + " c : { e: \"I walked half way to the market before seeing the sunrise\" }," + " d : " + " { language : \"danish\"," + " e :" + " [ { f : \"foredrag\", g : 12 }," + " { f : \"foredragsholder\", g : 13 }," + " { f : \"lector\", g : 14 } ]" + " }" + "}"); + + BSONObj indexSpec = + fromjson("{ key : { a : \"text\" }, weights : { b : 20, c : 10, \"d.e.f\" : 5 } }"); + + FTSSpec spec(FTSSpec::fixSpec(indexSpec)); + FTSElementIterator it(spec, obj); + + ASSERT(it.more()); + FTSIteratorValue val = it.next(); + ASSERT_EQUALS("these boots were made for walking", string(val._text)); + ASSERT_EQUALS("english", val._language->str()); + ASSERT_EQUALS(20, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("foredrag", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("foredragsholder", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("lector", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); +} + +// Multi-language : test wildcard spec +TEST(FTSElementIterator, Test6) { + BSONObj obj = fromjson( + "{ language : \"english\"," + " b : \"these boots were made for walking\"," + " c : { e: \"I walked half way to the market before seeing the sunrise\" }," + " d : " + " { language : \"danish\"," + " e :" + " [ { f : \"foredrag\", g : 12 }," + " { f : \"foredragsholder\", g : 13 }," + " { f : \"lector\", g : 14 } ]" + " }" + "}"); + + BSONObj indexSpec = + fromjson("{ key : { a : \"text\" }, weights : { b : 20, c : 10, \"d.e.f\" : 5 } }"); + + FTSSpec spec(FTSSpec::fixSpec(indexSpec)); + FTSElementIterator it(spec, obj); + + ASSERT(it.more()); + FTSIteratorValue val = it.next(); + ASSERT_EQUALS("these boots were made for walking", string(val._text)); + ASSERT_EQUALS("english", val._language->str()); + ASSERT_EQUALS(20, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("foredrag", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("foredragsholder", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); + + ASSERT(it.more()); + val = it.next(); + ASSERT_EQUALS("lector", string(val._text)); + ASSERT_EQUALS("danish", val._language->str()); + ASSERT_EQUALS(5, val._weight); +} +} +} |