From 746ab5973d30af22b7c9ebe6ef060997e32f17ff Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Fri, 13 May 2016 20:24:17 +0300 Subject: [PATCH] Review fixes. --- indexer/search_delimiters.cpp | 22 ++++++------ .../search_query_v2_test.cpp | 35 +++++++++++++++---- search/search_query.cpp | 24 ++++++------- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/indexer/search_delimiters.cpp b/indexer/search_delimiters.cpp index 5bbdb66db7..954e3792a6 100644 --- a/indexer/search_delimiters.cpp +++ b/indexer/search_delimiters.cpp @@ -19,40 +19,40 @@ bool Delimiters::operator()(strings::UniChar c) const switch (c) { case 0x2116: // NUMERO SIGN - // case 0x00B0: // DEGREE SIGN + // case 0x00B0: // DEGREE SIGN case 0x2013: // EN DASH case 0x2019: // RIGHT SINGLE QUOTATION MARK case 0x00AB: // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK case 0x00BB: // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK case 0x3000: // IDEOGRAPHIC SPACE case 0x30FB: // KATAKANA MIDDLE DOT - // case 0x00B4: // ACUTE ACCENT + // case 0x00B4: // ACUTE ACCENT case 0x200E: // LEFT-TO-RIGHT MARK case 0xFF08: // FULLWIDTH LEFT PARENTHESIS - // case 0x00A0: // NO-BREAK SPACE + // case 0x00A0: // NO-BREAK SPACE case 0xFF09: // FULLWIDTH RIGHT PARENTHESIS case 0x2018: // LEFT SINGLE QUOTATION MARK - // case 0x007E: // TILDE + // case 0x007E: // TILDE case 0x2014: // EM DASH - // case 0x007C: // VERTICAL LINE + // case 0x007C: // VERTICAL LINE case 0x0F0B: // TIBETAN MARK INTERSYLLABIC TSHEG case 0x201C: // LEFT DOUBLE QUOTATION MARK case 0x201E: // DOUBLE LOW-9 QUOTATION MARK - // case 0x00AE: // REGISTERED SIGN + // case 0x00AE: // REGISTERED SIGN case 0xFFFD: // REPLACEMENT CHARACTER case 0x200C: // ZERO WIDTH NON-JOINER case 0x201D: // RIGHT DOUBLE QUOTATION MARK case 0x3001: // IDEOGRAPHIC COMMA case 0x300C: // LEFT CORNER BRACKET case 0x300D: // RIGHT CORNER BRACKET - // case 0x00B7: // MIDDLE DOT + // case 0x00B7: // MIDDLE DOT case 0x061F: // ARABIC QUESTION MARK case 0x2192: // RIGHTWARDS ARROW case 0x2212: // MINUS SIGN - // case 0x0091: // - // case 0x007D: // RIGHT CURLY BRACKET - // case 0x007B: // LEFT CURLY BRACKET - // case 0x00A9: // COPYRIGHT SIGN + // case 0x0091: // + // case 0x007D: // RIGHT CURLY BRACKET + // case 0x007B: // LEFT CURLY BRACKET + // case 0x00A9: // COPYRIGHT SIGN case 0x200D: // ZERO WIDTH JOINER case 0x200B: // ZERO WIDTH SPACE return true; diff --git a/search/search_integration_tests/search_query_v2_test.cpp b/search/search_integration_tests/search_query_v2_test.cpp index b35a70c81b..01b05d4a27 100644 --- a/search/search_integration_tests/search_query_v2_test.cpp +++ b/search/search_integration_tests/search_query_v2_test.cpp @@ -465,8 +465,11 @@ UNIT_CLASS_TEST(SearchQueryV2Test, TestCategories) TestCity sanFrancisco(m2::PointD(0, 0), "San Francisco", "en", 100 /* rank */); - TestPOI atm(m2::PointD(0, 0), "", "en"); - atm.SetTypes({{"amenity", "atm"}}); + TestPOI noname(m2::PointD(0, 0), "", "en"); + noname.SetTypes({{"amenity", "atm"}}); + + TestPOI named(m2::PointD(0.0001, 0.0001), "ATM", "en"); + named.SetTypes({{"amenity", "atm"}}); BuildWorld([&](TestMwmBuilder & builder) { @@ -474,14 +477,34 @@ UNIT_CLASS_TEST(SearchQueryV2Test, TestCategories) }); auto wonderlandId = BuildCountry(countryName, [&](TestMwmBuilder & builder) { - builder.Add(atm); + builder.Add(named); + builder.Add(noname); }); SetViewport(m2::RectD(m2::PointD(-0.5, -0.5), m2::PointD(0.5, 0.5))); + TRules rules = {ExactMatch(wonderlandId, noname), ExactMatch(wonderlandId, named)}; + + TEST(ResultsMatch("atm", rules), ()); + { - TRules rules = {ExactMatch(wonderlandId, atm)}; - TEST(ResultsMatch("atm", rules), ()); - TEST(ResultsMatch("#atm", rules), ()); + SearchParams params; + MakeDefaultTestParams("#atm", params); + + TestSearchRequest request(m_engine, params, m_viewport); + request.Wait(); + + TEST(MatchResults(m_engine, rules, request.Results()), ()); + for (auto const & result : request.Results()) + { + auto const & info = result.GetRankingInfo(); + + // Token with a hashtag should not participate in name-score + // calculations. + TEST_EQUAL(NAME_SCORE_ZERO, info.m_nameScore, (result)); + + // TODO (@y): fix this. Name coverage calculations are flawed. + // TEST(my::AlmostEqualAbs(0.0, info.m_nameCoverage, 1e-6), (info.m_nameCoverage)); + } } } } // namespace diff --git a/search/search_query.cpp b/search/search_query.cpp index e57deb14d4..4649501c41 100644 --- a/search/search_query.cpp +++ b/search/search_query.cpp @@ -207,11 +207,11 @@ void UpdateNameScore(vector const & tokens, TSlice const & s } } -inline bool IsHashed(strings::UniString const & s) { return !s.empty() && s[0] == '#'; } +inline bool IsHashtagged(strings::UniString const & s) { return !s.empty() && s[0] == '#'; } -inline strings::UniString RemoveHash(strings::UniString const & s) +inline strings::UniString RemoveHashtag(strings::UniString const & s) { - if (IsHashed(s)) + if (IsHashtagged(s)) return strings::UniString(s.begin() + 1, s.end()); return s; } @@ -430,7 +430,7 @@ void Query::ForEachCategoryTypes(ToDo toDo) const for (size_t i = 0; i < tokensCount; ++i) { - auto token = RemoveHash(m_tokens[i]); + auto token = RemoveHashtag(m_tokens[i]); for (int j = 0; j < localesCount; ++j) m_categories.ForEachTypeByName(arrLocales[j], token, bind(ref(toDo), i, _1)); @@ -439,7 +439,7 @@ void Query::ForEachCategoryTypes(ToDo toDo) const if (!m_prefix.empty()) { - auto prefix = RemoveHash(m_prefix); + auto prefix = RemoveHashtag(m_prefix); for (int j = 0; j < localesCount; ++j) m_categories.ForEachTypeByName(arrLocales[j], prefix, bind(ref(toDo), tokensCount, _1)); @@ -470,9 +470,9 @@ void Query::SetQuery(string const & query) ASSERT(m_prefix.empty(), ()); // Following code splits input query by delimiters except hash tags - // first, and then splits result tokens by hash tags. The reason is - // to retrieve all tokens that starts with a single hash tag sign - // and leave them as is. + // first, and then splits result tokens by hashtags. The goal is to + // retrieve all tokens that start with a single hashtag and leave + // them as is. vector tokens; { @@ -489,8 +489,8 @@ void Query::SetQuery(string const & query) for (; numHashes < token.size() && token[numHashes] == '#'; ++numHashes) ; - // Splits |tokens[i]| by hash signs, because all other - // delimiters are already removed. + // Splits |token| by hashtags, because all other delimiters are + // already removed. subTokens.clear(); SplitUniString(token, MakeBackInsertFunctor(subTokens), delims); if (subTokens.empty()) @@ -1264,10 +1264,10 @@ void Query::InitParams(bool localitySearch, SearchQueryParams & params) for (auto & tokens : params.m_tokens) { - if (IsHashed(tokens[0])) + if (IsHashtagged(tokens[0])) tokens.erase(tokens.begin()); } - if (!params.m_prefixTokens.empty() && IsHashed(params.m_prefixTokens[0])) + if (!params.m_prefixTokens.empty() && IsHashtagged(params.m_prefixTokens[0])) params.m_prefixTokens.erase(params.m_prefixTokens.begin()); for (int i = 0; i < LANG_COUNT; ++i)