From df46085bf5b3f66d194ea912c5792120bbba24eb Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Tue, 12 Mar 2019 18:51:44 +0300 Subject: [PATCH] [map] Remove GetFeatureByID from Framework. --- map/framework.cpp | 16 +++++++++---- map/framework.hpp | 3 ++- map/local_ads_manager.cpp | 24 +++++++++---------- map/local_ads_manager.hpp | 9 +++---- qt/draw_widget.cpp | 19 +++++---------- search/reverse_geocoder.cpp | 7 ++++++ search/reverse_geocoder.hpp | 1 + .../assessment_tool/feature_info_dialog.cpp | 14 +++++------ .../assessment_tool/feature_info_dialog.hpp | 7 ++++-- .../assessment_tool/main_view.cpp | 8 +++---- 10 files changed, 60 insertions(+), 48 deletions(-) diff --git a/map/framework.cpp b/map/framework.cpp index 78d3379bce..79f58cf756 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -400,7 +400,7 @@ Framework::Framework(FrameworkParams const & params) : m_localAdsManager(bind(&Framework::GetMwmsByRect, this, _1, true /* rough */), bind(&Framework::GetMwmIdByName, this, _1), bind(&Framework::ReadFeatures, this, _1, _2), - bind(&Framework::GetFeatureByID, this, _1)) + bind(&Framework::GetMapObjectByID, this, _1)) , m_storage(platform::migrate::NeedMigrate() ? COUNTRIES_OBSOLETE_FILE : COUNTRIES_FILE) , m_enabledDiffs(params.m_enableDiffs) , m_isRenderingEnabled(true) @@ -2219,11 +2219,15 @@ FeatureID Framework::GetFeatureAtPoint(m2::PointD const & mercator) const return poi.IsValid() ? poi : (area.IsValid() ? area : line); } -std::unique_ptr Framework::GetFeatureByID(FeatureID const & fid) const +osm::MapObject Framework::GetMapObjectByID(FeatureID const & fid) const { + osm::MapObject res; ASSERT(fid.IsValid(), ()); FeaturesLoaderGuard guard(m_model.GetDataSource(), fid.m_mwmId); - return guard.GetFeatureByIndex(fid.m_index); + auto ft = guard.GetFeatureByIndex(fid.m_index); + if (ft) + res.SetFromFeatureType(*ft); + return res; } BookmarkManager & Framework::GetBookmarkManager() @@ -2901,7 +2905,8 @@ bool Framework::ParseEditorDebugCommand(search::SearchParams const & params) { FeatureID const & fid = edit.first; - auto ft = GetFeatureByID(fid); + FeaturesLoaderGuard guard(m_model.GetDataSource(), fid.m_mwmId); + auto ft = guard.GetFeatureByIndex(fid.m_index); if (!ft) { LOG(LERROR, ("Feature can't be loaded:", fid)); @@ -3098,7 +3103,8 @@ bool Framework::GetEditableMapObject(FeatureID const & fid, osm::EditableMapObje if (!fid.IsValid()) return false; - auto ft = GetFeatureByID(fid); + FeaturesLoaderGuard guard(m_model.GetDataSource(), fid.m_mwmId); + auto ft = guard.GetFeatureByIndex(fid.m_index); if (!ft) return false; diff --git a/map/framework.hpp b/map/framework.hpp index 2169957a98..9c58c980e2 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -44,6 +44,7 @@ #include "indexer/data_header.hpp" #include "indexer/data_source.hpp" #include "indexer/data_source_helpers.hpp" +#include "indexer/map_object.hpp" #include "indexer/map_style.hpp" #include "indexer/popularity_loader.hpp" @@ -720,7 +721,7 @@ public: indexer::ForEachFeatureAtPoint(m_model.GetDataSource(), fn, mercator, 0.0); } - std::unique_ptr GetFeatureByID(FeatureID const & fid) const; + osm::MapObject GetMapObjectByID(FeatureID const & fid) const; void MemoryWarning(); void EnterBackground(); diff --git a/map/local_ads_manager.cpp b/map/local_ads_manager.cpp index 420f547ceb..0326c18a82 100644 --- a/map/local_ads_manager.cpp +++ b/map/local_ads_manager.cpp @@ -94,9 +94,9 @@ std::string MakeCampaignDownloadingURL(MwmSet::MwmId const & mwmId) return ss.str(); } -std::string GetCustomIcon(FeatureType & featureType) +std::string GetCustomIcon(osm::MapObject const & mapObject) { - auto const & metadata = featureType.GetMetadata(); + auto const & metadata = mapObject.GetMetadata(); auto const websiteStr = metadata.Get(feature::Metadata::FMD_WEBSITE); if (websiteStr.find("burgerking") != std::string::npos) return "0_burger-king"; @@ -236,18 +236,18 @@ void DeserializePackedFeatures(ReaderSource & src, std::vector && requests) ClearLocalAdsForMwm(mwm); if (!info.m_data.empty()) { - auto campaignData = ParseCampaign(info.m_data, mwm, info.m_created, m_getFeatureByIdFn); + auto campaignData = ParseCampaign(info.m_data, mwm, info.m_created, m_getMapObjectByIdFn); if (!campaignData.empty()) { UpdateFeaturesCache(ReadCampaignFeatures(campaignData)); @@ -608,7 +608,7 @@ void LocalAdsManager::InvalidateImpl() for (auto const & info : m_info) { auto data = ParseCampaign(info.second.m_data, m_getMwmIdByNameFn(info.first), - info.second.m_created, m_getFeatureByIdFn); + info.second.m_created, m_getMapObjectByIdFn); campaignData.insert(data.begin(), data.end()); } } @@ -619,9 +619,9 @@ void LocalAdsManager::InvalidateImpl() LocalAdsManager::CampaignData LocalAdsManager::ParseCampaign(std::vector const & rawData, MwmSet::MwmId const & mwmId, Timestamp timestamp, - GetFeatureByIdFn const & getFeatureByIdFn) const + GetMapObjectByIdFn const & getMapObjectByIdFn) const { - ASSERT(getFeatureByIdFn != nullptr, ()); + ASSERT(getMapObjectByIdFn != nullptr, ()); CampaignData data; auto campaigns = local_ads::Deserialize(rawData); for (local_ads::Campaign const & campaign : campaigns) @@ -641,10 +641,10 @@ LocalAdsManager::CampaignData LocalAdsManager::ParseCampaign(std::vector expiration) continue; - auto featureType = getFeatureByIdFn(featureId); - if (featureType) + auto const mapObject = getMapObjectByIdFn(featureId); + if (mapObject.GetID().IsValid()) { - auto const customIcon = GetCustomIcon(*featureType); + auto const customIcon = GetCustomIcon(mapObject); if (!customIcon.empty()) iconName = customIcon; } diff --git a/map/local_ads_manager.hpp b/map/local_ads_manager.hpp index f5ed9be303..9230ea8165 100644 --- a/map/local_ads_manager.hpp +++ b/map/local_ads_manager.hpp @@ -14,6 +14,7 @@ #include "indexer/feature.hpp" #include "indexer/ftypes_mapping.hpp" +#include "indexer/map_object.hpp" #include "indexer/mwm_set.hpp" #include "platform/location.hpp" @@ -59,12 +60,12 @@ public: using ReadFeatureTypeFn = std::function; using ReadFeaturesFn = std::function const & features)>; - using GetFeatureByIdFn = std::function(FeatureID const &)>; + using GetMapObjectByIdFn = std::function; using OnCampaignFeaturesFn = std::function const & features)>; using Timestamp = local_ads::Timestamp; LocalAdsManager(GetMwmsByRectFn && getMwmsByRectFn, GetMwmIdByNameFn && getMwmIdByName, - ReadFeaturesFn && readFeaturesFn, GetFeatureByIdFn && getFeatureByIDFn); + ReadFeaturesFn && readFeaturesFn, GetMapObjectByIdFn && getMapObjectByIdFn); LocalAdsManager(LocalAdsManager && /* localAdsManager */) = default; void Startup(BookmarkManager * bmManager, bool isEnabled); @@ -115,7 +116,7 @@ private: using CampaignData = std::map>; CampaignData ParseCampaign(std::vector const & rawData, MwmSet::MwmId const & mwmId, - Timestamp timestamp, GetFeatureByIdFn const & getFeatureByIdFn) const; + Timestamp timestamp, GetMapObjectByIdFn const & getMapObjectByIdFn) const; FeaturesCache ReadCampaignFeatures(CampaignData & campaignData) const; void CreateLocalAdsMarks(CampaignData && campaignData); @@ -136,7 +137,7 @@ private: GetMwmsByRectFn const m_getMwmsByRectFn; GetMwmIdByNameFn const m_getMwmIdByNameFn; ReadFeaturesFn const m_readFeaturesFn; - GetFeatureByIdFn const m_getFeatureByIdFn; + GetMapObjectByIdFn const m_getMapObjectByIdFn; std::atomic m_isStarted; diff --git a/qt/draw_widget.cpp b/qt/draw_widget.cpp index a904210e3c..0f40bf47c5 100644 --- a/qt/draw_widget.cpp +++ b/qt/draw_widget.cpp @@ -36,18 +36,6 @@ using namespace qt::common; -namespace -{ -search::ReverseGeocoder::Address GetFeatureAddressInfo(Framework const & framework, - FeatureID const & fid) -{ - auto ft = framework.GetFeatureByID(fid); - if (!ft) - return {}; - return qt::common::GetFeatureAddressInfo(framework, *ft); -} -} // namespace - namespace qt { DrawWidget::DrawWidget(Framework & framework, bool apiOpenGLES3, QWidget * parent) @@ -474,9 +462,14 @@ void DrawWidget::ShowPlacePage(place_page::Info const & info) { search::ReverseGeocoder::Address address; if (info.IsFeature()) - address = GetFeatureAddressInfo(m_framework, info.GetID()); + { + search::ReverseGeocoder const coder(m_framework.GetDataSource()); + coder.GetExactAddress(info.GetID(), address); + } else + { address = m_framework.GetAddressAtPoint(info.GetMercator()); + } PlacePageDialog dlg(this, info, address); if (dlg.exec() == QDialog::Accepted) diff --git a/search/reverse_geocoder.cpp b/search/reverse_geocoder.cpp index 88db2ef07e..a4c453fb8c 100644 --- a/search/reverse_geocoder.cpp +++ b/search/reverse_geocoder.cpp @@ -242,6 +242,13 @@ bool ReverseGeocoder::GetExactAddress(FeatureType & ft, Address & addr) const addr); } +bool ReverseGeocoder::GetExactAddress(FeatureID const & fid, Address & addr) const +{ + bool res; + m_dataSource.ReadFeature([&](FeatureType & ft) { res = GetExactAddress(ft, addr); }, fid); + return res; +} + bool ReverseGeocoder::GetNearbyAddress(HouseTable & table, Building const & bld, bool ignoreEdits, Address & addr) const { diff --git a/search/reverse_geocoder.hpp b/search/reverse_geocoder.hpp index 8f9d3001b1..97e79e7b65 100644 --- a/search/reverse_geocoder.hpp +++ b/search/reverse_geocoder.hpp @@ -124,6 +124,7 @@ public: /// @param addr (out) the exact address of a feature. /// @returns false if can't extruct address or ft have no house number. bool GetExactAddress(FeatureType & ft, Address & addr) const; + bool GetExactAddress(FeatureID const & fid, Address & addr) const; private: /// Helper class to incapsulate house 2 street table reloading. diff --git a/search/search_quality/assessment_tool/feature_info_dialog.cpp b/search/search_quality/assessment_tool/feature_info_dialog.cpp index be3a1ff1d5..47b09b532c 100644 --- a/search/search_quality/assessment_tool/feature_info_dialog.cpp +++ b/search/search_quality/assessment_tool/feature_info_dialog.cpp @@ -1,8 +1,7 @@ #include "search/search_quality/assessment_tool/feature_info_dialog.hpp" #include "indexer/classificator.hpp" -#include "indexer/feature.hpp" -#include "indexer/feature_algo.hpp" +#include "indexer/map_object.hpp" #include "coding/string_utf8_multilang.hpp" @@ -32,7 +31,7 @@ QLabel * MakeSelectableLabel(string const & s) } } // namespace -FeatureInfoDialog::FeatureInfoDialog(QWidget * parent, FeatureType & ft, +FeatureInfoDialog::FeatureInfoDialog(QWidget * parent, osm::MapObject const & mapObject, search::ReverseGeocoder::Address const & address, string const & locale) : QDialog(parent) @@ -40,7 +39,7 @@ FeatureInfoDialog::FeatureInfoDialog(QWidget * parent, FeatureType & ft, auto * layout = new QGridLayout(); { - auto const & id = ft.GetID(); + auto const & id = mapObject.GetID(); CHECK(id.IsValid(), ()); auto * label = new QLabel("id:"); @@ -51,7 +50,7 @@ FeatureInfoDialog::FeatureInfoDialog(QWidget * parent, FeatureType & ft, { auto * label = new QLabel("lat lon:"); - auto const ll = MercatorBounds::ToLatLon(feature::GetCenter(ft)); + auto const ll = mapObject.GetLatLon(); auto const ss = strings::to_string_dac(ll.lat, 5) + " " + strings::to_string_dac(ll.lon, 5); auto * content = MakeSelectableLabel(ss); @@ -70,7 +69,7 @@ FeatureInfoDialog::FeatureInfoDialog(QWidget * parent, FeatureType & ft, for (auto const & code : codes) { string name; - if (!ft.GetName(code, name)) + if (!mapObject.GetNameMultilang().GetString(code, name)) continue; auto const * lang = StringUtf8Multilang::GetLangByCode(code); @@ -86,7 +85,8 @@ FeatureInfoDialog::FeatureInfoDialog(QWidget * parent, FeatureType & ft, auto const & c = classif(); vector types; - ft.ForEachType([&](uint32_t type) { types.push_back(c.GetReadableObjectName(type)); }); + for (auto type : mapObject.GetTypes()) + types.push_back(c.GetReadableObjectName(type)); if (!types.empty()) { diff --git a/search/search_quality/assessment_tool/feature_info_dialog.hpp b/search/search_quality/assessment_tool/feature_info_dialog.hpp index f1a875edc3..0c975b15d6 100644 --- a/search/search_quality/assessment_tool/feature_info_dialog.hpp +++ b/search/search_quality/assessment_tool/feature_info_dialog.hpp @@ -7,13 +7,16 @@ #include #include -class FeatureType; +namespace osm +{ +class MapObject; +} // namespace osm class FeatureInfoDialog : public QDialog { Q_OBJECT public: - FeatureInfoDialog(QWidget * parent, FeatureType & ft, + FeatureInfoDialog(QWidget * parent, osm::MapObject const & mapObject, search::ReverseGeocoder::Address const & address, std::string const & locale); private: diff --git a/search/search_quality/assessment_tool/main_view.cpp b/search/search_quality/assessment_tool/main_view.cpp index 267320c748..7fdf191268 100644 --- a/search/search_quality/assessment_tool/main_view.cpp +++ b/search/search_quality/assessment_tool/main_view.cpp @@ -61,12 +61,12 @@ MainView::MainView(Framework & framework) : m_framework(framework) return; } - auto ft = m_framework.GetFeatureByID(selectedFeature); - if (!ft) + auto mapObject = m_framework.GetMapObjectByID(selectedFeature); + if (!mapObject.GetID().IsValid()) return; - auto const address = m_framework.GetAddressAtPoint(feature::GetCenter(*ft)); - FeatureInfoDialog dialog(this /* parent */, *ft, address, m_sampleLocale); + auto const address = m_framework.GetAddressAtPoint(mapObject.GetMercator()); + FeatureInfoDialog dialog(this /* parent */, mapObject, address, m_sampleLocale); dialog.exec(); }, [this](bool /* switchFullScreenMode */) { m_selectedFeature = FeatureID(); });