From 2ae482de76103d984ead41334846d6c51195485d Mon Sep 17 00:00:00 2001 From: Yannik Bloscheck Date: Sun, 2 Nov 2025 19:00:50 +0100 Subject: [PATCH] [generator] Ignore edited status for nearby places during map generation Signed-off-by: Yannik Bloscheck --- generator/search_index_builder.cpp | 4 ++-- libs/search/mwm_context.cpp | 9 ++++++++- libs/search/mwm_context.hpp | 6 +++--- libs/search/reverse_geocoder.cpp | 12 ++++++------ libs/search/reverse_geocoder.hpp | 4 ++-- libs/search/street_vicinity_loader.cpp | 8 ++++---- libs/search/street_vicinity_loader.hpp | 4 ++-- 7 files changed, 27 insertions(+), 20 deletions(-) diff --git a/generator/search_index_builder.cpp b/generator/search_index_builder.cpp index eba47aac4..10fe3d9af 100644 --- a/generator/search_index_builder.cpp +++ b/generator/search_index_builder.cpp @@ -495,7 +495,7 @@ void BuildAddressTable(FilesContainerR & container, std::string const & addressD if (!street.empty()) { - auto const streets = search::ReverseGeocoder::GetNearbyStreets(*contexts[threadIdx], center, kStreetRadiusM); + auto const streets = search::ReverseGeocoder::GetNearbyStreets(*contexts[threadIdx], center, kStreetRadiusM, true); streetId = MatchObjectByName(street, streets, [](std::string_view name) { return search::GetStreetNameAsKey(name, false /* ignoreStreetSynonyms */); }); @@ -508,7 +508,7 @@ void BuildAddressTable(FilesContainerR & container, std::string const & addressD if (!place.empty()) { - auto const places = search::ReverseGeocoder::GetNearbyPlaces(*contexts[threadIdx], center, kPlaceRadiusM); + auto const places = search::ReverseGeocoder::GetNearbyPlaces(*contexts[threadIdx], center, kPlaceRadiusM, true); placeId = MatchObjectByName(place, places, [](std::string_view name) { return strings::MakeUniString(name); }); } diff --git a/libs/search/mwm_context.cpp b/libs/search/mwm_context.cpp index add1f7700..5729e946a 100644 --- a/libs/search/mwm_context.cpp +++ b/libs/search/mwm_context.cpp @@ -29,8 +29,15 @@ MwmContext::MwmContext(MwmSet::MwmHandle handle, MwmType type) : MwmContext(std: m_type = type; } -std::unique_ptr MwmContext::GetFeature(uint32_t index) const +std::unique_ptr MwmContext::GetFeature(uint32_t index, bool ignoredEditedStatus) const { + if (ignoredEditedStatus) { + auto ft = m_vector.GetByIndex(index); + CHECK(ft, ()); + ft->SetID(FeatureID(GetId(), index)); + return ft; + } + std::unique_ptr ft; switch (GetEditedStatus(index)) { diff --git a/libs/search/mwm_context.hpp b/libs/search/mwm_context.hpp index a40547a2a..f452e9a57 100644 --- a/libs/search/mwm_context.hpp +++ b/libs/search/mwm_context.hpp @@ -85,7 +85,7 @@ public: } template - void ForEachFeature(m2::RectD const & rect, Fn && fn) const + void ForEachFeature(m2::RectD const & rect, Fn && fn, bool ignoredEditedStatus = false) const { uint32_t const scale = m_value.GetHeader().GetLastScale(); covering::Intervals intervals; @@ -93,14 +93,14 @@ public: ForEachIndexImpl(intervals, scale, [&](uint32_t index) { - auto ft = GetFeature(index); + auto ft = GetFeature(index, ignoredEditedStatus); if (ft) fn(*ft); }); } // Returns false if feature was deleted by user. - std::unique_ptr GetFeature(uint32_t index) const; + std::unique_ptr GetFeature(uint32_t index, bool ignoredEditedStatus = false) const; [[nodiscard]] inline bool GetCenter(uint32_t index, m2::PointD & center) { return m_centers.Get(index, center); } diff --git a/libs/search/reverse_geocoder.cpp b/libs/search/reverse_geocoder.cpp index 79cc4ac2d..ca5eca22a 100644 --- a/libs/search/reverse_geocoder.cpp +++ b/libs/search/reverse_geocoder.cpp @@ -77,7 +77,7 @@ ReverseGeocoder::ReverseGeocoder(DataSource const & dataSource) : m_dataSource(d template vector GetNearbyObjects(search::MwmContext & context, m2::PointD const & center, double radiusM, - FilterT && filter) + FilterT && filter, bool ignoredEditedStatus = false) { vector objs; @@ -90,17 +90,17 @@ vector GetNearbyObjects(search::MwmContext & context, m2::PointD const & c if (!name.empty()) objs.emplace_back(ft.GetID(), feature::GetMinDistanceMeters(ft, center), name, ft.GetNames()); } - }); + }, ignoredEditedStatus); sort(objs.begin(), objs.end(), base::LessBy(&ObjT::m_distanceMeters)); return objs; } vector ReverseGeocoder::GetNearbyStreets(search::MwmContext & context, - m2::PointD const & center, double radiusM) + m2::PointD const & center, double radiusM, bool ignoredEditedStatus) { return GetNearbyObjects(context, center, radiusM, - [](FeatureType & ft) { return StreetVicinityLoader::IsStreet(ft); }); + [](FeatureType & ft) { return StreetVicinityLoader::IsStreet(ft); }, ignoredEditedStatus); } vector ReverseGeocoder::GetNearbyStreets(MwmSet::MwmId const & id, @@ -122,13 +122,13 @@ vector ReverseGeocoder::GetNearbyStreets(FeatureType & } std::vector ReverseGeocoder::GetNearbyPlaces(search::MwmContext & context, - m2::PointD const & center, double radiusM) + m2::PointD const & center, double radiusM, bool ignoredEditedStatus) { return GetNearbyObjects(context, center, radiusM, [](FeatureType & ft) { return (ftypes::IsLocalityChecker::Instance().GetType(ft) >= ftypes::LocalityType::City || ftypes::IsSuburbChecker::Instance()(ft)); - }); + }, ignoredEditedStatus); } string ReverseGeocoder::GetFeatureStreetName(FeatureType & ft) const diff --git a/libs/search/reverse_geocoder.hpp b/libs/search/reverse_geocoder.hpp index 986dcf80c..0a5ff08ad 100644 --- a/libs/search/reverse_geocoder.hpp +++ b/libs/search/reverse_geocoder.hpp @@ -114,11 +114,11 @@ public: /// Parameter |includeSquaresAndSuburbs| needed for backward compatibility: /// existing mwms operate on streets without squares and suburbs. static std::vector GetNearbyStreets(search::MwmContext & context, m2::PointD const & center, - double radiusM = kLookupRadiusM); + double radiusM = kLookupRadiusM, bool ignoredEditedStatus = false); std::vector GetNearbyStreets(MwmSet::MwmId const & id, m2::PointD const & center) const; std::vector GetNearbyStreets(FeatureType & ft) const; - static std::vector GetNearbyPlaces(search::MwmContext & context, m2::PointD const & center, double radiusM); + static std::vector GetNearbyPlaces(search::MwmContext & context, m2::PointD const & center, double radiusM, bool ignoredEditedStatus = false); /// @return feature street name. /// Returns empty string when there is no street the feature belongs to. diff --git a/libs/search/street_vicinity_loader.cpp b/libs/search/street_vicinity_loader.cpp index 83c6a70eb..26aeb097b 100644 --- a/libs/search/street_vicinity_loader.cpp +++ b/libs/search/street_vicinity_loader.cpp @@ -35,13 +35,13 @@ void StreetVicinityLoader::OnQueryFinished() m_cache.ClearIfNeeded(); } -StreetVicinityLoader::Street const & StreetVicinityLoader::GetStreet(uint32_t featureId) +StreetVicinityLoader::Street const & StreetVicinityLoader::GetStreet(uint32_t featureId, bool ignoredEditedStatus) { auto r = m_cache.Get(featureId); if (!r.second) return r.first; - LoadStreet(featureId, r.first); + LoadStreet(featureId, r.first, ignoredEditedStatus); return r.first; } @@ -54,9 +54,9 @@ bool StreetVicinityLoader::IsStreet(FeatureType & ft) return ((isLineOrArea && ftypes::IsWayChecker::Instance()(ft)) || ftypes::IsSquareChecker::Instance()(ft)); } -void StreetVicinityLoader::LoadStreet(uint32_t featureId, Street & street) +void StreetVicinityLoader::LoadStreet(uint32_t featureId, Street & street, bool ignoredEditedStatus) { - auto feature = m_context->GetFeature(featureId); + auto feature = m_context->GetFeature(featureId, ignoredEditedStatus); if (!feature || !IsStreet(*feature)) return; diff --git a/libs/search/street_vicinity_loader.hpp b/libs/search/street_vicinity_loader.hpp index 27753fcb6..dc8483633 100644 --- a/libs/search/street_vicinity_loader.hpp +++ b/libs/search/street_vicinity_loader.hpp @@ -73,10 +73,10 @@ public: void OnQueryFinished(); - Street const & GetStreet(uint32_t featureId); + Street const & GetStreet(uint32_t featureId, bool ignoredEditedStatus = false); private: - void LoadStreet(uint32_t featureId, Street & street); + void LoadStreet(uint32_t featureId, Street & street, bool ignoredEditedStatus = false); MwmContext * m_context; int m_scale;