From 6252c6d2601ebeb354226eb9eeae0d137d50dea9 Mon Sep 17 00:00:00 2001 From: Sergey Magidovich Date: Sat, 7 May 2016 09:51:17 +0300 Subject: [PATCH] Migrate created features. --- indexer/edits_migration.cpp | 26 +++++++++++++++++++------- indexer/edits_migration.hpp | 8 +++++++- indexer/osm_editor.cpp | 7 +++++-- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/indexer/edits_migration.cpp b/indexer/edits_migration.cpp index fc58779527..bf56ec971f 100644 --- a/indexer/edits_migration.cpp +++ b/indexer/edits_migration.cpp @@ -13,7 +13,9 @@ namespace editor { FeatureID MigrateNodeFeatureIndex(osm::Editor::TForEachFeaturesNearByFn & forEach, - XMLFeature const & xml) + XMLFeature const & xml, + osm::Editor::FeatureStatus const featureStatus, + TGenerateIDFn const & generateID) { unique_ptr feature; auto count = 0; @@ -27,8 +29,12 @@ FeatureID MigrateNodeFeatureIndex(osm::Editor::TForEachFeaturesNearByFn & forEac ++count; }, MercatorBounds::FromLatLon(xml.GetCenter())); - if (!feature) + + if (!feature && featureStatus != osm::Editor::FeatureStatus::Created) MYTHROW(MigrationError, ("No pointed features returned.")); + if (featureStatus == osm::Editor::FeatureStatus::Created) + return generateID(); + if (count > 1) { LOG(LWARNING, @@ -37,8 +43,10 @@ FeatureID MigrateNodeFeatureIndex(osm::Editor::TForEachFeaturesNearByFn & forEac return feature->GetID(); } -FeatureID MigrateWayFeatureIndex(osm::Editor::TForEachFeaturesNearByFn & forEach, - XMLFeature const & xml) +FeatureID MigrateWayFeatureIndex( + osm::Editor::TForEachFeaturesNearByFn & forEach, XMLFeature const & xml, + osm::Editor::FeatureStatus const /* Unused for now (we don't create/delete area features)*/, + TGenerateIDFn const & /*Unused for the same reason*/) { unique_ptr feature; auto bestScore = 0.6; // initial score is used as a threshold. @@ -101,12 +109,16 @@ FeatureID MigrateWayFeatureIndex(osm::Editor::TForEachFeaturesNearByFn & forEach } FeatureID MigrateFeatureIndex(osm::Editor::TForEachFeaturesNearByFn & forEach, - XMLFeature const & xml) + XMLFeature const & xml, + osm::Editor::FeatureStatus const featureStatus, + TGenerateIDFn const & generateID) { switch (xml.GetType()) { - case XMLFeature::Type::Node: return MigrateNodeFeatureIndex(forEach, xml); - case XMLFeature::Type::Way: return MigrateWayFeatureIndex(forEach, xml); + case XMLFeature::Type::Node: + return MigrateNodeFeatureIndex(forEach, xml, featureStatus, generateID); + case XMLFeature::Type::Way: + return MigrateWayFeatureIndex(forEach, xml, featureStatus, generateID); } } } // namespace editor diff --git a/indexer/edits_migration.hpp b/indexer/edits_migration.hpp index 53e6ba9f8e..c36c74e697 100644 --- a/indexer/edits_migration.hpp +++ b/indexer/edits_migration.hpp @@ -7,12 +7,18 @@ #include "base/exception.hpp" +#include "std/functional.hpp" + namespace editor { DECLARE_EXCEPTION(MigrationError, RootException); +using TGenerateIDFn = function; + /// Tries to match xml feature with one on a new mwm and retruns FeatrueID /// of a found feature, thows MigrationError if migration fails. FeatureID MigrateFeatureIndex(osm::Editor::TForEachFeaturesNearByFn & forEach, - XMLFeature const & xml); + XMLFeature const & xml, + osm::Editor::FeatureStatus const featureStatus, + TGenerateIDFn const & generateID); } // namespace editor diff --git a/indexer/osm_editor.cpp b/indexer/osm_editor.cpp index 3a0b8879e1..976024ab82 100644 --- a/indexer/osm_editor.cpp +++ b/indexer/osm_editor.cpp @@ -194,11 +194,14 @@ void Editor::LoadMapEdits() { XMLFeature const xml(nodeOrWay.node()); + // TODO(mgsergio): Deleted features are not properly handled yet. auto const fid = needMigrateEdits - ? editor::MigrateFeatureIndex(m_forEachFeatureAtPointFn, xml) + ? editor::MigrateFeatureIndex( + m_forEachFeatureAtPointFn, xml, section.first, + [this, &mwmId] { return GenerateNewFeatureId(mwmId); }) : FeatureID(mwmId, xml.GetMWMFeatureIndex()); - // Remove obsolete edit during migration. + // Remove obsolete changes during migration. if (needMigrateEdits && IsObsolete(xml, fid)) continue;