diff options
author | vitya-smirnov <[email protected]> | 2025-07-03 14:40:24 +0300 |
---|---|---|
committer | vitya-smirnov <[email protected]> | 2025-07-03 15:02:48 +0300 |
commit | fdc3ed2f3a53f64b189d53b2cb81513916a78dc3 (patch) | |
tree | e9749f48aeb08f70fbbd2802c955b9d8a8c100b6 | |
parent | a4b1cf6267fe6389feafed4bad620bd7a827b23a (diff) |
YQL-19747: Support LSP FilterText
LSP protocol has a property
```
/**
* A string that should be used when filtering a set of
* completion items. When omitted the label is used as the
* filter text for this item.
*/
filterText?: string;
```
It is useful, e.g. when we prepend some punctuation
at a candidate content, but still want to filter by
prefix, ignoring that punctuation.
Related to https://nda.ya.ru/t/KCkzjhXS7G3Epg.
commit_hash:01f258218d312eef764350bd4d78da15acb8c9ea
5 files changed, 20 insertions, 7 deletions
diff --git a/yql/essentials/sql/v1/complete/analysis/global/column.cpp b/yql/essentials/sql/v1/complete/analysis/global/column.cpp index 92665063690..9b6161dc3b8 100644 --- a/yql/essentials/sql/v1/complete/analysis/global/column.cpp +++ b/yql/essentials/sql/v1/complete/analysis/global/column.cpp @@ -49,7 +49,7 @@ namespace NSQLComplete { std::any visitTerminal(antlr4::tree::TerminalNode* node) override { switch (node->getSymbol()->getType()) { case SQLv1::TOKEN_ID_QUOTED: - return Unquoted(GetText(node)); + return TString(Unquoted(GetText(node))); case SQLv1::TOKEN_ID_PLAIN: return GetText(node); } diff --git a/yql/essentials/sql/v1/complete/sql_complete.cpp b/yql/essentials/sql/v1/complete/sql_complete.cpp index 282ceca41b1..fa84e749a8c 100644 --- a/yql/essentials/sql/v1/complete/sql_complete.cpp +++ b/yql/essentials/sql/v1/complete/sql_complete.cpp @@ -20,6 +20,14 @@ namespace NSQLComplete { + TString TCandidate::FilterText() const { + TStringBuf text = Content; + if (IsQuoted(text)) { + text = Unquoted(text); + } + return ToLowerUTF8(text); + } + class TSqlCompletionEngine: public ISqlCompletionEngine { public: TSqlCompletionEngine( diff --git a/yql/essentials/sql/v1/complete/sql_complete.h b/yql/essentials/sql/v1/complete/sql_complete.h index 3387019e25f..41fb67fc090 100644 --- a/yql/essentials/sql/v1/complete/sql_complete.h +++ b/yql/essentials/sql/v1/complete/sql_complete.h @@ -41,6 +41,8 @@ namespace NSQLComplete { size_t CursorShift = 0; friend bool operator==(const TCandidate& lhs, const TCandidate& rhs) = default; + + TString FilterText() const; }; struct TCompletion { diff --git a/yql/essentials/sql/v1/complete/syntax/format.cpp b/yql/essentials/sql/v1/complete/syntax/format.cpp index f85c93dd085..824ab0c7529 100644 --- a/yql/essentials/sql/v1/complete/syntax/format.cpp +++ b/yql/essentials/sql/v1/complete/syntax/format.cpp @@ -44,17 +44,19 @@ namespace NSQLComplete { return GetSqlGrammar().IsPlainIdentifier(content); } + bool IsQuoted(TStringBuf content) { + return 2 <= content.size() && content.front() == '`' && content.back() == '`'; + } + TString Quoted(TString content) { content.prepend('`'); content.append('`'); return content; } - TString Unquoted(TString content) { - Y_ENSURE(2 <= content.size() && content.front() == '`' && content.back() == '`'); - content.erase(0, 1); - content.pop_back(); - return content; + TStringBuf Unquoted(TStringBuf content) { + Y_ENSURE(IsQuoted(content)); + return content.SubStr(1, content.size() - 2); } } // namespace NSQLComplete diff --git a/yql/essentials/sql/v1/complete/syntax/format.h b/yql/essentials/sql/v1/complete/syntax/format.h index ea3274ccf5d..4c5167ceaa1 100644 --- a/yql/essentials/sql/v1/complete/syntax/format.h +++ b/yql/essentials/sql/v1/complete/syntax/format.h @@ -7,7 +7,8 @@ namespace NSQLComplete { TString FormatKeywords(const TVector<TString>& seq); bool IsPlain(TStringBuf content); + bool IsQuoted(TStringBuf content); TString Quoted(TString content); - TString Unquoted(TString content); + TStringBuf Unquoted(TStringBuf content); } // namespace NSQLComplete |