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:
authorAnatoly Serdtcev <serdtcev@maps.me>2019-05-14 18:00:32 +0300
committermpimenov <mpimenov@users.noreply.github.com>2019-05-15 15:56:43 +0300
commit51bf87efa7659062b1d6fb1f3d694cd1de91bf70 (patch)
tree85fc8305313f1587b8d18b77bd96866831fbfc79 /geocoder
parentc11c41d67738500b0d1eeea7170a775441578cae (diff)
[geocoder] Fix search of street with number and street synonym together
Diffstat (limited to 'geocoder')
-rw-r--r--geocoder/geocoder.cpp11
-rw-r--r--geocoder/geocoder_tests/geocoder_tests.cpp36
2 files changed, 44 insertions, 3 deletions
diff --git a/geocoder/geocoder.cpp b/geocoder/geocoder.cpp
index 53c62df6a2..8d96fdecec 100644
--- a/geocoder/geocoder.cpp
+++ b/geocoder/geocoder.cpp
@@ -18,6 +18,8 @@
#include <thread>
#include <utility>
+#include <boost/optional.hpp>
+
using namespace std;
namespace
@@ -268,15 +270,18 @@ void Geocoder::Go(Context & ctx, Type type) const
continue;
ScopedMarkTokens mark(ctx, type, i, j + 1);
+ boost::optional<ScopedMarkTokens> streetSynonymMark;
double certainty = 0;
vector<Type> allTypes;
for (size_t tokId = 0; tokId < ctx.GetNumTokens(); ++tokId)
{
auto const t = ctx.GetTokenType(tokId);
-
- if (t == Type::Street && search::IsStreetSynonym(strings::MakeUniString(ctx.GetToken(tokId))))
- continue;
+ if (type == Type::Street && t == Type::Count && !streetSynonymMark)
+ {
+ if (search::IsStreetSynonym(strings::MakeUniString(ctx.GetToken(tokId))))
+ streetSynonymMark.emplace(ctx, Type::Street, tokId, tokId + 1);
+ }
certainty += GetWeight(t);
if (t != Type::Count)
diff --git a/geocoder/geocoder_tests/geocoder_tests.cpp b/geocoder/geocoder_tests/geocoder_tests.cpp
index 95ecd182ab..1f61253e59 100644
--- a/geocoder/geocoder_tests/geocoder_tests.cpp
+++ b/geocoder/geocoder_tests/geocoder_tests.cpp
@@ -153,6 +153,42 @@ UNIT_TEST(Geocoder_MismatchedLocality)
TestGeocoder(geocoder, "Moscow Krymskaya 3", {});
}
+UNIT_TEST(Geocoder_StreetWithNumber)
+{
+ string const kData = R"#(
+10 {"properties": {"address": {"locality": "Москва"}}}
+20 {"properties": {"address": {"locality": "Краснокамск"}}}
+
+11 {"properties": {"address": {"locality": "Москва", "street": "улица 1905 года"}}}
+
+12 {"properties": {"address": {"locality": "Москва", "street": "4-я улица 8 Марта"}}}
+
+13 {"properties": {"address": {"locality": "Москва", "street": "8 Марта"}}}
+
+21 {"properties": {"address": {"locality": "Краснокамск", "street": "улица 8 Марта"}}}
+25 {"properties": {"address": {"locality": "Краснокамск", "street": "Январская улица"}}}
+26 {"properties": {"address": {"locality": "Краснокамск", "street": "Январская улица", "building": "8"}}}
+)#";
+
+ ScopedFile const regionsJsonFile("regions.jsonl", kData);
+ Geocoder geocoder(regionsJsonFile.GetFullPath());
+
+ using Id = base::GeoObjectId;
+ TestGeocoder(geocoder, "Москва, улица 1905 года", {{Id{11}, 1.0}});
+ TestGeocoder(geocoder, "Москва, 1905 года", {{Id{11}, 1.0}});
+ TestGeocoder(geocoder, "Краснокамск, улица 1905 года", {});
+
+ TestGeocoder(geocoder, "Москва, 4-я улица 8 Марта", {{Id{12}, 1.0}});
+ TestGeocoder(geocoder, "Москва, 4-я 8 Марта", {{Id{12}, 1.0}});
+
+ TestGeocoder(geocoder, "Москва, 8 Марта", {{Id{13}, 1.0}});
+ TestGeocoder(geocoder, "Москва, улица 8 Марта", {{Id{13}, 1.0}});
+
+ TestGeocoder(geocoder, "Краснокамск, улица 8 Марта", {{Id{21}, 1.0}});
+ TestGeocoder(geocoder, "Краснокамск, 8 Марта", {{Id{21}, 1.0}});
+ TestGeocoder(geocoder, "Краснокамск, Январская 8", {{Id{26}, 1.0}});
+}
+
UNIT_TEST(Geocoder_LocalityBuilding)
{
string const kData = R"#(