Skip to content

Optimize suggestion #231

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

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
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
improvement Improve existing feature
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants