-
Notifications
You must be signed in to change notification settings - Fork 46
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in 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 校验、 自动补全、收集表名字段名。
当前位置的上下文 就需要在前面语法树的基础上获取用户光标位置,然后根据 目前我是这么实现,通过 |
以 |
太赞了👍🏻!别名这个特性真的太常用了。 另外我有几个疑惑:
|
没毛病。 |
|
有没有交流群呢? |
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: