Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuri Gorshenin <y@maps.me>2016-09-01 17:23:57 +0300
committerYuri Gorshenin <y@maps.me>2016-09-01 18:27:59 +0300
commit30ef25bfb34beab674320723f1bcc598a784fffe (patch)
treedf87e64e58605358d779142f389eca51bde4af1a /indexer
parenta43c309fc7adfbd853133debc712a86be3d149f9 (diff)
[indexer] Removed indexer dependency on search.
Diffstat (limited to 'indexer')
-rw-r--r--indexer/indexer_tests/osm_editor_test.cpp24
-rw-r--r--indexer/indexer_tests_support/helpers.cpp6
-rw-r--r--indexer/indexer_tests_support/helpers.hpp4
-rw-r--r--indexer/osm_editor.cpp110
-rw-r--r--indexer/osm_editor.hpp29
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;