Skip to content

Optimize suggestion #231

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

Merged
merged 6 commits into from
Dec 13, 2023
Merged

Optimize suggestion #231

merged 6 commits into from
Dec 13, 2023

Conversation

HaydenOrz
Copy link
Collaborator

@HaydenOrz HaydenOrz commented Dec 12, 2023

主要变更

  1. 优化自动补全时,寻找最小的合适范围的策略
  2. 在自动补全的单测中应用 commentOtherLine 方法,(只包括在单行中补全的单测)
  3. 添加在多行sql情况下自动补全的测试用例

关于优化自动补全

为什么要寻找最小的合适范围?

在sql文本量很大的时候,antlr4-c3 会表现出严重的性能问题,此前的测试中发现sql 内容 5000 行时,antlr4-c3 需要大概30秒才能收集完成,这太慢了。所以需要找到一个最小的合适的范围,在这个范围内做自动补全以保证性能稳定

如何寻找最小的合适范围?

  1. 将sql内容按语句切分,如果sql语句中包含一条以上的sql语句,则在所有的 sql 语句中寻找一个合适的范围
  2. 这个范围的边界是两条语句对应的上下文,分别是左边界和右边界
  3. 左边界的界定条件是:当前语句的结束位置在补全位置之前,当前语句是一个不包含解析异常的语句,且当前语句的上一句也是一个不包含解析异常的语句。
  4. 右边界的界定条件是:当前语句的起始位置在补全位置之后,当前语句是一个不包含解析异常的语句,且当前语句的上一句也是一个不包含解析异常的语句

对于左边界,为什么需要它的上一句也是一个不包含解析异常的语句(右边界同理)

因为可能会出现一条独立语句可以由多条独立语句组成的情况,比如

INSERT INTO tb SELECT * FROM tb;

在寻找这个最小范围时,相当重要的一个基本准则是:需要保证按这个范围切割后的文本片段交给c3 去收集的结果,与完整文本交给c3去收集的结果相同。

基于这个基本准则,在寻找这个范围时需要特别小心,左边界向前看一句和右边界向后看一句,都能尽量减少误差。

值得强调的是,即使这样做了也不能完全保证遵守了上述基本准则,因为不同的sql的语法存在差异,另外在某些情况下,如果文本中包含了语法错误,Antlr4 在错误位置将会以一种怪异的方式生成语法树。

在理论上也无法绝对保证遵守上述基本准则,是因为这实际上是在用普通的js逻辑去试图理解哪些解析树节点属于同一个语句。在自动补全方法内部的对应策略只能尽量取得平衡(性能和准确性之前的平衡), 好消息是目前看起来一切运行良好。

关于多行sql自动补全的单元测试

多行情况下,自动补全的情况分为三种:

  1. 要自动自动补全的位置所处于的语句位于sql内容的起始位置
  2. 要自动自动补全的位置所处于的语句位于sql内容的中间位置
  3. 要自动自动补全的位置所处于的语句位于sql内容的末尾

@HaydenOrz HaydenOrz added the improvement Improve existing feature label Dec 12, 2023
@HaydenOrz
Copy link
Collaborator Author

关联PR #228 , 此PR修复了 #228 中的遗留问题

@mumiao
Copy link
Collaborator

mumiao commented Dec 12, 2023

明天上午Review掉

@mumiao mumiao self-assigned this Dec 13, 2023
@liuxy0551
Copy link
Collaborator

解读一遍后 basicParser 那里我没什么问题了

@HaydenOrz HaydenOrz merged commit 3c7c59f into DTStack:main Dec 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
improvement Improve existing feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants