[search] If category name starts with digit, it represents a minimal prefix length to start suggest.

This commit is contained in:
Yury Melnichek 2011-06-18 16:58:32 +02:00 committed by Alex Zolotarev
parent 6b7c05b913
commit e1ba349a1f
3 changed files with 50 additions and 22 deletions

View file

@ -75,7 +75,23 @@ size_t CategoriesHolder::LoadFromStream(istream & stream)
}
while (++iter)
{
cat.m_synonyms.push_back(make_pair(langCode, *iter));
Category::Name name;
name.m_Lang = langCode;
name.m_Name = *iter;
// ASSERT(name.m_Name.empty(), ());
if (name.m_Name.empty())
continue;
if (name.m_Name[0] >= '0' && name.m_Name[0] <= '9')
{
name.m_prefixLengthToSuggest = name.m_Name[0] - '0';
name.m_Name = name.m_Name.substr(1);
}
else
name.m_prefixLengthToSuggest = 10;
cat.m_synonyms.push_back(name);
}
}
break;

View file

@ -3,7 +3,6 @@
#include "../std/vector.hpp"
#include "../std/string.hpp"
#include "../std/utility.hpp"
#include "../std/fstream.hpp"
#include "../std/algorithm.hpp"
@ -14,8 +13,16 @@ struct Category
{
/// Classificator types
vector<uint32_t> m_types;
struct Name
{
string m_Name;
int8_t m_Lang;
uint8_t m_prefixLengthToSuggest;
};
/// <language, synonym>
vector<pair<int8_t, string> > m_synonyms;
vector<Name> m_synonyms;
};
class CategoriesHolder

View file

@ -12,12 +12,12 @@
#include "../../std/sstream.hpp"
char const * TEST_STRING = "amenity-bench\n"
"en:bench|sit down|to sit\n"
"de:bank|auf die strafbank schicken\n"
"en:1bench|sit down|to sit\n"
"de:0bank|auf die strafbank schicken\n"
"\n"
"place-village|place-hamlet\n"
"en:village\n"
"de:dorf|weiler";
"de:2dorf|4weiler";
struct Checker
{
@ -31,16 +31,19 @@ struct Checker
{
TEST_EQUAL(cat.m_types.size(), 1, ());
TEST_EQUAL(cat.m_synonyms.size(), 5, ());
TEST_EQUAL(cat.m_synonyms[0].first, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[0].second, "bench", ());
TEST_EQUAL(cat.m_synonyms[1].first, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[1].second, "sit down", ());
TEST_EQUAL(cat.m_synonyms[2].first, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[2].second, "to sit", ());
TEST_EQUAL(cat.m_synonyms[3].first, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[3].second, "bank", ());
TEST_EQUAL(cat.m_synonyms[4].first, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[4].second, "auf die strafbank schicken", ());
TEST_EQUAL(cat.m_synonyms[0].m_Lang, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[0].m_Name, "bench", ());
TEST_EQUAL(cat.m_synonyms[0].m_prefixLengthToSuggest, 1, ());
TEST_EQUAL(cat.m_synonyms[1].m_Lang, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[1].m_Name, "sit down", ());
TEST_EQUAL(cat.m_synonyms[1].m_prefixLengthToSuggest, 10, ());
TEST_EQUAL(cat.m_synonyms[2].m_Lang, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[2].m_Name, "to sit", ());
TEST_EQUAL(cat.m_synonyms[3].m_Lang, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[3].m_Name, "bank", ());
TEST_EQUAL(cat.m_synonyms[3].m_prefixLengthToSuggest, 0, ());
TEST_EQUAL(cat.m_synonyms[4].m_Lang, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[4].m_Name, "auf die strafbank schicken", ());
++m_count;
}
break;
@ -48,12 +51,14 @@ struct Checker
{
TEST_EQUAL(cat.m_types.size(), 2, ());
TEST_EQUAL(cat.m_synonyms.size(), 3, ());
TEST_EQUAL(cat.m_synonyms[0].first, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[0].second, "village", ());
TEST_EQUAL(cat.m_synonyms[1].first, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[1].second, "dorf", ());
TEST_EQUAL(cat.m_synonyms[2].first, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[2].second, "weiler", ());
TEST_EQUAL(cat.m_synonyms[0].m_Lang, StringUtf8Multilang::GetLangIndex("en"), ());
TEST_EQUAL(cat.m_synonyms[0].m_Name, "village", ());
TEST_EQUAL(cat.m_synonyms[1].m_Lang, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[1].m_Name, "dorf", ());
TEST_EQUAL(cat.m_synonyms[1].m_prefixLengthToSuggest, 2, ());
TEST_EQUAL(cat.m_synonyms[2].m_Lang, StringUtf8Multilang::GetLangIndex("de"), ());
TEST_EQUAL(cat.m_synonyms[2].m_Name, "weiler", ());
TEST_EQUAL(cat.m_synonyms[2].m_prefixLengthToSuggest, 4, ());
++m_count;
}
break;