Always prefer case insensitive suggestions

This commit is contained in:
Amos Bird 2020-03-18 13:27:56 +08:00
parent 48a2b46499
commit adf4ad6ce3
No known key found for this signature in database
GPG Key ID: 80D430DCBECFEDB4
5 changed files with 9 additions and 30 deletions

View File

@ -52,19 +52,10 @@ LineReader::Suggest::WordsRange LineReader::Suggest::getCompletions(const String
last_word = std::string_view(prefix).substr(last_word_pos + 1, std::string::npos); last_word = std::string_view(prefix).substr(last_word_pos + 1, std::string::npos);
/// last_word can be empty. /// last_word can be empty.
return std::equal_range(words.begin(), words.end(), last_word, [prefix_length](std::string_view s, std::string_view prefix_searched)
if (case_insensitive) {
return std::equal_range( return strncasecmp(s.data(), prefix_searched.data(), prefix_length) < 0;
words.begin(), words.end(), last_word, [prefix_length](std::string_view s, std::string_view prefix_searched) });
{
return strncasecmp(s.data(), prefix_searched.data(), prefix_length) < 0;
});
else
return std::equal_range(
words.begin(), words.end(), last_word, [prefix_length](std::string_view s, std::string_view prefix_searched)
{
return strncmp(s.data(), prefix_searched.data(), prefix_length) < 0;
});
} }
LineReader::LineReader(const String & history_file_path_, char extender_, char delimiter_) LineReader::LineReader(const String & history_file_path_, char extender_, char delimiter_)

View File

@ -18,9 +18,6 @@ public:
/// Get iterators for the matched range of words if any. /// Get iterators for the matched range of words if any.
WordsRange getCompletions(const String & prefix, size_t prefix_length) const; WordsRange getCompletions(const String & prefix, size_t prefix_length) const;
/// case sensitive suggestion
bool case_insensitive = false;
}; };
LineReader(const String & history_file_path, char extender, char delimiter = 0); /// if delimiter != 0, then it's multiline mode LineReader(const String & history_file_path, char extender, char delimiter = 0); /// if delimiter != 0, then it's multiline mode

View File

@ -481,8 +481,6 @@ private:
if (server_revision >= Suggest::MIN_SERVER_REVISION && !config().getBool("disable_suggestion", false)) if (server_revision >= Suggest::MIN_SERVER_REVISION && !config().getBool("disable_suggestion", false))
{ {
if (config().has("case_insensitive_suggestion"))
Suggest::instance().setCaseInsensitive();
/// Load suggestion data from the server. /// Load suggestion data from the server.
Suggest::instance().load(connection_parameters, config().getInt("suggestion_limit")); Suggest::instance().load(connection_parameters, config().getInt("suggestion_limit"));
} }
@ -1720,7 +1718,6 @@ public:
("always_load_suggestion_data", "Load suggestion data even if clickhouse-client is run in non-interactive mode. Used for testing.") ("always_load_suggestion_data", "Load suggestion data even if clickhouse-client is run in non-interactive mode. Used for testing.")
("suggestion_limit", po::value<int>()->default_value(10000), ("suggestion_limit", po::value<int>()->default_value(10000),
"Suggestion limit for how many databases, tables and columns to fetch.") "Suggestion limit for how many databases, tables and columns to fetch.")
("case_insensitive_suggestion", "Case sensitive suggestions.")
("multiline,m", "multiline") ("multiline,m", "multiline")
("multiquery,n", "multiquery") ("multiquery,n", "multiquery")
("format,f", po::value<std::string>(), "default output format") ("format,f", po::value<std::string>(), "default output format")

View File

@ -50,16 +50,13 @@ void Suggest::load(const ConnectionParameters & connection_parameters, size_t su
/// Note that keyword suggestions are available even if we cannot load data from server. /// Note that keyword suggestions are available even if we cannot load data from server.
if (case_insensitive) std::sort(words.begin(), words.end(), [](const std::string & str1, const std::string & str2)
std::sort(words.begin(), words.end(), [](const std::string & str1, const std::string & str2) {
return std::lexicographical_compare(begin(str1), end(str1), begin(str2), end(str2), [](const char char1, const char char2)
{ {
return std::lexicographical_compare(begin(str1), end(str1), begin(str2), end(str2), [](const char char1, const char char2) return std::tolower(char1) < std::tolower(char2);
{
return std::tolower(char1) < std::tolower(char2);
});
}); });
else });
std::sort(words.begin(), words.end());
ready = true; ready = true;
}); });

View File

@ -23,9 +23,6 @@ public:
return instance; return instance;
} }
/// Need to set before load
void setCaseInsensitive() { case_insensitive = true; }
void load(const ConnectionParameters & connection_parameters, size_t suggestion_limit); void load(const ConnectionParameters & connection_parameters, size_t suggestion_limit);
/// Older server versions cannot execute the query above. /// Older server versions cannot execute the query above.