diff --git a/generator/CMakeLists.txt b/generator/CMakeLists.txt index 9d099249fe..174bfb6ce8 100644 --- a/generator/CMakeLists.txt +++ b/generator/CMakeLists.txt @@ -88,8 +88,8 @@ set( filter_planet.hpp gen_mwm_info.hpp generate_info.hpp - geo_objects/geo_object_info_getter.cpp - geo_objects/geo_object_info_getter.hpp + geo_objects/geo_object_maintainer.cpp + geo_objects/geo_object_maintainer.hpp geo_objects/geo_objects.cpp geo_objects/geo_objects.hpp geo_objects/geo_objects_filter.cpp diff --git a/generator/generator_tests/geo_objects_tests.cpp b/generator/generator_tests/geo_objects_tests.cpp index f05fdfd272..f44a7bc630 100644 --- a/generator/generator_tests/geo_objects_tests.cpp +++ b/generator/generator_tests/geo_objects_tests.cpp @@ -5,7 +5,7 @@ #include "generator/feature_builder.hpp" #include "generator/feature_generator.hpp" #include "generator/generator_tests/common.hpp" -#include "generator/geo_objects/geo_object_info_getter.hpp" +#include "generator/geo_objects/geo_object_maintainer.hpp" #include "generator/geo_objects/geo_objects.hpp" #include "generator/geo_objects/geo_objects_filter.hpp" @@ -24,7 +24,8 @@ bool CheckWeGotExpectedIdsByPoint(m2::PointD const & point, std::vector reference, indexer::GeoObjectsIndex const & index) { - std::vector test = GeoObjectInfoGetter::SearchObjectsInIndex(index, point); + std::vector test = + GeoObjectMaintainer::SearchGeoObjectIdsByPoint(index, point); std::sort(test.begin(), test.end()); std::sort(reference.begin(), reference.end()); return test == reference; diff --git a/generator/geo_objects/geo_object_info_getter.cpp b/generator/geo_objects/geo_object_maintainer.cpp similarity index 69% rename from generator/geo_objects/geo_object_info_getter.cpp rename to generator/geo_objects/geo_object_maintainer.cpp index 957ac9b226..67cb6476ec 100644 --- a/generator/geo_objects/geo_object_info_getter.cpp +++ b/generator/geo_objects/geo_object_maintainer.cpp @@ -1,4 +1,4 @@ -#include "generator/geo_objects/geo_object_info_getter.hpp" +#include "generator/geo_objects/geo_object_maintainer.hpp" #include @@ -6,15 +6,15 @@ namespace generator { namespace geo_objects { -GeoObjectInfoGetter::GeoObjectInfoGetter(indexer::GeoObjectsIndex && index, +GeoObjectMaintainer::GeoObjectMaintainer(indexer::GeoObjectsIndex && index, KeyValueStorage const & kvStorage) : m_index{std::move(index)}, m_storage{kvStorage} { } -std::shared_ptr GeoObjectInfoGetter::Find( +std::shared_ptr GeoObjectMaintainer::FindFirstMatchedObject( m2::PointD const & point, std::function && pred) const { - auto const ids = SearchObjectsInIndex(m_index, point); + auto const ids = SearchGeoObjectIdsByPoint(m_index, point); for (auto const & id : ids) { auto const object = m_storage.Find(id.GetEncodedId()); @@ -28,10 +28,10 @@ std::shared_ptr GeoObjectInfoGetter::Find( return {}; } -boost::optional GeoObjectInfoGetter::Search( +boost::optional GeoObjectMaintainer::SearchIdOfFirstMatchedObject( m2::PointD const & point, std::function && pred) const { - auto const ids = SearchObjectsInIndex(m_index, point); + auto const ids = SearchGeoObjectIdsByPoint(m_index, point); for (auto const & id : ids) { auto const object = m_storage.Find(id.GetEncodedId()); @@ -45,7 +45,7 @@ boost::optional GeoObjectInfoGetter::Search( return {}; } -std::vector GeoObjectInfoGetter::SearchObjectsInIndex( +std::vector GeoObjectMaintainer::SearchGeoObjectIdsByPoint( indexer::GeoObjectsIndex const & index, m2::PointD const & point) { std::vector ids; diff --git a/generator/geo_objects/geo_object_info_getter.hpp b/generator/geo_objects/geo_object_maintainer.hpp similarity index 66% rename from generator/geo_objects/geo_object_info_getter.hpp rename to generator/geo_objects/geo_object_maintainer.hpp index 8663160490..64441da825 100644 --- a/generator/geo_objects/geo_object_info_getter.hpp +++ b/generator/geo_objects/geo_object_maintainer.hpp @@ -23,33 +23,29 @@ namespace generator { namespace geo_objects { -class GeoObjectInfoGetter +class GeoObjectMaintainer { public: using IndexReader = ReaderPtr; - GeoObjectInfoGetter(indexer::GeoObjectsIndex && index, + GeoObjectMaintainer(indexer::GeoObjectsIndex && index, KeyValueStorage const & kvStorage); - std::shared_ptr Find(m2::PointD const & point, - std::function && pred) const; + std::shared_ptr FindFirstMatchedObject( + m2::PointD const & point, std::function && pred) const; - boost::optional Search( + boost::optional SearchIdOfFirstMatchedObject( m2::PointD const & point, std::function && pred) const; std::vector SearchObjectsInIndex(m2::PointD const & point) const { - return SearchObjectsInIndex(m_index, point); + return SearchGeoObjectIdsByPoint(m_index, point); } - static std::vector SearchObjectsInIndex( + static std::vector SearchGeoObjectIdsByPoint( indexer::GeoObjectsIndex const & index, m2::PointD const & point); - KeyValueStorage const & GetKeyValueStorage() const - { - return m_storage; - } private: indexer::GeoObjectsIndex m_index; KeyValueStorage const & m_storage; diff --git a/generator/geo_objects/geo_objects.cpp b/generator/geo_objects/geo_objects.cpp index ec50168277..571c7adc98 100644 --- a/generator/geo_objects/geo_objects.cpp +++ b/generator/geo_objects/geo_objects.cpp @@ -2,7 +2,7 @@ #include "generator/feature_builder.hpp" #include "generator/feature_generator.hpp" -#include "generator/geo_objects/geo_object_info_getter.hpp" +#include "generator/geo_objects/geo_object_maintainer.hpp" #include "generator/geo_objects/geo_objects_filter.hpp" #include "generator/key_value_storage.hpp" #include "generator/locality_sorter.hpp" @@ -117,7 +117,7 @@ struct NullBuildingsInfo std::unordered_map m_Buildings2AddressPoint; }; -NullBuildingsInfo GetHelpfulNullBuildings(GeoObjectInfoGetter const & geoObjectInfoGetter, +NullBuildingsInfo GetHelpfulNullBuildings(GeoObjectMaintainer const & geoObjectMaintainer, std::string const & pathInGeoObjectsTmpMwm, size_t threadsCount) { @@ -128,7 +128,10 @@ NullBuildingsInfo GetHelpfulNullBuildings(GeoObjectInfoGetter const & geoObjectI if (!GeoObjectsFilter::HasHouse(fb) || !fb.IsPoint()) return; - auto const buildingId = geoObjectInfoGetter.Search( + + // Можно искать не нуллбилдинги в кв, а те айдишгики, которых нет в кв, которое построено без нуллбилдингов. + + auto const buildingId = geoObjectMaintainer.SearchIdOfFirstMatchedObject( fb.GetKeyPoint(), [](JsonValue const & json) { return !JsonHasBuilding(json); }); if (!buildingId) return; @@ -232,11 +235,11 @@ size_t AddBuildingGeometriesToAddressPoints(std::string const & pathInGeoObjects } NullBuildingsInfo EnrichPointsWithOuterBuildingGeometry( - GeoObjectInfoGetter const & geoObjectInfoGetter, std::string const & pathInGeoObjectsTmpMwm, + GeoObjectMaintainer const & geoObjectMaintainer, std::string const & pathInGeoObjectsTmpMwm, size_t threadsCount) { auto const buildingInfo = - GetHelpfulNullBuildings(geoObjectInfoGetter, pathInGeoObjectsTmpMwm, threadsCount); + GetHelpfulNullBuildings(geoObjectMaintainer, pathInGeoObjectsTmpMwm, threadsCount); LOG(LINFO, ("Found", buildingInfo.m_addressPoints2Buildings.size(), "address points with outer building geometry")); @@ -296,21 +299,22 @@ boost::optional> MakeTempGeoObjectsIndex( } std::shared_ptr FindHousePoi(FeatureBuilder const & fb, - GeoObjectInfoGetter const & geoObjectInfoGetter, + GeoObjectMaintainer const & geoObjectMaintainer, NullBuildingsInfo const & buildingsInfo) { - std::shared_ptr house = geoObjectInfoGetter.Find(fb.GetKeyPoint(), JsonHasBuilding); + std::shared_ptr house = + geoObjectMaintainer.FindFirstMatchedObject(fb.GetKeyPoint(), JsonHasBuilding); if (house) return house; std::vector potentialIds = - geoObjectInfoGetter.SearchObjectsInIndex(fb.GetKeyPoint()); + geoObjectMaintainer.SearchObjectsInIndex(fb.GetKeyPoint()); for (base::GeoObjectId id : potentialIds) { auto const it = buildingsInfo.m_Buildings2AddressPoint.find(id); - if (it != buildingsInfo.m_Buildings2AddressPoint.end()) - return geoObjectInfoGetter.GetKeyValueStorage().Find(it->second.GetEncodedId()); +// if (it != buildingsInfo.m_Buildings2AddressPoint.end()) +// return geoObjectMaintainer.GetKeyValueStorage().Find(it->second.GetEncodedId()); } return {}; @@ -329,7 +333,7 @@ base::JSONPtr MakeJsonValueWithNameFromFeature(FeatureBuilder const & fb, JsonVa } void AddPoisEnrichedWithHouseAddresses(KeyValueStorage & geoObjectsKv, - GeoObjectInfoGetter const & geoObjectInfoGetter, + GeoObjectMaintainer const & geoObjectMaintainer, NullBuildingsInfo const & buildingsInfo, std::string const & pathInGeoObjectsTmpMwm, std::ostream & streamPoiIdsToAddToLocalityIndex, @@ -344,7 +348,7 @@ void AddPoisEnrichedWithHouseAddresses(KeyValueStorage & geoObjectsKv, if (GeoObjectsFilter::IsBuilding(fb) || GeoObjectsFilter::HasHouse(fb)) return; - auto const house = FindHousePoi(fb, geoObjectInfoGetter, buildingsInfo); + auto const house = FindHousePoi(fb, geoObjectMaintainer, buildingsInfo); if (!house) return; @@ -439,16 +443,16 @@ bool GeoObjectsGenerator::GenerateGeoObjectsPrivate() if (!geoObjectIndex) return false; - GeoObjectInfoGetter const geoObjectInfoGetter{std::move(*geoObjectIndex), m_geoObjectsKv}; + GeoObjectMaintainer const geoObjectMaintainer{std::move(*geoObjectIndex), m_geoObjectsKv}; LOG(LINFO, ("Enrich address points with outer null building geometry.")); NullBuildingsInfo const & buildingInfo = EnrichPointsWithOuterBuildingGeometry( - geoObjectInfoGetter, m_pathInGeoObjectsTmpMwm, m_threadsCount); + geoObjectMaintainer, m_pathInGeoObjectsTmpMwm, m_threadsCount); std::ofstream streamPoiIdsToAddToLocalityIndex(m_pathOutPoiIdsToAddToLocalityIndex); - AddPoisEnrichedWithHouseAddresses(m_geoObjectsKv, geoObjectInfoGetter, buildingInfo, + AddPoisEnrichedWithHouseAddresses(m_geoObjectsKv, geoObjectMaintainer, buildingInfo, m_pathInGeoObjectsTmpMwm, streamPoiIdsToAddToLocalityIndex, m_verbose, m_threadsCount); diff --git a/generator/key_value_storage.cpp b/generator/key_value_storage.cpp index 07494ba006..b886af8db1 100644 --- a/generator/key_value_storage.cpp +++ b/generator/key_value_storage.cpp @@ -77,6 +77,17 @@ bool KeyValueStorage::ParseKeyValueLine(std::string const & line, std::streamoff return true; } +// static +std::string KeyValueStorage::SerializeFullLine(uint64_t key, JsonValue && value) +{ + auto json = Serialize(value); + CHECK(!json.empty(), ()); + + std::stringstream result; + result << SerializeDref(key) << " " << json << "\n"; + return result.str(); +} + void KeyValueStorage::Insert(uint64_t key, JsonValue && value) { auto json = Serialize(value); diff --git a/generator/key_value_storage.hpp b/generator/key_value_storage.hpp index f49f516238..a489fd186a 100644 --- a/generator/key_value_storage.hpp +++ b/generator/key_value_storage.hpp @@ -54,6 +54,9 @@ public: KeyValueStorage & operator=(KeyValueStorage const &) = delete; void Insert(uint64_t key, JsonValue && valueJson); + + static std::string SerializeFullLine(uint64_t key, JsonValue && valueJson); + std::shared_ptr Find(uint64_t key) const; size_t Size() const;