Review fixes.

This commit is contained in:
Yuri Gorshenin 2016-02-04 17:56:23 +03:00 committed by Sergey Yershov
parent ecdfcd0e2e
commit d74f4f83a2
6 changed files with 71 additions and 75 deletions

View file

@ -69,8 +69,8 @@ public:
infoGetter.AddCountry(storage::CountryDef(name, rect));
}
template <typename TFn>
MwmSet::MwmId RegisterMwm(string const & name, feature::DataHeader::MapType type, TFn && fn)
template <typename TBuildFn>
MwmSet::MwmId BuildMwm(string const & name, feature::DataHeader::MapType type, TBuildFn && fn)
{
m_files.emplace_back(m_platform.WritableDir(), platform::CountryFile(name), 0 /* version */);
auto & file = m_files.back();
@ -161,39 +161,39 @@ UNIT_CLASS_TEST(SearchQueryV2Test, Smoke)
auto const lantern1 = make_shared<TestPOI>(m2::PointD(10.0005, 10.0005), "lantern 1", "en");
auto const lantern2 = make_shared<TestPOI>(m2::PointD(10.0006, 10.0005), "lantern 2", "en");
RegisterMwm("testWorld", feature::DataHeader::world, [&](TestMwmBuilder & builder)
{
builder.Add(*wonderlandCountry);
builder.Add(*losAlamosCity);
builder.Add(*mskCity);
});
BuildMwm("testWorld", feature::DataHeader::world, [&](TestMwmBuilder & builder)
{
builder.Add(*wonderlandCountry);
builder.Add(*losAlamosCity);
builder.Add(*mskCity);
});
auto wonderlandId =
RegisterMwm("wonderland", feature::DataHeader::country, [&](TestMwmBuilder & builder)
{
builder.Add(*losAlamosCity);
builder.Add(*mskCity);
builder.Add(*longPondVillage);
BuildMwm("wonderland", feature::DataHeader::country, [&](TestMwmBuilder & builder)
{
builder.Add(*losAlamosCity);
builder.Add(*mskCity);
builder.Add(*longPondVillage);
builder.Add(*feynmanStreet);
builder.Add(*bohrStreet1);
builder.Add(*bohrStreet2);
builder.Add(*bohrStreet3);
builder.Add(*firstAprilStreet);
builder.Add(*feynmanStreet);
builder.Add(*bohrStreet1);
builder.Add(*bohrStreet2);
builder.Add(*bohrStreet3);
builder.Add(*firstAprilStreet);
builder.Add(*feynmanHouse);
builder.Add(*bohrHouse);
builder.Add(*hilbertHouse);
builder.Add(*descartesHouse);
builder.Add(*bornHouse);
builder.Add(*feynmanHouse);
builder.Add(*bohrHouse);
builder.Add(*hilbertHouse);
builder.Add(*descartesHouse);
builder.Add(*bornHouse);
builder.Add(*busStop);
builder.Add(*tramStop);
builder.Add(*quantumTeleport1);
builder.Add(*quantumTeleport2);
builder.Add(*quantumCafe);
builder.Add(*lantern1);
builder.Add(*lantern2);
});
builder.Add(*busStop);
builder.Add(*tramStop);
builder.Add(*quantumTeleport1);
builder.Add(*quantumTeleport2);
builder.Add(*quantumCafe);
builder.Add(*lantern1);
builder.Add(*lantern2);
});
RegisterCountry("wonderland", m2::RectD(m2::PointD(-1.0, -1.0), m2::PointD(10.1, 10.1)));
@ -269,12 +269,12 @@ UNIT_CLASS_TEST(SearchQueryV2Test, SearchInWorld)
auto const losAlamos =
make_shared<TestCity>(m2::PointD(0, 0), "Los Alamos", "en", 100 /* rank */);
auto testWorldId = RegisterMwm("testWorld", feature::DataHeader::world,
[&](TestMwmBuilder & builder)
{
builder.Add(*wonderland);
builder.Add(*losAlamos);
});
auto testWorldId = BuildMwm("testWorld", feature::DataHeader::world,
[&](TestMwmBuilder & builder)
{
builder.Add(*wonderland);
builder.Add(*losAlamos);
});
RegisterCountry("Wonderland", m2::RectD(m2::PointD(-1.0, -1.0), m2::PointD(1.0, 1.0)));
@ -301,15 +301,15 @@ UNIT_CLASS_TEST(SearchQueryV2Test, SearchByName)
m2::PointD(1.5, 1.5), m2::PointD(0.5, 1.5)},
"Hyde Park", "en");
RegisterMwm("testWorld", feature::DataHeader::world, [&](TestMwmBuilder & builder)
{
builder.Add(*london);
});
auto wonderlandId = RegisterMwm("wonderland", feature::DataHeader::country,
[&](TestMwmBuilder & builder)
{
builder.Add(*hydePark);
});
BuildMwm("testWorld", feature::DataHeader::world, [&](TestMwmBuilder & builder)
{
builder.Add(*london);
});
auto wonderlandId = BuildMwm("wonderland", feature::DataHeader::country,
[&](TestMwmBuilder & builder)
{
builder.Add(*hydePark);
});
RegisterCountry("Wonderland", m2::RectD(m2::PointD(0, 0), m2::PointD(2, 2)));
SetViewport(m2::RectD(m2::PointD(-1.0, -1.0), m2::PointD(-0.9, -0.9)));
@ -317,4 +317,5 @@ UNIT_CLASS_TEST(SearchQueryV2Test, SearchByName)
TRules rules = {make_shared<ExactMatch>(wonderlandId, hydePark)};
TEST(ResultsMatch("hyde park", rules), ());
TEST(ResultsMatch("london hyde park", rules), ());
TEST(ResultsMatch("hyde london park", TRules()), ());
}

View file

@ -194,8 +194,6 @@ void TestBuilding::Serialize(FeatureBuilder1 & fb) const
auto const & classificator = classif();
fb.SetType(classificator.GetTypeByPath({"building"}));
fb.PreSerialize();
}
bool TestBuilding::Matches(FeatureType const & feature) const
@ -229,8 +227,6 @@ void TestPark::Serialize(FeatureBuilder1 & fb) const
auto const & classificator = classif();
fb.SetType(classificator.GetTypeByPath({"leisure", "park"}));
fb.PreSerialize();
}
string TestPark::ToString() const

View file

@ -75,7 +75,7 @@ public:
case SearchModel::SEARCH_TYPE_STATE:
case SearchModel::SEARCH_TYPE_COUNTRY:
case SearchModel::SEARCH_TYPE_UNCLASSIFIED:
case SearchModel::SEARCH_TYPE_COUNT:
case SearchModel::SEARCH_TYPE_COUNT:
ASSERT(false, ("Invalid parent layer type:", parent.m_type));
break;
case SearchModel::SEARCH_TYPE_BUILDING:

View file

@ -1227,6 +1227,14 @@ void Geocoder::FindPaths()
void Geocoder::MatchUnclassified(size_t curToken)
{
ASSERT(m_layers.empty(), ());
// We need to match all unused tokens to UNCLASSIFIED features,
// therefore unused tokens must be adjacent to each other. For
// example, as parks are UNCLASSIFIED now, it's ok to match "London
// Hyde Park", because London will be matched as a city and rest
// adjacent tokens will be matched to "Hyde Park", whereas it's not
// ok to match something to "Park London Hyde", because tokens
// "Park" and "Hyde" are not adjacent.
if (NumUnusedTokensGroups() != 1)
return;
@ -1239,7 +1247,10 @@ void Geocoder::MatchUnclassified(size_t curToken)
allFeatures.Intersect(m_addressFeatures[curToken].get());
}
if (coding::CompressedBitVector::IsEmpty(allFeatures.Get()))
if (m_filter.NeedToFilter(*allFeatures))
allFeatures.Set(m_filter.Filter(*allFeatures).release(), true /* isOwner */);
if (allFeatures.IsEmpty())
return;
auto emitUnclassified = [&](uint32_t featureId)
@ -1352,17 +1363,13 @@ bool Geocoder::HasUsedTokensInRange(size_t from, size_t to) const
size_t Geocoder::NumUnusedTokensGroups() const
{
if (m_usedTokens.begin() == m_usedTokens.end())
return 0;
size_t numBorders = 0;
for (size_t i = 1; i < m_usedTokens.size(); ++i)
size_t numGroups = 0;
for (size_t i = 0; i < m_usedTokens.size(); ++i)
{
if (m_usedTokens[i] != m_usedTokens[i - 1])
++numBorders;
if (!m_usedTokens[i] && (i == 0 || m_usedTokens[i - 1]))
++numGroups;
}
size_t const numGroups = numBorders + 1;
return m_usedTokens[0] ? numGroups / 2 : (numGroups + 1) / 2;
return numGroups;
}
size_t Geocoder::SkipUsedTokens(size_t curToken) const

View file

@ -234,7 +234,7 @@ private:
// it uses pre-loaded lists of streets and villages.
SearchModel::SearchType GetSearchTypeInGeocoding(uint32_t featureId);
// Returns true if all tokens are used.
// Returns true iff all tokens are used.
bool AllTokensUsed() const;
// Returns true if there exists at least one used token in [from,
@ -245,7 +245,7 @@ private:
size_t NumUnusedTokensGroups() const;
// Advances |curToken| to the nearest unused token, or to the end of
// |m_usedTokens| if there're no unused tokens.
// |m_usedTokens| if there are no unused tokens.
size_t SkipUsedTokens(size_t curToken) const;
Index & m_index;

View file

@ -19,23 +19,15 @@ void IntersectionResult::Set(SearchModel::SearchType type, uint32_t id)
{
switch (type)
{
case SearchModel::SEARCH_TYPE_POI:
m_poi = id;
break;
case SearchModel::SEARCH_TYPE_BUILDING:
m_building = id;
break;
case SearchModel::SEARCH_TYPE_STREET:
m_street = id;
break;
case SearchModel::SEARCH_TYPE_POI: m_poi = id; break;
case SearchModel::SEARCH_TYPE_BUILDING: m_building = id; break;
case SearchModel::SEARCH_TYPE_STREET: m_street = id; break;
case SearchModel::SEARCH_TYPE_CITY:
case SearchModel::SEARCH_TYPE_VILLAGE:
case SearchModel::SEARCH_TYPE_STATE:
case SearchModel::SEARCH_TYPE_COUNTRY:
case SearchModel::SEARCH_TYPE_UNCLASSIFIED:
case SearchModel::SEARCH_TYPE_COUNT:
ASSERT(false, ("Unsupported types."));
break;
case SearchModel::SEARCH_TYPE_COUNT: ASSERT(false, ("Unsupported type.")); break;
}
}