diff --git a/indexer/search_index_builder.cpp b/indexer/search_index_builder.cpp index 7f2c54e2db..179601313a 100644 --- a/indexer/search_index_builder.cpp +++ b/indexer/search_index_builder.cpp @@ -1,7 +1,7 @@ #include "search_index_builder.hpp" #include "features_vector.hpp" #include "../search/search_trie.hpp" -#include "../search/string_match.hpp" +#include "../search/string_search_utils.hpp" #include "../coding/trie_builder.hpp" #include "../coding/writer.hpp" #include "../base/string_utils.hpp" diff --git a/search/string_match.cpp b/search/approximate_string_match.cpp similarity index 95% rename from search/string_match.cpp rename to search/approximate_string_match.cpp index aa3812faea..03921d31c7 100644 --- a/search/string_match.cpp +++ b/search/approximate_string_match.cpp @@ -1,4 +1,4 @@ -#include "string_match.hpp" +#include "approximate_string_match.hpp" // TODO: Сделать модель ошибок. // Учитывать соседние кнопки на клавиатуре. diff --git a/search/string_match.hpp b/search/approximate_string_match.hpp similarity index 84% rename from search/string_match.hpp rename to search/approximate_string_match.hpp index 26e6e2882e..2225bb72a0 100644 --- a/search/string_match.hpp +++ b/search/approximate_string_match.hpp @@ -1,28 +1,12 @@ #pragma once +#include "string_search_utils.hpp" #include "../base/base.hpp" #include "../base/buffer_vector.hpp" -#include "../base/string_utils.hpp" #include "../std/queue.hpp" namespace search { -using strings::UniChar; - -inline strings::UniString NormalizeAndSimplifyString(string const & s) -{ - strings::UniString uniS = strings::MakeLowerCase(strings::MakeUniString(s)); - strings::Normalize(uniS); - return uniS; -} - -template -void SplitUniString(strings::UniString const & uniS, F f, DelimsT const & delims) -{ - for (strings::TokenizeIterator iter(uniS, delims); iter; ++iter) - f(iter.GetUniString()); -} - namespace impl { diff --git a/search/keyword_matcher.cpp b/search/keyword_matcher.cpp index 5d19653e1d..3864d21ebe 100644 --- a/search/keyword_matcher.cpp +++ b/search/keyword_matcher.cpp @@ -1,6 +1,6 @@ #include "keyword_matcher.hpp" #include "delimiters.hpp" -#include "string_match.hpp" +#include "string_search_utils.hpp" #include "../base/logging.hpp" #include "../base/string_utils.hpp" #include "../std/bind.hpp" diff --git a/search/query.cpp b/search/query.cpp index 207cdd5350..5f76e452f9 100644 --- a/search/query.cpp +++ b/search/query.cpp @@ -2,7 +2,7 @@ #include "categories_holder.hpp" #include "delimiters.hpp" #include "latlon_match.hpp" -#include "string_match.hpp" +#include "string_search_utils.hpp" #include "search_trie_matching.hpp" #include "../indexer/feature_visibility.hpp" #include "../base/exception.hpp" @@ -21,30 +21,26 @@ uint32_t KeywordMatch(strings::UniChar const * sA, uint32_t sizeA, strings::UniChar const * sB, uint32_t sizeB, uint32_t maxCost) { - /* if (sizeA != sizeB) return maxCost + 1; - for (uint32_t i = 0; i< sizeA; ++i) - if (sA[i] != sB[i]) + strings::UniChar const * const endA = sA + sizeA; + while (sA != endA) + if (*sA++ != *sB++) return maxCost + 1; return 0; - */ - return StringMatchCost(sA, sizeA, sB, sizeB, DefaultMatchCost(), maxCost, false); } uint32_t PrefixMatch(strings::UniChar const * sA, uint32_t sizeA, strings::UniChar const * sB, uint32_t sizeB, uint32_t maxCost) { - /* if (sizeA > sizeB) return maxCost + 1; - for (uint32_t i = 0; i< sizeA; ++i) - if (sA[i] != sB[i]) + strings::UniChar const * const endA = sA + sizeA; + while (sA != endA) + if (*sA++ != *sB++) return maxCost + 1; return 0; - */ - return StringMatchCost(sA, sizeA, sB, sizeB, DefaultMatchCost(), maxCost, true); } inline uint32_t GetMaxKeywordMatchScore() { return 512; } @@ -243,7 +239,7 @@ void Query::Search(function const & f) { FeatureProcessor featureProcessor(*this); /// @todo Tune depth scale search (1 is no enough) - m_pIndex->ForEachInRect(featureProcessor, m_viewport, min(scales::GetUpperScale(), scale + 1)); + m_pIndex->ForEachInRect(featureProcessor, m_viewport, min(scales::GetUpperScale(), scale + 7)); } catch (FeatureProcessor::StopException &) { diff --git a/search/search.pro b/search/search.pro index f5f0fffe19..57d928dd89 100644 --- a/search/search.pro +++ b/search/search.pro @@ -16,11 +16,12 @@ HEADERS += \ keyword_matcher.hpp \ query.hpp \ result.hpp \ - string_match.hpp \ latlon_match.hpp \ categories_holder.hpp \ search_trie.hpp \ search_trie_matching.hpp \ + string_search_utils.hpp \ + approximate_string_match.hpp \ SOURCES += \ delimiters.cpp \ @@ -29,7 +30,7 @@ SOURCES += \ keyword_matcher.cpp \ query.cpp \ result.cpp \ - string_match.cpp \ latlon_match.cpp \ categories_holder.cpp \ search_trie_matching.cpp \ + approximate_string_match.cpp \ diff --git a/search/search_tests/keyword_matcher_test.cpp b/search/search_tests/keyword_matcher_test.cpp index 23c6d8b814..7e17f5c215 100644 --- a/search/search_tests/keyword_matcher_test.cpp +++ b/search/search_tests/keyword_matcher_test.cpp @@ -1,7 +1,8 @@ #include "../../testing/testing.hpp" #include "../keyword_matcher.hpp" #include "match_cost_mock.hpp" -#include "../string_match.hpp" +#include "../approximate_string_match.hpp" +#include "../string_search_utils.hpp" #include "../../testing/testing_utils.hpp" #include "../../base/string_utils.hpp" #include "../../std/scoped_ptr.hpp" diff --git a/search/search_trie_matching.cpp b/search/search_trie_matching.cpp index 069ae8e99d..dddaf4e7e3 100644 --- a/search/search_trie_matching.cpp +++ b/search/search_trie_matching.cpp @@ -1,6 +1,6 @@ #include "search_trie_matching.hpp" #include "query.hpp" -#include "string_match.hpp" +#include "string_search_utils.hpp" #include "../indexer/feature_visibility.hpp" diff --git a/search/string_search_utils.hpp b/search/string_search_utils.hpp new file mode 100644 index 0000000000..16f4af7310 --- /dev/null +++ b/search/string_search_utils.hpp @@ -0,0 +1,24 @@ +#pragma once +#include "../base/string_utils.hpp" +#include "../base/base.hpp" + +namespace search +{ + +using strings::UniChar; + +inline strings::UniString NormalizeAndSimplifyString(string const & s) +{ + strings::UniString uniS = strings::MakeLowerCase(strings::MakeUniString(s)); + strings::Normalize(uniS); + return uniS; +} + +template +void SplitUniString(strings::UniString const & uniS, F f, DelimsT const & delims) +{ + for (strings::TokenizeIterator iter(uniS, delims); iter; ++iter) + f(iter.GetUniString()); +} + +} // namespace search