From cffa89885abce4582daeff8f29fbeb095e07ed5a Mon Sep 17 00:00:00 2001 From: tatiana-yan Date: Tue, 17 Jul 2018 17:26:34 +0300 Subject: [PATCH] [search] Add GetCategoryTypes helper for Discovery --- search/processor.cpp | 2 +- search/utils.cpp | 18 ++++++++++++++++++ search/utils.hpp | 9 +++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/search/processor.cpp b/search/processor.cpp index 7f730e4514..333f39d33e 100644 --- a/search/processor.cpp +++ b/search/processor.cpp @@ -503,7 +503,7 @@ void Processor::InitParams(QueryParams & params) const params.GetTypeIndices(i).push_back(index); }; auto const tokenSlice = QuerySliceOnRawStrings(m_tokens, m_prefix); - vector types; + set types; bool const isCategorialRequest = FillCategories(tokenSlice, GetCategoryLocales(), m_categories, types); params.SetCategorialRequest(isCategorialRequest); diff --git a/search/utils.cpp b/search/utils.cpp index b8defe8f63..817653f9a5 100644 --- a/search/utils.cpp +++ b/search/utils.cpp @@ -48,6 +48,24 @@ strings::LevenshteinDFA BuildLevenshteinDFA(strings::UniString const & s) return strings::LevenshteinDFA(s, 1 /* prefixSize */, kAllowedMisprints, GetMaxErrorsForToken(s)); } +set GetCategoryTypes(string const & name, string const & locale, + CategoriesHolder const & categories) +{ + set types; + + int8_t const code = CategoriesHolder::MapLocaleToInteger(locale); + Locales locales; + locales.Insert(static_cast(code)); + + vector tokens; + SplitUniString(search::NormalizeAndSimplifyString(name), MakeBackInsertFunctor(tokens), + search::Delimiters()); + + FillCategories(QuerySliceOnRawStrings>(tokens, {} /* prefix */), + locales, categories, types); + return types; +} + MwmSet::MwmHandle FindWorld(DataSource const & dataSource, vector> const & infos) { diff --git a/search/utils.hpp b/search/utils.hpp index 390e30cd0e..aa6c21f434 100644 --- a/search/utils.hpp +++ b/search/utils.hpp @@ -88,7 +88,7 @@ void ForEachCategoryTypeFuzzy(StringSliceBase const & slice, Locales const & loc // and a space after it means that no errors were made. template bool FillCategories(QuerySliceOnRawStrings const & slice, Locales const & locales, - CategoriesHolder const & catHolder, std::vector & types) + CategoriesHolder const & catHolder, std::set & types) { types.clear(); if (slice.HasPrefixToken()) @@ -112,12 +112,17 @@ bool FillCategories(QuerySliceOnRawStrings const & slice, Locales const & loc return; } - types.push_back(type); + types.insert(type); }); return !types.empty(); } +// Returns set of classificator types for category with |name| and |locale|. For metacategories +// like "Hotel" returns all subcategories types. +std::set GetCategoryTypes(std::string const & name, std::string const & locale, + CategoriesHolder const & categories); + MwmSet::MwmHandle FindWorld(DataSource const & dataSource, std::vector> const & infos); MwmSet::MwmHandle FindWorld(DataSource const & dataSource);