diff options
author | Yuri Gorshenin <y@maps.me> | 2016-09-01 17:23:57 +0300 |
---|---|---|
committer | Yuri Gorshenin <y@maps.me> | 2016-09-01 18:27:59 +0300 |
commit | 30ef25bfb34beab674320723f1bcc598a784fffe (patch) | |
tree | df87e64e58605358d779142f389eca51bde4af1a /indexer | |
parent | a43c309fc7adfbd853133debc712a86be3d149f9 (diff) |
[indexer] Removed indexer dependency on search.
Diffstat (limited to 'indexer')
-rw-r--r-- | indexer/indexer_tests/osm_editor_test.cpp | 24 | ||||
-rw-r--r-- | indexer/indexer_tests_support/helpers.cpp | 6 | ||||
-rw-r--r-- | indexer/indexer_tests_support/helpers.hpp | 4 | ||||
-rw-r--r-- | indexer/osm_editor.cpp | 110 | ||||
-rw-r--r-- | indexer/osm_editor.hpp | 29 |
5 files changed, 96 insertions, 77 deletions
diff --git a/indexer/indexer_tests/osm_editor_test.cpp b/indexer/indexer_tests/osm_editor_test.cpp index 21bc744d23..b3e3592d0f 100644 --- a/indexer/indexer_tests/osm_editor_test.cpp +++ b/indexer/indexer_tests/osm_editor_test.cpp @@ -2,7 +2,7 @@ #include "indexer/indexer_tests/osm_editor_test.hpp" -#include "search/reverse_geocoder.hpp" +#include "search/editor_delegate.hpp" #include "indexer/classificator.hpp" #include "indexer/classificator_loader.hpp" @@ -17,6 +17,8 @@ #include "coding/file_name_utils.hpp" +#include "std/unique_ptr.hpp" + using namespace generator::tests_support; using namespace indexer::tests_support; @@ -144,7 +146,7 @@ EditorTest::EditorTest() LOG(LERROR, ("Classificator read error: ", e.what())); } - indexer::tests_support::SetUpEditorForTesting(m_index); + indexer::tests_support::SetUpEditorForTesting(make_unique<search::EditorDelegate>(m_index)); } EditorTest::~EditorTest() @@ -232,7 +234,7 @@ void EditorTest::SetIndexTest() builder.Add(TestCafe({4.0, 4.0}, "London Cafe", "en")); }); - auto const mwmId = editor.m_mwmIdByMapNameFn("GB"); + auto const mwmId = editor.GetMwmIdByMapName("GB"); TEST_EQUAL(gbMwmId, mwmId, ()); @@ -241,28 +243,28 @@ void EditorTest::SetIndexTest() ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { - auto const firstPtr = editor.m_getOriginalFeatureFn(ft.GetID()); + auto const firstPtr = editor.GetOriginalFeature(ft.GetID()); TEST(firstPtr, ()); SetBuildingLevelsToOne(ft); - auto const secondPtr = editor.m_getOriginalFeatureFn(ft.GetID()); + auto const secondPtr = editor.GetOriginalFeature(ft.GetID()); TEST(secondPtr, ()); TEST_EQUAL(firstPtr->GetID(), secondPtr->GetID(), ()); }); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { - TEST_EQUAL(editor.m_getOriginalFeatureStreetFn(ft), "Test street", ()); + TEST_EQUAL(editor.GetOriginalFeatureStreet(ft), "Test street", ()); EditFeature(ft, [](osm::EditableMapObject & emo) { osm::LocalizedStreet ls{"Some street", ""}; emo.SetStreet(ls); }); - TEST_EQUAL(editor.m_getOriginalFeatureStreetFn(ft), "Test street", ()); + TEST_EQUAL(editor.GetOriginalFeatureStreet(ft), "Test street", ()); }); uint32_t counter = 0; - editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + editor.ForEachFeatureAtPoint([&counter](FeatureType & ft) { ++counter; }, {100.0, 100.0}); @@ -270,7 +272,7 @@ void EditorTest::SetIndexTest() TEST_EQUAL(counter, 0, ()); counter = 0; - editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + editor.ForEachFeatureAtPoint([&counter](FeatureType & ft) { ++counter; }, {3.0, 3.0}); @@ -278,7 +280,7 @@ void EditorTest::SetIndexTest() TEST_EQUAL(counter, 1, ()); counter = 0; - editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + editor.ForEachFeatureAtPoint([&counter](FeatureType & ft) { ++counter; }, {1.0, 1.0}); @@ -286,7 +288,7 @@ void EditorTest::SetIndexTest() TEST_EQUAL(counter, 2, ()); counter = 0; - editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + editor.ForEachFeatureAtPoint([&counter](FeatureType & ft) { ++counter; }, {4.0, 4.0}); diff --git a/indexer/indexer_tests_support/helpers.cpp b/indexer/indexer_tests_support/helpers.cpp index 05392903de..0f748989e8 100644 --- a/indexer/indexer_tests_support/helpers.cpp +++ b/indexer/indexer_tests_support/helpers.cpp @@ -2,16 +2,14 @@ #include "editor/editor_storage.hpp" -#include "std/unique_ptr.hpp" - namespace indexer { namespace tests_support { -void SetUpEditorForTesting(Index & index) +void SetUpEditorForTesting(unique_ptr<osm::Editor::Delegate> delegate) { auto & editor = osm::Editor::Instance(); - editor.SetIndex(index); + editor.SetDelegate(move(delegate)); editor.SetStorageForTesting(make_unique<editor::InMemoryStorage>()); editor.ClearAllLocalEdits(); } diff --git a/indexer/indexer_tests_support/helpers.hpp b/indexer/indexer_tests_support/helpers.hpp index fd3018ffcf..e0001681d2 100644 --- a/indexer/indexer_tests_support/helpers.hpp +++ b/indexer/indexer_tests_support/helpers.hpp @@ -3,6 +3,8 @@ #include "indexer/editable_map_object.hpp" #include "indexer/osm_editor.hpp" +#include "std/unique_ptr.hpp" + #include "base/assert.hpp" class Index; @@ -11,7 +13,7 @@ namespace indexer { namespace tests_support { -void SetUpEditorForTesting(Index & index); +void SetUpEditorForTesting(unique_ptr<osm::Editor::Delegate> delegate); template <typename TFn> void EditFeature(FeatureType const & ft, TFn && fn) diff --git a/indexer/osm_editor.cpp b/indexer/osm_editor.cpp index 96f230ae09..e804dee125 100644 --- a/indexer/osm_editor.cpp +++ b/indexer/osm_editor.cpp @@ -10,8 +10,6 @@ #include "indexer/osm_editor.hpp" #include "indexer/index_helpers.hpp" -#include "search/reverse_geocoder.hpp" - #include "platform/local_country_file_utils.hpp" #include "platform/platform.hpp" #include "platform/preferred_languages.hpp" @@ -140,7 +138,8 @@ Editor::Editor() : m_configLoader(m_config) , m_notes(editor::Notes::MakeNotes()) , m_storage(make_unique<editor::LocalStorage>()) -{} +{ +} Editor & Editor::Instance() { @@ -148,47 +147,11 @@ Editor & Editor::Instance() return instance; } -void Editor::SetIndex(Index const & index) -{ - m_mwmIdByMapNameFn = [&index](string const & name) -> MwmSet::MwmId - { - return index.GetMwmIdByCountryFile(platform::CountryFile(name)); - }; - - m_getOriginalFeatureFn = [&index](FeatureID const & fid) -> unique_ptr<FeatureType> - { - unique_ptr<FeatureType> feature(new FeatureType()); - Index::FeaturesLoaderGuard const guard(index, fid.m_mwmId); - if (!guard.GetOriginalFeatureByIndex(fid.m_index, *feature)) - return nullptr; - feature->ParseEverything(); - return feature; - }; - - m_getOriginalFeatureStreetFn = [&index](FeatureType & ft) -> string - { - search::ReverseGeocoder const coder(index); - auto const streets = coder.GetNearbyFeatureStreets(ft); - if (streets.second < streets.first.size()) - return streets.first[streets.second].m_name; - return {}; - }; - - // Due to floating points accuracy issues (geometry is saved in editor up to 7 digits - // after decimal point) some feature vertexes are threated as external to a given feature. - auto const toleranceInMeters = 1e-2; - m_forEachFeatureAtPointFn = - [&index, toleranceInMeters](TFeatureTypeFn && fn, m2::PointD const & mercator) - { - indexer::ForEachFeatureAtPoint(index, move(fn), mercator, toleranceInMeters); - }; -} - void Editor::LoadMapEdits() { - if (!m_mwmIdByMapNameFn) + if (!m_delegate) { - LOG(LERROR, ("Can't load any map edits, MwmIdByNameAndVersionFn has not been set.")); + LOG(LERROR, ("Can't load any map edits, delegate has not been set.")); return; } @@ -213,7 +176,7 @@ void Editor::LoadMapEdits() { string const mapName = mwm.attribute("name").as_string(""); int64_t const mapVersion = mwm.attribute("version").as_llong(0); - MwmSet::MwmId const mwmId = m_mwmIdByMapNameFn(mapName); + MwmSet::MwmId const mwmId = GetMwmIdByMapName(mapName); // TODO(mgsergio, AlexZ): Is it normal to have isMwmIdAlive and mapVersion // NOT equal to mwmId.GetInfo()->GetVersion() at the same time? auto const needMigrateEdits = !mwmId.IsAlive() || mapVersion != mwmId.GetInfo()->GetVersion(); @@ -235,10 +198,15 @@ void Editor::LoadMapEdits() goto SECTION_END; } + TForEachFeaturesNearByFn forEach = [this](TFeatureTypeFn && fn, + m2::PointD const & point) { + return ForEachFeatureAtPoint(move(fn), point); + }; + // TODO(mgsergio): Deleted features are not properly handled yet. auto const fid = needMigrateEdits ? editor::MigrateFeatureIndex( - m_forEachFeatureAtPointFn, xml, section.first, + forEach, xml, section.first, [this, &mwmId] { return GenerateNewFeatureId(mwmId); }) : FeatureID(mwmId, xml.GetMWMFeatureIndex()); @@ -253,7 +221,7 @@ void Editor::LoadMapEdits() } else { - auto const originalFeaturePtr = m_getOriginalFeatureFn(fid); + auto const originalFeaturePtr = GetOriginalFeature(fid); if (!originalFeaturePtr) { LOG(LERROR, ("A feature with id", fid, "cannot be loaded.")); @@ -451,7 +419,7 @@ bool Editor::OriginalFeatureHasDefaultName(FeatureID const & fid) const if (IsCreatedFeature(fid)) return false; - auto const originalFeaturePtr = m_getOriginalFeatureFn(fid); + auto const originalFeaturePtr = GetOriginalFeature(fid); if (!originalFeaturePtr) { LOG(LERROR, ("A feature with id", fid, "cannot be loaded.")); @@ -504,7 +472,7 @@ Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo) } else { - auto const originalFeaturePtr = m_getOriginalFeatureFn(fid); + auto const originalFeaturePtr = GetOriginalFeature(fid); if (!originalFeaturePtr) { LOG(LERROR, ("A feature with id", fid, "cannot be loaded.")); @@ -518,7 +486,7 @@ Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo) fti.m_feature.ReplaceBy(emo); bool const sameAsInMWM = AreFeaturesEqualButStreet(fti.m_feature, *originalFeaturePtr) && - emo.GetStreet().m_defaultName == m_getOriginalFeatureStreetFn(fti.m_feature); + emo.GetStreet().m_defaultName == GetOriginalFeatureStreet(fti.m_feature); if (featureStatus != FeatureStatus::Untouched) { @@ -675,7 +643,7 @@ EditableProperties Editor::GetEditableProperties(FeatureType const & feature) co // Disable opening hours editing if opening hours cannot be parsed. if (GetFeatureStatus(feature.GetID()) != FeatureStatus::Created) { - auto const originalFeaturePtr = m_getOriginalFeatureFn(feature.GetID()); + auto const originalFeaturePtr = GetOriginalFeature(feature.GetID()); if (!originalFeaturePtr) { LOG(LERROR, ("A feature with id", feature.GetID(), "cannot be loaded.")); @@ -837,7 +805,7 @@ void Editor::UploadChanges(string const & key, string const & secret, TChangeset feature.SetTagValue(kAddrStreetTag, fti.m_street); ourDebugFeatureString = DebugPrint(feature); - auto const originalFeaturePtr = m_getOriginalFeatureFn(fti.m_feature.GetID()); + auto const originalFeaturePtr = GetOriginalFeature(fti.m_feature.GetID()); if (!originalFeaturePtr) { LOG(LERROR, ("A feature with id", fti.m_feature.GetID(), "cannot be loaded.")); @@ -866,7 +834,7 @@ void Editor::UploadChanges(string const & key, string const & secret, TChangeset break; case FeatureStatus::Deleted: - auto const originalFeaturePtr = m_getOriginalFeatureFn(fti.m_feature.GetID()); + auto const originalFeaturePtr = GetOriginalFeature(fti.m_feature.GetID()); if (!originalFeaturePtr) { LOG(LERROR, ("A feature with id", fti.m_feature.GetID(), "cannot be loaded.")); @@ -1129,7 +1097,7 @@ void Editor::MarkFeatureWithStatus(FeatureID const & fid, FeatureStatus status) { auto & fti = m_features[fid.m_mwmId][fid.m_index]; - auto const originalFeaturePtr = m_getOriginalFeatureFn(fid); + auto const originalFeaturePtr = GetOriginalFeature(fid); if (!originalFeaturePtr) { @@ -1143,6 +1111,46 @@ void Editor::MarkFeatureWithStatus(FeatureID const & fid, FeatureStatus status) fti.m_modificationTimestamp = time(nullptr); } +MwmSet::MwmId Editor::GetMwmIdByMapName(string const & name) +{ + if (!m_delegate) + { + LOG(LERROR, ("Can't get mwm id by map name:", name, ", delegate is not set.")); + return {}; + } + return m_delegate->GetMwmIdByMapName(name); +} + +unique_ptr<FeatureType> Editor::GetOriginalFeature(FeatureID const & fid) const +{ + if (!m_delegate) + { + LOG(LERROR, ("Can't get original feature by id:", fid, ", delegate is not set.")); + return {}; + } + return m_delegate->GetOriginalFeature(fid); +} + +string Editor::GetOriginalFeatureStreet(FeatureType & ft) const +{ + if (!m_delegate) + { + LOG(LERROR, ("Can't get feature street, delegate is not set.")); + return {}; + } + return m_delegate->GetOriginalFeatureStreet(ft); +} + +void Editor::ForEachFeatureAtPoint(TFeatureTypeFn && fn, m2::PointD const & point) const +{ + if (!m_delegate) + { + LOG(LERROR, ("Can't load features in point's vicinity, delegate is not set.")); + return; + } + m_delegate->ForEachFeatureAtPoint(move(fn), point); +} + string DebugPrint(Editor::FeatureStatus fs) { switch (fs) diff --git a/indexer/osm_editor.hpp b/indexer/osm_editor.hpp index 57044db36b..cb36ec7a94 100644 --- a/indexer/osm_editor.hpp +++ b/indexer/osm_editor.hpp @@ -51,6 +51,16 @@ public: using TForEachFeaturesNearByFn = function<void(TFeatureTypeFn && /*fn*/, m2::PointD const & /*mercator*/)>; + struct Delegate + { + virtual ~Delegate() = default; + + virtual MwmSet::MwmId GetMwmIdByMapName(string const & name) const = 0; + virtual unique_ptr<FeatureType> GetOriginalFeature(FeatureID const & fid) const = 0; + virtual string GetOriginalFeatureStreet(FeatureType & ft) const = 0; + virtual void ForEachFeatureAtPoint(TFeatureTypeFn && fn, m2::PointD const & point) const = 0; + }; + enum class UploadResult { Success, @@ -72,8 +82,7 @@ public: static Editor & Instance(); - // Reference to the index will be used in editor functors, it should not be temporary object. - void SetIndex(Index const & index); + inline void SetDelegate(unique_ptr<Delegate> delegate) { m_delegate = move(delegate); } inline void SetStorageForTesting(unique_ptr<editor::StorageBase> storage) { @@ -225,20 +234,20 @@ private: void MarkFeatureWithStatus(FeatureID const & fid, FeatureStatus status); + // These methods are just checked wrappers around Delegate. + MwmSet::MwmId GetMwmIdByMapName(string const & name); + unique_ptr<FeatureType> GetOriginalFeature(FeatureID const & fid) const; + string GetOriginalFeatureStreet(FeatureType & ft) const; + void ForEachFeatureAtPoint(TFeatureTypeFn && fn, m2::PointD const & point) const; + // TODO(AlexZ): Synchronize multithread access. /// Deleted, edited and created features. map<MwmSet::MwmId, map<uint32_t, FeatureTypeInfo>> m_features; - /// Get MwmId for each map, used in FeatureIDs and to check if edits are up-to-date. - TMwmIdByMapNameFn m_mwmIdByMapNameFn; + unique_ptr<Delegate> m_delegate; + /// Invalidate map viewport after edits. TInvalidateFn m_invalidateFn; - /// Get FeatureType from mwm. - TFeatureLoaderFn m_getOriginalFeatureFn; - /// Get feature original street name or empty string. - TFeatureOriginalStreetFn m_getOriginalFeatureStreetFn; - /// Iterate over all features in some area that includes given point. - TForEachFeaturesNearByFn m_forEachFeatureAtPointFn; /// Contains information about what and how can be edited. editor::EditorConfigWrapper m_config; |