diff --git a/defines.hpp b/defines.hpp index 207e6c8ec8..26c11a403e 100644 --- a/defines.hpp +++ b/defines.hpp @@ -40,7 +40,7 @@ #define CROSS_MWM_FILE_TAG "cross_mwm" #define FEATURE_OFFSETS_FILE_TAG "offs" #define RANKS_FILE_TAG "ranks" -#define POPULAR_PLACES_FILE_TAG "popular_places" +#define POPULARITY_RANKS_FILE_TAG "popularity_ranks" #define REGION_INFO_FILE_TAG "rgninfo" #define METALINES_FILE_TAG "metalines" // Temporary addresses section that is used in search index generation. diff --git a/generator/generator_tests_support/test_mwm_builder.cpp b/generator/generator_tests_support/test_mwm_builder.cpp index d82ccfb73f..eb8717fa80 100644 --- a/generator/generator_tests_support/test_mwm_builder.cpp +++ b/generator/generator_tests_support/test_mwm_builder.cpp @@ -140,7 +140,7 @@ void TestMwmBuilder::Finish() CHECK(indexer::BuildCentersTableFromDataFile(path, true /* forceRebuild */), ("Can't build centers table.")); - CHECK(search::SearchRanksTableBuilder::CreateIfNotExists(path), ()); + CHECK(search::SearchRankTableBuilder::CreateIfNotExists(path), ()); if (!m_languages.empty()) CHECK(WriteRegionDataForTests(path, m_languages), ()); diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index e11b45d461..93639d7867 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -388,7 +388,7 @@ int main(int argc, char ** argv) LOG(LCRITICAL, ("Error generating search index.")); LOG(LINFO, ("Generating rank table for", datFile)); - if (!search::SearchRanksTableBuilder::CreateIfNotExists(datFile)) + if (!search::SearchRankTableBuilder::CreateIfNotExists(datFile)) LOG(LCRITICAL, ("Error generating rank table.")); LOG(LINFO, ("Generating centers table for", datFile)); diff --git a/generator/popular_places_section_builder.cpp b/generator/popular_places_section_builder.cpp index 21bd08e99f..20ef44a870 100644 --- a/generator/popular_places_section_builder.cpp +++ b/generator/popular_places_section_builder.cpp @@ -110,7 +110,7 @@ bool BuildPopularPlacesMwmSection(std::string const & srcFilename, std::string c return true; FilesContainerW cont(mwmFile, FileWriter::OP_WRITE_EXISTING); - search::RankTableBuilder::Create(content, cont, POPULAR_PLACES_FILE_TAG); + search::RankTableBuilder::Create(content, cont, POPULARITY_RANKS_FILE_TAG); return true; } } // namespace generator diff --git a/indexer/indexer_tests/rank_table_test.cpp b/indexer/indexer_tests/rank_table_test.cpp index 90a9731621..2be200eb2e 100644 --- a/indexer/indexer_tests/rank_table_test.cpp +++ b/indexer/indexer_tests/rank_table_test.cpp @@ -37,7 +37,7 @@ void TestTable(vector const & ranks, string const & path) // Tries to load table via file read. { FilesContainerR rcont(path); - auto table = search::RankTable::Load(rcont); + auto table = search::RankTable::Load(rcont, RANKS_FILE_TAG); TEST(table, ()); TestTable(ranks, *table); } @@ -45,7 +45,7 @@ void TestTable(vector const & ranks, string const & path) // Tries to load table via file mapping. { FilesMappingContainer mcont(path); - auto table = search::RankTable::Load(mcont); + auto table = search::RankTable::Load(mcont, RANKS_FILE_TAG); TEST(table, ()); TestTable(ranks, *table); } @@ -89,7 +89,7 @@ UNIT_TEST(RankTableBuilder_EndToEnd) vector ranks; { FilesContainerR rcont(mapPath); - search::SearchRanksTableBuilder::CalcSearchRanks(rcont, ranks); + search::SearchRankTableBuilder::CalcSearchRanks(rcont, ranks); } { @@ -119,7 +119,7 @@ UNIT_TEST(RankTableBuilder_WrongEndianness) unique_ptr table; { FilesContainerR rcont(kTestFile); - table = search::RankTable::Load(rcont); + table = search::RankTable::Load(rcont, RANKS_FILE_TAG); TEST(table.get(), ()); TestTable(ranks, *table); } @@ -139,7 +139,7 @@ UNIT_TEST(RankTableBuilder_WrongEndianness) // Try to load rank table from opposite endianness. { FilesContainerR rcont(kTestFile); - auto table = search::RankTable::Load(rcont); + auto table = search::RankTable::Load(rcont, RANKS_FILE_TAG); TEST(table.get(), ()); TestTable(ranks, *table); } @@ -147,12 +147,12 @@ UNIT_TEST(RankTableBuilder_WrongEndianness) // It's impossible to map rank table from opposite endianness. { FilesMappingContainer mcont(kTestFile); - auto table = search::RankTable::Load(mcont); + auto table = search::RankTable::Load(mcont, RANKS_FILE_TAG); TEST(!table.get(), ()); } // Try to re-create rank table in test file. - TEST(search::SearchRanksTableBuilder::CreateIfNotExists(kTestFile), ()); + TEST(search::SearchRankTableBuilder::CreateIfNotExists(kTestFile), ()); // Try to load and map rank table - both methods should work now. TestTable(ranks, kTestFile); diff --git a/indexer/rank_table.cpp b/indexer/rank_table.cpp index 62a11b8dbc..b275f321c5 100644 --- a/indexer/rank_table.cpp +++ b/indexer/rank_table.cpp @@ -287,7 +287,7 @@ unique_ptr CreateRankTableIfNotExists(FilesContainerR & rcont) if (!table) { vector ranks; - SearchRanksTableBuilder::CalcSearchRanks(rcont, ranks); + SearchRankTableBuilder::CalcSearchRanks(rcont, ranks); table = make_unique(ranks); } @@ -296,19 +296,19 @@ unique_ptr CreateRankTableIfNotExists(FilesContainerR & rcont) } // namespace // static -unique_ptr RankTable::Load(FilesContainerR const & rcont) +unique_ptr RankTable::Load(FilesContainerR const & rcont, string const & sectionName) { - return LoadRankTable(GetMemoryRegionForTag(rcont, RANKS_FILE_TAG)); + return LoadRankTable(GetMemoryRegionForTag(rcont, sectionName)); } // static -unique_ptr RankTable::Load(FilesMappingContainer const & mcont) +unique_ptr RankTable::Load(FilesMappingContainer const & mcont, string const & sectionName) { - return LoadRankTable(GetMemoryRegionForTag(mcont, RANKS_FILE_TAG)); + return LoadRankTable(GetMemoryRegionForTag(mcont, sectionName)); } // static -void SearchRanksTableBuilder::CalcSearchRanks(FilesContainerR & rcont, vector & ranks) +void SearchRankTableBuilder::CalcSearchRanks(FilesContainerR & rcont, vector & ranks) { feature::DataHeader header(rcont); FeaturesVector featuresVector(rcont, header, nullptr /* features offsets table */); @@ -320,7 +320,7 @@ void SearchRanksTableBuilder::CalcSearchRanks(FilesContainerR & rcont, vector Load(FilesContainerR const & rcont); + static std::unique_ptr Load(FilesContainerR const & rcont, + std::string const & sectionName); // Maps whole section corresponding to a rank table and deserializes // it. Returns nullptr if there're no ranks section, rank table's @@ -81,7 +82,8 @@ public: // destructed before |mcont| is closed. Also note that there're // undefined behaviour if ranks section exists but internally // damaged. - static std::unique_ptr Load(FilesMappingContainer const & mcont); + static std::unique_ptr Load(FilesMappingContainer const & mcont, + std::string const & sectionName); }; // A builder class for rank tables. @@ -95,7 +97,7 @@ public: std::string const & sectionName); }; -class SearchRanksTableBuilder +class SearchRankTableBuilder { public: // Calculates search ranks for all features in an mwm. diff --git a/search/geocoder.cpp b/search/geocoder.cpp index 69b98d5050..941e53eb49 100644 --- a/search/geocoder.cpp +++ b/search/geocoder.cpp @@ -145,7 +145,7 @@ private: { if (m_table) return; - m_table = search::RankTable::Load(m_value.m_cont); + m_table = search::RankTable::Load(m_value.m_cont, RANKS_FILE_TAG); if (!m_table) m_table = make_unique(); } diff --git a/search/intermediate_result.hpp b/search/intermediate_result.hpp index 15f0c97658..8b5b10de6b 100644 --- a/search/intermediate_result.hpp +++ b/search/intermediate_result.hpp @@ -34,11 +34,12 @@ public: static bool LessRank(PreRankerResult const & r1, PreRankerResult const & r2); static bool LessDistance(PreRankerResult const & r1, PreRankerResult const & r2); - inline FeatureID GetId() const { return m_id; } - inline double GetDistance() const { return m_info.m_distanceToPivot; } - inline uint8_t GetRank() const { return m_info.m_rank; } - inline PreRankingInfo & GetInfo() { return m_info; } - inline PreRankingInfo const & GetInfo() const { return m_info; } + FeatureID GetId() const { return m_id; } + double GetDistance() const { return m_info.m_distanceToPivot; } + uint8_t GetRank() const { return m_info.m_rank; } + uint8_t GetPopularity() const { return m_info.m_popularity; } + PreRankingInfo & GetInfo() { return m_info; } + PreRankingInfo const & GetInfo() const { return m_info; } private: friend class RankerResult; diff --git a/search/locality_finder.cpp b/search/locality_finder.cpp index 52e9b2f977..bbe5c9354e 100644 --- a/search/locality_finder.cpp +++ b/search/locality_finder.cpp @@ -243,7 +243,7 @@ void LocalityFinder::LoadVicinity(m2::PointD const & p, bool loadCities, bool lo { auto const & value = *handle.GetValue(); if (!m_ranks) - m_ranks = RankTable::Load(value.m_cont); + m_ranks = RankTable::Load(value.m_cont, RANKS_FILE_TAG); if (!m_ranks) m_ranks = make_unique(); diff --git a/search/pre_ranker.cpp b/search/pre_ranker.cpp index d1a9cdf107..6648c59f3b 100644 --- a/search/pre_ranker.cpp +++ b/search/pre_ranker.cpp @@ -71,6 +71,7 @@ void PreRanker::FillMissingFieldsInPreResults() MwmSet::MwmId mwmId; MwmSet::MwmHandle mwmHandle; unique_ptr ranks = make_unique(); + unique_ptr popularityRanks = make_unique(); unique_ptr centers; m_pivotFeatures.SetPosition(m_params.m_accuratePivotCenter, m_params.m_scale); @@ -86,7 +87,9 @@ void PreRanker::FillMissingFieldsInPreResults() centers.reset(); if (mwmHandle.IsAlive()) { - ranks = RankTable::Load(mwmHandle.GetValue()->m_cont); + ranks = RankTable::Load(mwmHandle.GetValue()->m_cont, RANKS_FILE_TAG); + popularityRanks = RankTable::Load(mwmHandle.GetValue()->m_cont, + POPULARITY_RANKS_FILE_TAG); centers = make_unique(*mwmHandle.GetValue()); } if (!ranks) @@ -94,6 +97,8 @@ void PreRanker::FillMissingFieldsInPreResults() } info.m_rank = ranks->Get(id.m_index); + if (popularityRanks) + info.m_popularity = popularityRanks->Get(id.m_index); m2::PointD center; if (centers && centers->Get(id.m_index, center)) diff --git a/search/pre_ranking_info.cpp b/search/pre_ranking_info.cpp index c3df59e300..2b05f68d5c 100644 --- a/search/pre_ranking_info.cpp +++ b/search/pre_ranking_info.cpp @@ -18,6 +18,7 @@ std::string DebugPrint(PreRankingInfo const & info) os << "m_tokenRange[" << DebugPrint(type) << "]:" << DebugPrint(info.m_tokenRange[i]) << ","; } os << "m_rank:" << static_cast(info.m_rank) << ","; + os << "m_popularity:" << static_cast(info.m_popularity) << ","; os << "m_type:" << info.m_type; os << "]"; return os.str(); diff --git a/search/pre_ranking_info.hpp b/search/pre_ranking_info.hpp index 36cd702a94..b19a76dd1d 100644 --- a/search/pre_ranking_info.hpp +++ b/search/pre_ranking_info.hpp @@ -56,6 +56,9 @@ struct PreRankingInfo // Rank of the feature. uint8_t m_rank = 0; + // Popularity rank of the feature. + uint8_t m_popularity = 0; + // Search type for the feature. Model::Type m_type = Model::TYPE_COUNT; }; diff --git a/search/rank_table_cache.cpp b/search/rank_table_cache.cpp index b91087b7de..109f16dcc2 100644 --- a/search/rank_table_cache.cpp +++ b/search/rank_table_cache.cpp @@ -14,7 +14,7 @@ RankTable const & RankTableCache::Get(DataSource & dataSource, TId const & mwmId return *it->second; TKey handle(dataSource.GetMwmHandleById(mwmId)); - auto table = RankTable::Load(handle.GetValue()->m_cont); + auto table = RankTable::Load(handle.GetValue()->m_cont, RANKS_FILE_TAG); if (!table) table.reset(new DummyRankTable()); diff --git a/search/ranker.cpp b/search/ranker.cpp index d0e7e3744c..2d679db1bc 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -259,6 +259,7 @@ class RankerResultMaker info.m_distanceToPivot = MercatorBounds::DistanceOnEarth(center, pivot); info.m_rank = preInfo.m_rank; + info.m_popularity = preInfo.m_popularity; info.m_type = preInfo.m_type; info.m_allTokensUsed = preInfo.m_allTokensUsed; diff --git a/search/ranking_info.cpp b/search/ranking_info.cpp index fa884e0579..57c72d8d8a 100644 --- a/search/ranking_info.cpp +++ b/search/ranking_info.cpp @@ -48,6 +48,7 @@ void RankingInfo::PrintCSVHeader(ostream & os) { os << "DistanceToPivot" << ",Rank" + << ",Popularity" << ",NameScore" << ",ErrorsMade" << ",SearchType" @@ -62,6 +63,7 @@ string DebugPrint(RankingInfo const & info) os << "RankingInfo ["; os << "m_distanceToPivot:" << info.m_distanceToPivot << ","; os << "m_rank:" << static_cast(info.m_rank) << ","; + os << "m_popularity:" << static_cast(info.m_popularity) << ","; os << "m_nameScore:" << DebugPrint(info.m_nameScore) << ","; os << "m_errorsMade:" << DebugPrint(info.m_errorsMade) << ","; os << "m_type:" << DebugPrint(info.m_type) << ","; @@ -77,6 +79,7 @@ void RankingInfo::ToCSV(ostream & os) const os << fixed; os << m_distanceToPivot << ","; os << static_cast(m_rank) << ","; + os << static_cast(m_popularity) << ","; os << DebugPrint(m_nameScore) << ","; os << GetErrorsMade() << ","; os << DebugPrint(m_type) << ","; diff --git a/search/ranking_info.hpp b/search/ranking_info.hpp index efe7da45b7..da8e86f9bd 100644 --- a/search/ranking_info.hpp +++ b/search/ranking_info.hpp @@ -23,6 +23,9 @@ struct RankingInfo // Rank of the feature. uint8_t m_rank = 0; + // Popularity rank of the feature. + uint8_t m_popularity = 0; + // Score for the feature's name. NameScore m_nameScore = NAME_SCORE_ZERO; diff --git a/search/result.cpp b/search/result.cpp index 23f0c59ff7..28c0392f7a 100644 --- a/search/result.cpp +++ b/search/result.cpp @@ -274,6 +274,11 @@ void Results::InsertResult(vector::iterator where, Result && result) m_results.insert(where, move(result)); } +std::string DebugPrint(search::Results const & results) +{ + return ::my::impl::DebugPrintSequence(results.begin(), results.end()); +} + // AddressInfo ------------------------------------------------------------------------------------- bool AddressInfo::IsEmptyName() const { diff --git a/search/result.hpp b/search/result.hpp index f8b06190bd..379b965f76 100644 --- a/search/result.hpp +++ b/search/result.hpp @@ -246,6 +246,8 @@ private: HotelsClassifier m_hotelsClassif; }; +std::string DebugPrint(search::Results const & results); + struct AddressInfo { enum class Type { Default, SearchResult };