From fd3620978d2b50d28e91e5a6e5dc87b64ddc62e3 Mon Sep 17 00:00:00 2001 From: Anatoly Serdtcev Date: Thu, 25 Jul 2019 13:20:49 +0300 Subject: [PATCH] [generator:regions] Write path of object's lagest region into KV --- generator/regions/regions.cpp | 34 +++++++++++++++++++++++---- generator/regions/regions_builder.hpp | 2 +- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/generator/regions/regions.cpp b/generator/regions/regions.cpp index d23d77e735..99511fa67a 100644 --- a/generator/regions/regions.cpp +++ b/generator/regions/regions.cpp @@ -158,6 +158,9 @@ private: size_t countryRegionsCount = 0; size_t countryObjectCount = 0; + std::vector objectsOrder; + std::map objectsPaths; + for (auto const & tree : outers) { if (m_verbose) @@ -168,6 +171,7 @@ private: auto const & region = node->GetData(); auto const & objectId = region.GetId(); auto const & regionCountryEmplace = m_regionsCountries.emplace(objectId, country); + bool firstRegionOfObject = regionCountryEmplace.second; if (!regionCountryEmplace.second && regionCountryEmplace.first->second != country) { LOG(LWARNING, ("Failed to place", GetLabel(region.GetLevel()), "region", objectId, "(", @@ -178,20 +182,42 @@ private: m_objectsRegions.emplace(objectId, node); ++countryRegionsCount; - - if (regionCountryEmplace.second) + if (firstRegionOfObject) { - m_regionsKv << KeyValueStorage::SerializeDref(objectId.GetEncodedId()) << " " - << KeyValueStorage::Serialize(BuildRegionValue(path)) << "\n"; + objectsOrder.push_back(objectId); ++countryObjectCount; } + + auto pathEmplace = objectsPaths.emplace(objectId, path); + if (!pathEmplace.second) + { + auto & objectMaxRegionPath = pathEmplace.first->second; + auto & objectMaxRegion = objectMaxRegionPath.back()->GetData(); + if (RegionsBuilder::IsAreaLessRely(objectMaxRegion, region)) + objectMaxRegionPath = path; + } }); } + WriteObjectsInKv(objectsOrder, objectsPaths); + LOG(LINFO, ("Country regions of", *country, "has built:", countryRegionsCount, "total regions.", countryObjectCount, "objects.")); } + void WriteObjectsInKv(std::vector const & objectsOrder, + std::map const & objectsPaths) + { + for (auto const & objectId : objectsOrder) + { + auto pathIter = objectsPaths.find(objectId); + CHECK(pathIter != objectsPaths.end(), ()); + auto const & path = pathIter->second; + m_regionsKv << KeyValueStorage::SerializeDref(objectId.GetEncodedId()) << " " + << KeyValueStorage::Serialize(BuildRegionValue(path)) << "\n"; + } + } + std::tuple ReadDatasetFromTmpMwm( std::string const & tmpMwmFilename, RegionInfo & collector) { diff --git a/generator/regions/regions_builder.hpp b/generator/regions/regions_builder.hpp index 62925f29e3..5f5551b97b 100644 --- a/generator/regions/regions_builder.hpp +++ b/generator/regions/regions_builder.hpp @@ -36,6 +36,7 @@ public: // Return: 0 - no relation, 1 - |l| contains |r|, -1 - |r| contains |l|. static int CompareAffiliation(LevelRegion const & l, LevelRegion const & r, CountrySpecifier const & countrySpecifier); + static bool IsAreaLessRely(Region const & l, Region const & r); private: static constexpr double kAreaRelativeErrorPercent = 0.1; @@ -59,7 +60,6 @@ private: std::vector::const_reverse_iterator forItem) const; static void InsertIntoSubtree(Node::Ptr & subtree, Node::Ptr && newNode, CountrySpecifier const & countrySpecifier); - static bool IsAreaLessRely(Region const & l, Region const & r); Regions m_countriesOuters; Regions m_regionsInAreaOrder;