From 0bda46a66d621c6df7fa024f2b15eb436760bcd7 Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Fri, 19 Apr 2019 16:21:39 +0300 Subject: [PATCH] [generator] Change feature id to osm id mapping type from uint32_t->vector to uint32_t->GeoObjectId --- generator/cities_boundaries_builder.cpp | 16 ++++++---------- generator/descriptions_section_builder.cpp | 4 ++-- generator/descriptions_section_builder.hpp | 3 +-- generator/popular_places_section_builder.cpp | 6 +++--- generator/ratings_section_builder.cpp | 11 +++++------ generator/ugc_section_builder.cpp | 9 +++++---- generator/utils.cpp | 16 ++++++++-------- generator/utils.hpp | 6 ++---- 8 files changed, 32 insertions(+), 39 deletions(-) diff --git a/generator/cities_boundaries_builder.cpp b/generator/cities_boundaries_builder.cpp index 4466ba5c2a..fb587e30be 100644 --- a/generator/cities_boundaries_builder.cpp +++ b/generator/cities_boundaries_builder.cpp @@ -39,8 +39,7 @@ namespace generator { namespace { -bool ParseFeatureIdToTestIdMapping(string const & path, - unordered_map> & mapping) +bool ParseFeatureIdToTestIdMapping(string const & path, unordered_map & mapping) { bool success = true; feature::ForEachFromDat(path, [&](FeatureType & feature, uint32_t fid) { @@ -53,7 +52,7 @@ bool ParseFeatureIdToTestIdMapping(string const & path, success = false; return; } - mapping[fid].push_back(tid); + mapping.emplace(fid, tid); }); return success; } @@ -86,11 +85,8 @@ bool BuildCitiesBoundaries(string const & dataPath, BoundariesTable & table, auto it = mapping->find(base::asserted_cast(fid)); if (it != mapping->end()) { - for (auto const & id : it->second) - { - auto const & b = table.Get(id); - bs.insert(bs.end(), b.begin(), b.end()); - } + auto const & b = table.Get(it->second); + bs.insert(bs.end(), b.begin(), b.end()); } all.emplace_back(move(bs)); @@ -107,7 +103,7 @@ bool BuildCitiesBoundaries(string const & dataPath, BoundariesTable & table, bool BuildCitiesBoundaries(string const & dataPath, string const & osmToFeaturePath, OsmIdToBoundariesTable & table) { - using Mapping = unordered_map>; + using Mapping = unordered_map; return BuildCitiesBoundaries(dataPath, table, [&]() -> unique_ptr { Mapping mapping; @@ -122,7 +118,7 @@ bool BuildCitiesBoundaries(string const & dataPath, string const & osmToFeatureP bool BuildCitiesBoundariesForTesting(string const & dataPath, TestIdToBoundariesTable & table) { - using Mapping = unordered_map>; + using Mapping = unordered_map; return BuildCitiesBoundaries(dataPath, table, [&]() -> unique_ptr { Mapping mapping; diff --git a/generator/descriptions_section_builder.cpp b/generator/descriptions_section_builder.cpp index b5150090cb..300f46db9e 100644 --- a/generator/descriptions_section_builder.cpp +++ b/generator/descriptions_section_builder.cpp @@ -55,10 +55,10 @@ WikidataHelper::WikidataHelper(std::string const & mwmPath, std::string const & boost::optional WikidataHelper::GetWikidataId(uint32_t featureId) const { auto const itFeatureIdToOsmId = m_featureIdToOsmId.find(featureId); - if (itFeatureIdToOsmId == std::end(m_featureIdToOsmId) || itFeatureIdToOsmId->second.size() == 0) + if (itFeatureIdToOsmId == std::end(m_featureIdToOsmId)) return {}; - auto const osmId = itFeatureIdToOsmId->second[0]; + auto const osmId = itFeatureIdToOsmId->second; auto const itOsmIdToWikidataId = m_osmIdToWikidataId.find(osmId); return itOsmIdToWikidataId == std::end(m_osmIdToWikidataId) ? boost::optional() : itOsmIdToWikidataId->second; diff --git a/generator/descriptions_section_builder.hpp b/generator/descriptions_section_builder.hpp index b0ffe07fd9..5bbb3f56e5 100644 --- a/generator/descriptions_section_builder.hpp +++ b/generator/descriptions_section_builder.hpp @@ -24,7 +24,6 @@ #include #include #include -#include #include @@ -46,7 +45,7 @@ public: private: std::string m_mwmPath; std::string m_idToWikidataPath; - std::unordered_map> m_featureIdToOsmId; + std::unordered_map m_featureIdToOsmId; std::unordered_map m_osmIdToWikidataId; }; diff --git a/generator/popular_places_section_builder.cpp b/generator/popular_places_section_builder.cpp index 3623531b02..b0d6ee5fe2 100644 --- a/generator/popular_places_section_builder.cpp +++ b/generator/popular_places_section_builder.cpp @@ -71,7 +71,7 @@ bool BuildPopularPlacesMwmSection(std::string const & srcFilename, std::string c LOG(LINFO, ("Build Popular Places section")); - std::unordered_map> featureIdToOsmId; + std::unordered_map featureIdToOsmId; if (!ParseFeatureIdToOsmIdMapping(osmToFeatureFilename, featureIdToOsmId)) return false; @@ -88,9 +88,9 @@ bool BuildPopularPlacesMwmSection(std::string const & srcFilename, std::string c PopularityIndex rank = 0; auto const it = featureIdToOsmId.find(featureId); // Non-OSM features (coastlines, sponsored objects) are not used. - if (it != featureIdToOsmId.cend() && it->second.size() != 0) + if (it != featureIdToOsmId.cend()) { - auto const placesIt = places.find(it->second[0]); + auto const placesIt = places.find(it->second); if (placesIt != places.cend()) { diff --git a/generator/ratings_section_builder.cpp b/generator/ratings_section_builder.cpp index 5639b1e569..789ed9baed 100644 --- a/generator/ratings_section_builder.cpp +++ b/generator/ratings_section_builder.cpp @@ -24,7 +24,7 @@ bool BuildRatingsMwmSection(std::string const & srcDbFilename, std::string const { LOG(LINFO, ("Build Ratings section")); - std::unordered_map> featureToOsmId; + std::unordered_map featureToOsmId; if (!ParseFeatureIdToOsmIdMapping(osmToFeatureFilename, featureToOsmId)) return false; @@ -34,12 +34,11 @@ bool BuildRatingsMwmSection(std::string const & srcDbFilename, std::string const uint8_t constexpr kNoRating = 0; feature::ForEachFromDat(mwmFile, [&](FeatureType & f, uint32_t featureId) { - auto const it = featureToOsmId.find(featureId); - CHECK(it != featureToOsmId.cend() && !it->second.empty(), - ("FeatureID", featureId, "is not found in", osmToFeatureFilename)); - ugc::UGC ugc; - if (GetUgcForFeature(it->second[0], feature::TypesHolder(f), translator, ugc)) + auto const it = featureToOsmId.find(featureId); + // Non-OSM features (coastlines, sponsored objects) are not used. + if (it != featureToOsmId.cend() && + GetUgcForFeature(it->second, feature::TypesHolder(f), translator, ugc)) { content.emplace_back(ugc.GetPackedRating()); haveUgc = true; diff --git a/generator/ugc_section_builder.cpp b/generator/ugc_section_builder.cpp index 43cf93e032..6641bf1b7f 100644 --- a/generator/ugc_section_builder.cpp +++ b/generator/ugc_section_builder.cpp @@ -24,7 +24,7 @@ bool BuildUgcMwmSection(std::string const & srcDbFilename, std::string const & m LOG(LINFO, ("Build UGC section")); - std::unordered_map> featureToOsmId; + std::unordered_map featureToOsmId; if (!ParseFeatureIdToOsmIdMapping(osmToFeatureFilename, featureToOsmId)) return false; @@ -34,11 +34,12 @@ bool BuildUgcMwmSection(std::string const & srcDbFilename, std::string const & m feature::ForEachFromDat(mwmFile, [&](FeatureType & f, uint32_t featureId) { auto const it = featureToOsmId.find(featureId); - CHECK(it != featureToOsmId.cend() && it->second.size() != 0, - ("FeatureID", featureId, "is not found in", osmToFeatureFilename)); + // Non-OSM features (coastlines, sponsored objects) are not used. + if (it == featureToOsmId.cend()) + return; ugc::UGC result; - if (!GetUgcForFeature(it->second[0], feature::TypesHolder(f), translator, result)) + if (!GetUgcForFeature(it->second, feature::TypesHolder(f), translator, result)) return; content.emplace_back(featureId, result); diff --git a/generator/utils.cpp b/generator/utils.cpp index e2bc64ce74..f882b00253 100644 --- a/generator/utils.cpp +++ b/generator/utils.cpp @@ -7,6 +7,8 @@ #include "base/assert.hpp" #include "base/logging.hpp" +#include + namespace generator { // SingleMwmDataSource ----------------------------------------------------------------------------- @@ -26,7 +28,7 @@ SingleMwmDataSource::SingleMwmDataSource(std::string const & mwmPath) void LoadDataSource(DataSource & dataSource) { - vector localFiles; + std::vector localFiles; Platform & platform = GetPlatform(); platform::FindAllLocalMapsInDirectoryAndCleanup(platform.WritableDir(), 0 /* version */, @@ -45,13 +47,11 @@ void LoadDataSource(DataSource & dataSource) } } -bool ParseFeatureIdToOsmIdMapping( - std::string const & path, - std::unordered_map> & mapping) +bool ParseFeatureIdToOsmIdMapping(std::string const & path, + std::unordered_map & mapping) { - return ForEachOsmId2FeatureId(path, - [&](base::GeoObjectId const & osmId, uint32_t const featureId) { - mapping[featureId].push_back(osmId); - }); + return ForEachOsmId2FeatureId(path, [&](base::GeoObjectId const & osmId, uint32_t const featureId) { + CHECK(mapping.emplace(featureId, osmId).second, ("Several osm ids for feature", featureId, "in file", path)); + }); } } // namespace generator diff --git a/generator/utils.hpp b/generator/utils.hpp index ae0a915e1d..a02fc3f83f 100644 --- a/generator/utils.hpp +++ b/generator/utils.hpp @@ -17,7 +17,6 @@ #include #include #include -#include namespace generator { @@ -63,7 +62,6 @@ bool ForEachOsmId2FeatureId(std::string const & path, ToDo && toDo) return true; } -bool ParseFeatureIdToOsmIdMapping( - std::string const & path, - std::unordered_map> & mapping); +bool ParseFeatureIdToOsmIdMapping(std::string const & path, + std::unordered_map & mapping); } // namespace generator