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-12 17:03:20 +0300
committerYuri Gorshenin <y@maps.me>2016-09-12 17:09:24 +0300
commit96682f747663b5c3d1d8166c0f5ef340d8e8211f (patch)
treee4d4921ddf844f0140b5c2382a46c691d36779c1
parent16a2be0f43ec3b330ea33f119a7a7b8e2c50e37b (diff)
[search] Fixed (and accelerated) coords search.
-rw-r--r--search/emitter.hpp38
-rw-r--r--search/processor.cpp38
-rw-r--r--search/processor.hpp8
-rw-r--r--search/ranker.cpp31
-rw-r--r--search/ranker.hpp15
-rw-r--r--search/search.pro1
-rw-r--r--search/search_integration_tests/pre_ranker_test.cpp8
-rw-r--r--search/search_integration_tests/processor_test.cpp16
8 files changed, 103 insertions, 52 deletions
diff --git a/search/emitter.hpp b/search/emitter.hpp
new file mode 100644
index 0000000000..8989a5ef09
--- /dev/null
+++ b/search/emitter.hpp
@@ -0,0 +1,38 @@
+#pragma once
+
+#include "search/result.hpp"
+#include "search/search_params.hpp"
+
+namespace search
+{
+class Emitter
+{
+public:
+ inline void Init(SearchParams::TOnResults onResults)
+ {
+ m_onResults = onResults;
+ m_results.Clear();
+ }
+
+ inline bool AddResult(Result && res) { return m_results.AddResult(move(res)); }
+ inline void AddResultNoChecks(Result && res) { m_results.AddResultNoChecks(move(res)); }
+
+ inline void Emit()
+ {
+ if (m_onResults)
+ m_onResults(m_results);
+ }
+
+ inline Results const & GetResults() const { return m_results; }
+
+ inline void Finish(bool cancelled)
+ {
+ if (m_onResults)
+ m_onResults(Results::GetEndMarker(cancelled));
+ }
+
+private:
+ SearchParams::TOnResults m_onResults;
+ Results m_results;
+};
+} // namespace search
diff --git a/search/processor.cpp b/search/processor.cpp
index c23de90ece..b3b27dff3c 100644
--- a/search/processor.cpp
+++ b/search/processor.cpp
@@ -145,8 +145,9 @@ Processor::Processor(Index const & index, CategoriesHolder const & categories,
, m_minDistanceOnMapBetweenResults(0.0)
, m_mode(Mode::Everywhere)
, m_suggestsEnabled(true)
+ , m_ranker(index, m_emitter, infoGetter, categories, suggests,
+ static_cast<my::Cancellable const &>(*this))
, m_preRanker(index, m_ranker, kPreResultsCount)
- , m_ranker(index, infoGetter, categories, suggests, static_cast<my::Cancellable const &>(*this))
, m_geocoder(index, infoGetter, m_preRanker, static_cast<my::Cancellable const &>(*this))
{
// Initialize keywords scorer.
@@ -407,24 +408,17 @@ void Processor::Search(SearchParams const & params, m2::RectD const & viewport)
Geocoder::Params geocoderParams;
InitGeocoder(geocoderParams);
-
InitPreRanker(geocoderParams);
InitRanker(geocoderParams);
-
- try
- {
- SearchCoordinates(m_ranker.GetResults());
- }
- catch (CancelException const &)
- {
- LOG(LDEBUG, ("Search has been cancelled."));
- }
+ InitEmitter();
try
{
if (params.m_onStarted)
params.m_onStarted();
+ SearchCoordinates();
+
if (viewportSearch)
{
m_geocoder.GoInViewport();
@@ -432,7 +426,7 @@ void Processor::Search(SearchParams const & params, m2::RectD const & viewport)
else
{
if (m_tokens.empty())
- m_ranker.SuggestStrings(m_ranker.GetResults());
+ m_ranker.SuggestStrings();
m_geocoder.GoEverywhere();
}
@@ -445,22 +439,19 @@ void Processor::Search(SearchParams const & params, m2::RectD const & viewport)
}
if (!viewportSearch && !IsCancelled())
- SendStatistics(params, viewport, m_ranker.GetResults());
+ SendStatistics(params, viewport, m_emitter.GetResults());
// Emit finish marker to client.
- params.m_onResults(Results::GetEndMarker(IsCancelled()));
+ m_emitter.Finish(IsCancelled());
}
-void Processor::SearchCoordinates(Results & res) const
+void Processor::SearchCoordinates()
{
double lat, lon;
- if (MatchLatLonDegree(m_query, lat, lon))
- {
- ASSERT_EQUAL(res.GetCount(), 0, ());
- // Note that ranker's locale is not set up here but
- // it is never used when making lat-lon results anyway.
- res.AddResultNoChecks(m_ranker.MakeResult(PreResult2(lat, lon)));
- }
+ if (!MatchLatLonDegree(m_query, lat, lon))
+ return;
+ m_emitter.AddResultNoChecks(m_ranker.MakeResult(PreResult2(lat, lon)));
+ m_emitter.Emit();
}
namespace
@@ -724,10 +715,11 @@ void Processor::InitRanker(Geocoder::Params const & geocoderParams)
params.m_categoryLocales = GetCategoryLocales();
params.m_accuratePivotCenter = GetPivotPoint();
params.m_viewportSearch = viewportSearch;
- params.m_onResults = m_onResults;
m_ranker.Init(params, geocoderParams);
}
+void Processor::InitEmitter() { m_emitter.Init(m_onResults); }
+
void Processor::ClearCaches()
{
for (size_t i = 0; i < COUNT_V; ++i)
diff --git a/search/processor.hpp b/search/processor.hpp
index e71d5e1a55..9ce7f8de9c 100644
--- a/search/processor.hpp
+++ b/search/processor.hpp
@@ -1,4 +1,5 @@
#pragma once
+#include "search/emitter.hpp"
#include "search/geocoder.hpp"
#include "search/mode.hpp"
#include "search/pre_ranker.hpp"
@@ -99,12 +100,14 @@ public:
void Search(SearchParams const & params, m2::RectD const & viewport);
// Tries to generate a (lat, lon) result from |m_query|.
- void SearchCoordinates(Results & res) const;
+ void SearchCoordinates();
void InitParams(QueryParams & params);
+
void InitGeocoder(Geocoder::Params & params);
void InitPreRanker(Geocoder::Params const & geocoderParams);
void InitRanker(Geocoder::Params const & geocoderParams);
+ void InitEmitter();
void ClearCaches();
@@ -173,8 +176,9 @@ protected:
protected:
bool m_viewportSearch;
- PreRanker m_preRanker;
+ Emitter m_emitter;
Ranker m_ranker;
+ PreRanker m_preRanker;
Geocoder m_geocoder;
};
} // namespace search
diff --git a/search/ranker.cpp b/search/ranker.cpp
index a8ddf30c5e..57505d907a 100644
--- a/search/ranker.cpp
+++ b/search/ranker.cpp
@@ -1,3 +1,4 @@
+#include "search/emitter.hpp"
#include "search/ranker.hpp"
#include "search/string_intersection.hpp"
#include "search/token_slice.hpp"
@@ -275,13 +276,14 @@ public:
// static
size_t const Ranker::kBatchSize = 10;
-Ranker::Ranker(Index const & index, storage::CountryInfoGetter const & infoGetter,
- CategoriesHolder const & categories, vector<Suggest> const & suggests,
- my::Cancellable const & cancellable)
+Ranker::Ranker(Index const & index, Emitter & emitter,
+ storage::CountryInfoGetter const & infoGetter, CategoriesHolder const & categories,
+ vector<Suggest> const & suggests, my::Cancellable const & cancellable)
: m_reverseGeocoder(index)
, m_cancellable(cancellable)
, m_locality(index)
, m_index(index)
+ , m_emitter(emitter)
, m_infoGetter(infoGetter)
, m_categories(categories)
, m_suggests(suggests)
@@ -294,7 +296,6 @@ void Ranker::Init(Params const & params, Geocoder::Params const & geocoderParams
m_geocoderParams = geocoderParams;
m_preResults1.clear();
m_tentativeResults.clear();
- m_results.Clear();
}
bool Ranker::IsResultExists(PreResult2 const & p, vector<IndexedValue> const & values)
@@ -408,7 +409,7 @@ void Ranker::GetSuggestion(string const & name, string & suggest) const
}
}
-void Ranker::SuggestStrings(Results & res)
+void Ranker::SuggestStrings()
{
if (m_params.m_prefix.empty() || !m_params.m_suggestsEnabled)
return;
@@ -417,11 +418,11 @@ void Ranker::SuggestStrings(Results & res)
GetStringPrefix(m_params.m_query, prologue);
for (int i = 0; i < m_params.m_categoryLocales.size(); ++i)
- MatchForSuggestions(m_params.m_prefix, m_params.m_categoryLocales[i], prologue, res);
+ MatchForSuggestions(m_params.m_prefix, m_params.m_categoryLocales[i], prologue);
}
void Ranker::MatchForSuggestions(strings::UniString const & token, int8_t locale,
- string const & prologue, Results & res)
+ string const & prologue)
{
for (auto const & suggest : m_suggests)
{
@@ -434,7 +435,7 @@ void Ranker::MatchForSuggestions(strings::UniString const & token, int8_t locale
string const utf8Str = strings::ToUtf8(s);
Result r(utf8Str, prologue + utf8Str + " ");
MakeResultHighlight(r);
- res.AddResult(move(r));
+ m_emitter.AddResult(move(r));
}
}
}
@@ -455,7 +456,7 @@ void Ranker::GetBestMatchName(FeatureType const & f, string & name) const
UNUSED_VALUE(f.ForEachName(bestNameFinder));
}
-void Ranker::ProcessSuggestions(vector<IndexedValue> & vec, Results & res) const
+void Ranker::ProcessSuggestions(vector<IndexedValue> & vec) const
{
if (m_params.m_prefix.empty() || !m_params.m_suggestsEnabled)
return;
@@ -472,7 +473,7 @@ void Ranker::ProcessSuggestions(vector<IndexedValue> & vec, Results & res) const
GetSuggestion(r.GetName(), suggest);
if (!suggest.empty() && added < MAX_SUGGESTS_COUNT)
{
- if (res.AddResult((Result(MakeResult(r), suggest))))
+ if (m_emitter.AddResult(Result(MakeResult(r), suggest)))
++added;
i = vec.erase(i);
@@ -502,11 +503,11 @@ void Ranker::UpdateResults(bool lastUpdate)
{
sort(m_tentativeResults.rbegin(), m_tentativeResults.rend(),
my::LessBy(&IndexedValue::GetRank));
- ProcessSuggestions(m_tentativeResults, m_results);
+ ProcessSuggestions(m_tentativeResults);
}
// Emit feature results.
- size_t count = m_results.GetCount();
+ size_t count = m_emitter.GetResults().GetCount();
size_t i;
for (i = 0; i < m_tentativeResults.size(); ++i)
{
@@ -516,7 +517,7 @@ void Ranker::UpdateResults(bool lastUpdate)
if (m_params.m_viewportSearch)
{
- m_results.AddResultNoChecks(
+ m_emitter.AddResultNoChecks(
(*m_tentativeResults[i])
.GenerateFinalResult(m_infoGetter, &m_categories, &m_params.m_preferredTypes,
m_params.m_currentLocaleCode,
@@ -530,7 +531,7 @@ void Ranker::UpdateResults(bool lastUpdate)
LOG(LDEBUG, (m_tentativeResults[i]));
auto const & preResult2 = *m_tentativeResults[i];
- if (m_results.AddResult(MakeResult(preResult2)))
+ if (m_emitter.AddResult(MakeResult(preResult2)))
++count;
}
}
@@ -539,7 +540,7 @@ void Ranker::UpdateResults(bool lastUpdate)
m_preResults1.clear();
BailIfCancelled();
- m_params.m_onResults(m_results);
+ m_emitter.Emit();
}
void Ranker::ClearCaches()
diff --git a/search/ranker.hpp b/search/ranker.hpp
index ec3abbdd2b..0792b7ff83 100644
--- a/search/ranker.hpp
+++ b/search/ranker.hpp
@@ -34,6 +34,7 @@ class CountryInfoGetter;
namespace search
{
+class Emitter;
class PreResult2Maker;
class Ranker
@@ -62,12 +63,11 @@ public:
TLocales m_categoryLocales;
size_t m_limit = 0;
- SearchParams::TOnResults m_onResults;
};
static size_t const kBatchSize;
- Ranker(Index const & index, storage::CountryInfoGetter const & infoGetter,
+ Ranker(Index const & index, Emitter & emitter, storage::CountryInfoGetter const & infoGetter,
CategoriesHolder const & categories, vector<Suggest> const & suggests,
my::Cancellable const & cancellable);
virtual ~Ranker() = default;
@@ -83,17 +83,14 @@ public:
void MakeResultHighlight(Result & res) const;
void GetSuggestion(string const & name, string & suggest) const;
- void SuggestStrings(Results & res);
- void MatchForSuggestions(strings::UniString const & token, int8_t locale, string const & prolog,
- Results & res);
+ void SuggestStrings();
+ void MatchForSuggestions(strings::UniString const & token, int8_t locale, string const & prolog);
void GetBestMatchName(FeatureType const & f, string & name) const;
- void ProcessSuggestions(vector<IndexedValue> & vec, Results & res) const;
+ void ProcessSuggestions(vector<IndexedValue> & vec) const;
virtual void SetPreResults1(vector<PreResult1> && preResults1) { m_preResults1 = move(preResults1); }
virtual void UpdateResults(bool lastUpdate);
- inline Results & GetResults() { return m_results; }
-
void ClearCaches();
inline void SetLocalityFinderLanguage(int8_t code) { m_locality.SetLanguage(code); }
@@ -133,12 +130,12 @@ private:
mutable LocalityFinder m_locality;
Index const & m_index;
+ Emitter & m_emitter;
storage::CountryInfoGetter const & m_infoGetter;
CategoriesHolder const & m_categories;
vector<Suggest> const & m_suggests;
vector<PreResult1> m_preResults1;
vector<IndexedValue> m_tentativeResults;
- Results m_results;
};
} // namespace search
diff --git a/search/search.pro b/search/search.pro
index dd1732c817..eadec170f1 100644
--- a/search/search.pro
+++ b/search/search.pro
@@ -19,6 +19,7 @@ HEADERS += \
downloader_search_callback.hpp \
dummy_rank_table.hpp \
editor_delegate.hpp \
+ emitter.hpp \
engine.hpp \
everywhere_search_params.hpp \
feature_offset_match.hpp \
diff --git a/search/search_integration_tests/pre_ranker_test.cpp b/search/search_integration_tests/pre_ranker_test.cpp
index d97c79758f..f54dd1cbb4 100644
--- a/search/search_integration_tests/pre_ranker_test.cpp
+++ b/search/search_integration_tests/pre_ranker_test.cpp
@@ -1,5 +1,6 @@
#include "testing/testing.hpp"
+#include "search/emitter.hpp"
#include "search/intermediate_result.hpp"
#include "search/model.hpp"
#include "search/pre_ranker.hpp"
@@ -42,9 +43,9 @@ namespace
class TestRanker : public Ranker
{
public:
- TestRanker(TestSearchEngine & engine, vector<Suggest> const & suggests,
+ TestRanker(TestSearchEngine & engine, Emitter & emitter, vector<Suggest> const & suggests,
my::Cancellable const & cancellable, vector<PreResult1> & results)
- : Ranker(static_cast<Index const &>(engine), engine.GetCountryInfoGetter(),
+ : Ranker(static_cast<Index const &>(engine), emitter, engine.GetCountryInfoGetter(),
GetDefaultCategories(), suggests, cancellable)
, m_results(results)
{
@@ -109,7 +110,8 @@ UNIT_CLASS_TEST(PreRankerTest, Smoke)
});
vector<PreResult1> results;
- TestRanker ranker(m_engine, m_suggests, m_cancellable, results);
+ Emitter emitter;
+ TestRanker ranker(m_engine, emitter, m_suggests, m_cancellable, results);
PreRanker preRanker(m_engine, ranker, pois.size());
PreRanker::Params params;
diff --git a/search/search_integration_tests/processor_test.cpp b/search/search_integration_tests/processor_test.cpp
index ba9a6344af..16cef90ad7 100644
--- a/search/search_integration_tests/processor_test.cpp
+++ b/search/search_integration_tests/processor_test.cpp
@@ -12,6 +12,7 @@
#include "indexer/feature.hpp"
#include "indexer/index.hpp"
+#include "geometry/mercator.hpp"
#include "geometry/point2d.hpp"
#include "geometry/rect2d.hpp"
@@ -644,5 +645,20 @@ UNIT_CLASS_TEST(ProcessorTest, TestCategories)
{ExactMatch(wonderlandId, nonameBeach), ExactMatch(wonderlandId, namedBeach)}),
());
}
+
+UNIT_CLASS_TEST(ProcessorTest, TestCoords)
+{
+ auto request = MakeRequest("51.681644 39.183481");
+ auto const & results = request->Results();
+ TEST_EQUAL(results.size(), 1, ());
+
+ auto const & result = results[0];
+ TEST_EQUAL(result.GetResultType(), Result::RESULT_LATLON, ());
+ TEST(result.HasPoint(), ());
+
+ m2::PointD const expected = MercatorBounds::FromLatLon(51.681644, 39.183481);
+ auto const actual = result.GetFeatureCenter();
+ TEST(MercatorBounds::DistanceOnEarth(expected, actual) <= 1.0, ());
+}
} // namespace
} // namespace search