From acf6cb85ca8dc9dc5a72fdc82c103a189745f4bf Mon Sep 17 00:00:00 2001 From: LaGrunge Date: Thu, 4 Jul 2019 13:51:27 +0300 Subject: [PATCH] [generator] Store streets by defautl name and merge nultilangs --- coding/string_utf8_multilang.hpp | 8 ----- generator/streets/streets_builder.cpp | 48 +++++++++++++++++---------- generator/streets/streets_builder.hpp | 14 +++++--- generator/translation.hpp | 1 + 4 files changed, 42 insertions(+), 29 deletions(-) diff --git a/coding/string_utf8_multilang.hpp b/coding/string_utf8_multilang.hpp index 2c3ed14835..f786e259d2 100644 --- a/coding/string_utf8_multilang.hpp +++ b/coding/string_utf8_multilang.hpp @@ -64,14 +64,6 @@ void ReadString(TSource & src, std::string & s) class StringUtf8Multilang { public: - struct Hash - { - std::size_t operator()(StringUtf8Multilang const & s) const noexcept - { - return std::hash{}(s.m_s); - } - }; - struct Lang { /// OSM language code (e.g. for name:en it's "en" part). diff --git a/generator/streets/streets_builder.cpp b/generator/streets/streets_builder.cpp index 5b667f73ea..084082002d 100644 --- a/generator/streets/streets_builder.cpp +++ b/generator/streets/streets_builder.cpp @@ -38,10 +38,10 @@ void StreetsBuilder::AssembleBindings(std::string const & pathInGeoObjectsTmpMwm std::string streetName = fb.GetParams().GetStreet(); if (!streetName.empty()) { - // TODO(lagrunge): add localizations on street:lang tags - StringUtf8Multilang multilangStreetName; - multilangStreetName.AddString(StringUtf8Multilang::kDefaultCode, streetName); - AddStreetBinding(std::move(multilangStreetName), fb); + // TODO maybe (lagrunge): add localizations on street:lang tags + StringUtf8Multilang multilangName; + multilangName.AddString(StringUtf8Multilang::kDefaultCode, streetName); + AddStreetBinding(std::move(streetName), fb, std::move(multilangName)); } }; ForEachParallelFromDatRawFormat(m_threadsCount, pathInGeoObjectsTmpMwm, transform); @@ -62,12 +62,12 @@ void StreetsBuilder::SaveRegionStreetsKv(std::ostream & streamStreetsKv, uint64_ for (auto const & street : streets) { - auto const & bbox = street.second.GetBbox(); - auto const & pin = street.second.GetOrChoosePin(); + auto const & bbox = street.second.m_geometry.GetBbox(); + auto const & pin = street.second.m_geometry.GetOrChoosePin(); auto const id = KeyValueStorage::SerializeDref(pin.m_osmId.GetEncodedId()); auto const & value = - MakeStreetValue(regionId, *regionObject, street.first, bbox, pin.m_position); + MakeStreetValue(regionId, *regionObject, street.second.m_name, bbox, pin.m_position); streamStreetsKv << id << " " << KeyValueStorage::Serialize(value) << "\n"; } } @@ -97,9 +97,9 @@ void StreetsBuilder::AddStreetHighway(FeatureBuilder & fb) for (auto & segment : pathSegments) { auto && region = segment.m_region; - auto & street = InsertStreet(region.first, fb.GetMultilangName()); + auto & street = InsertStreet(region.first, fb.GetName(), fb.GetMultilangName()); auto const osmId = pathSegments.size() == 1 ? fb.GetMostGenericOsmId() : NextOsmSurrogateId(); - street.AddHighwayLine(osmId, std::move(segment.m_path)); + street.m_geometry.AddHighwayLine(osmId, std::move(segment.m_path)); } } @@ -111,9 +111,9 @@ void StreetsBuilder::AddStreetArea(FeatureBuilder & fb) std::lock_guard lock{m_updateMutex}; - auto & street = InsertStreet(region->first, fb.GetMultilangName()); + auto & street = InsertStreet(region->first, fb.GetName(), fb.GetMultilangName()); auto osmId = fb.GetMostGenericOsmId(); - street.AddHighwayArea(osmId, fb.GetOuterGeometry()); + street.m_geometry.AddHighwayArea(osmId, fb.GetOuterGeometry()); } void StreetsBuilder::AddStreetPoint(FeatureBuilder & fb) @@ -125,11 +125,12 @@ void StreetsBuilder::AddStreetPoint(FeatureBuilder & fb) std::lock_guard lock{m_updateMutex}; auto osmId = fb.GetMostGenericOsmId(); - auto & street = InsertStreet(region->first, fb.GetMultilangName()); - street.SetPin({fb.GetKeyPoint(), osmId}); + auto & street = InsertStreet(region->first, fb.GetName(), fb.GetMultilangName()); + street.m_geometry.SetPin({fb.GetKeyPoint(), osmId}); } -void StreetsBuilder::AddStreetBinding(StringUtf8Multilang && streetName, FeatureBuilder & fb) +void StreetsBuilder::AddStreetBinding(std::string && streetName, FeatureBuilder & fb, + StringUtf8Multilang && multiLangName) { auto const region = FindStreetRegionOwner(fb.GetKeyPoint()); if (!region) @@ -137,8 +138,8 @@ void StreetsBuilder::AddStreetBinding(StringUtf8Multilang && streetName, Feature std::lock_guard lock{m_updateMutex}; - auto & street = InsertStreet(region->first, std::move(streetName)); - street.AddBinding(NextOsmSurrogateId(), fb.GetKeyPoint()); + auto & street = InsertStreet(region->first, std::move(streetName), std::move(multiLangName)); + street.m_geometry.AddBinding(NextOsmSurrogateId(), fb.GetKeyPoint()); } boost::optional StreetsBuilder::FindStreetRegionOwner(m2::PointD const & point, @@ -162,7 +163,20 @@ boost::optional StreetsBuilder::FindStreetRegionOwner(m2::PointD const return m_regionInfoGetter.FindDeepest(point, isStreetAdministrator); } -StreetGeometry & StreetsBuilder::InsertStreet(uint64_t regionId, StringUtf8Multilang && streetName) +StringUtf8Multilang MergeNames(StringUtf8Multilang && first, StringUtf8Multilang && second) +{ + StringUtf8Multilang result; + + auto const fn = [&result](int8_t code, std::string const & name) { + result.AddString(code, name); + }; + first.ForEach(fn); + second.ForEach(fn); + return result; +} + +StreetsBuilder::Street & StreetsBuilder::InsertStreet(uint64_t regionId, std::string && streetName, + StringUtf8Multilang && multilangName) { auto & regionStreets = m_regions[regionId]; return regionStreets[std::move(streetName)]; diff --git a/generator/streets/streets_builder.hpp b/generator/streets/streets_builder.hpp index f3fc3a191d..a6f9ebbd2e 100644 --- a/generator/streets/streets_builder.hpp +++ b/generator/streets/streets_builder.hpp @@ -41,8 +41,12 @@ public: static bool IsStreet(feature::FeatureBuilder const & fb); private: - using RegionStreets = - std::unordered_map; + struct Street + { + StringUtf8Multilang m_name; + StreetGeometry m_geometry; + }; + using RegionStreets = std::unordered_map; void SaveRegionStreetsKv(std::ostream & streamStreetsKv, uint64_t regionId, RegionStreets const & streets); @@ -51,10 +55,12 @@ private: void AddStreetHighway(feature::FeatureBuilder & fb); void AddStreetArea(feature::FeatureBuilder & fb); void AddStreetPoint(feature::FeatureBuilder & fb); - void AddStreetBinding(StringUtf8Multilang && streetName, feature::FeatureBuilder & fb); + void AddStreetBinding(std::string && streetName, feature::FeatureBuilder & fb, + StringUtf8Multilang && multiLangName); boost::optional FindStreetRegionOwner(m2::PointD const & point, bool needLocality = false); - StreetGeometry & InsertStreet(uint64_t regionId, StringUtf8Multilang && streetName); + Street & InsertStreet(uint64_t regionId, std::string && streetName, + StringUtf8Multilang && multilangName); base::JSONPtr MakeStreetValue(uint64_t regionId, JsonValue const & regionObject, const StringUtf8Multilang & streetName, m2::RectD const & bbox, m2::PointD const & pinPoint); diff --git a/generator/translation.hpp b/generator/translation.hpp index 92f49dcdee..5f9413251c 100644 --- a/generator/translation.hpp +++ b/generator/translation.hpp @@ -113,6 +113,7 @@ private: } std::vector const & LocaleLanguages() const; + json_t & m_node; }; } // namespace generator \ No newline at end of file