diff options
author | Maxim Pimenov <m@maps.me> | 2016-06-17 17:18:14 +0300 |
---|---|---|
committer | Maxim Pimenov <m@maps.me> | 2016-06-17 17:35:51 +0300 |
commit | 92c6dd6ed2739096bf023c6c17311754f942973c (patch) | |
tree | e7a5eae657f98adba0a1de2c46927c08320ef851 /indexer/search_string_utils.cpp | |
parent | 0b8e94adccd2da6019b6ff5512156e8b1d570123 (diff) |
[search] A speedup of the string synonyms checker.
Diffstat (limited to 'indexer/search_string_utils.cpp')
-rw-r--r-- | indexer/search_string_utils.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/indexer/search_string_utils.cpp b/indexer/search_string_utils.cpp index 24aaaa3764..62f88133d3 100644 --- a/indexer/search_string_utils.cpp +++ b/indexer/search_string_utils.cpp @@ -1,10 +1,9 @@ -#include "search_string_utils.hpp" +#include "indexer/search_string_utils.hpp" +#include "indexer/string_set.hpp" #include "base/macros.hpp" -#include "base/stl_helpers.hpp" #include "std/algorithm.hpp" -#include "std/transform_iterator.hpp" using namespace strings; @@ -99,8 +98,9 @@ char const * kStreetTokensSeparator = "\t -,."; class StreetsSynonymsHolder { - vector<UniString> m_synonyms; public: + using TStrings = search::StringSet<UniChar, 8>; + StreetsSynonymsHolder() { char const * affics[] = @@ -169,21 +169,27 @@ public: "дорога", "провулок", "площа", "шосе", "вулиция", "дор", "пров", "вул" }; - m_synonyms.assign(make_transform_iterator(affics, &NormalizeAndSimplifyString), - make_transform_iterator(affics + ARRAY_SIZE(affics), &NormalizeAndSimplifyString)); - my::SortUnique(m_synonyms); + for (auto const * s : affics) + { + UniString const us = MakeUniString(s); + m_strings.Add(us.begin(), us.end()); + } } - bool MatchPrefix(UniString const & prefix) const + bool MatchPrefix(UniString const & s) const { - auto const it = lower_bound(m_synonyms.begin(), m_synonyms.end(), prefix); - return (it != m_synonyms.end() && StartsWith(*it, prefix)); + auto const status = m_strings.Has(s.begin(), s.end()); + return status != TStrings::Status::Absent; } - bool FullMatch(UniString const & name) const + bool FullMatch(UniString const & s) const { - return binary_search(m_synonyms.begin(), m_synonyms.end(), name); + auto const status = m_strings.Has(s.begin(), s.end()); + return status == TStrings::Status::Full; } + +private: + TStrings m_strings; }; StreetsSynonymsHolder g_streets; |