-
Notifications
You must be signed in to change notification settings - Fork 48
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
如何根据SQL语句上下文得知别名与实体的关系 #151
Comments
lsp不是一个交互协议而已吗?为什么lsp能持续分析不完整或有语法错误的代码? |
LSP 本身确实只是一个协议,但它实际是作为连接编辑器和语言服务器的桥梁。真正进行代码分析的是语言服务器(Language Server) ,而不是协议本身。 举个具体例子:
SELECT * FROM u|
textDocument/didChange: {
"content": "SELECT * FROM u"
}
|
要识别这种不完整的情况也很棘手,再加上在编辑器中那么多sql,又要准确获取到当前正在写的这段sql的上下文也麻烦 |
常规步骤都是:获取所有文本,转换为抽象语法树,随后进行词法分析(Lexer)、语法分析(Parser)、遍历 AST 节点。接着才是实现高级功能如: SQL 校验、 自动补全、收集表名字段名。
当前位置的上下文 就需要在前面语法树的基础上获取用户光标位置,然后根据 目前我是这么实现,通过 |
以 |
太赞了👍🏻!别名这个特性真的太常用了。 另外我有几个疑惑:
|
没毛病。 |
|
你好,请问我要怎样收集到这个别名? |
@apankun 提供自定义completionService,第五个参数为entities,打印数据如下,然后可以自行处理补全 |
Issue 区分
monaco-sql-languages
实现 SQL 别名的处理。自动补全方式
实现自动补全的方式有两种:
monaco-sql-languages
。LSP
(Language Server Protocol
,语言服务器协议)。核心原理
通过预测用户意图并提供可能的输入选项,基于已输入的内容和上下文信息,推断用户可能想要输入的内容。
实现步骤
词法分析(Lexical Analysis)
语法分析(Syntactic Analysis)
语义分析(Semantic Analysis)
上下文感知(Context Awareness)
候选项生成(Candidate Generation)
排序和过滤(Sorting & Filtering)
实现方法
数据来源
AST 与动态编辑的局限
AST
(抽象语法树)虽然可以帮助解析 SQL 语句的结构,但它只适合静态分析的场景。在动态编辑环境中,SQL 语句往往不完整或存在语法错误,此时生成 AST 可能会影响性能。因此AST并不适用于实时编辑器的输入场景。
LSP 的优势
LSP
更加适合动态编辑环境,它能够持续分析不完整或有语法错误的代码,并提供自动补全、跳转到定义等功能。通过增量更新可以提高性能,适合实时代码编辑和补全需求。前端实现表别名与表名映射(重点)
虽然使用
LSP
有颇多好处,但十分依赖后端服务。如果站在前端角度来看待
自动补全
和别名处理
(这也是monaco-sql-languages
正在实现的愿景),可能需要如下步骤:AS
语句或类似别名定义的语句。(无法精准匹配,因为 AS 关键字可以省略)Select u. from user AS u
语句中假设用户正在输入u.
,那么通过查询映射表找到对应的表名(如user
),并提供列的自动补全。别名处理会更加相对复杂,因为除了表可以作为别名还有字段、计算函数、子查询等等。
目前在前端处理别名映射我并没有想到一个完美解决方案和思路,例如AS关键字省略怎么办?
The text was updated successfully, but these errors were encountered: