Skip to content
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

【0.5.3】抽象语法树名称规范化 + 抽象语法树解析性能优化 #20

Closed
37 tasks done
ChangxingJiang opened this issue May 19, 2024 · 0 comments · Fixed by #23
Closed
37 tasks done
Assignees
Labels
enhancement New feature or request

Comments

@ChangxingJiang
Copy link
Owner

ChangxingJiang commented May 19, 2024

抽象语法树名称规范化:

  • 抽象语法树节点名称规范化
  • 抽象语法树解析方法名称规范化

抽象语法树解析性能优化:

  • 移除 amt_node 直接使用字符串标记进行判断的功能
  • 将词法树节点的标签集合改为使用状态压缩存储
  • TokenScanner 中的使用 @Property 方法改为直接使用私有属性
  • FSMMachine.handle() 中的逻辑拆分到每个 FSMOperateexecute 方法中,从而在解析中需要通过判断 FSMOperate.type 来确定处理方法
  • 优化 FSMOperate.execute() 方法的状态操作,避免无效的状态更新
  • FSM_OPERATION_MAP 的双层字典改为单层字典
  • 将 TokenScanner 中对抽象词法树的过滤,移动到构造状态机操作类映射表时处理
  • FSMMachine.parse 中遍历下标再用下标获取字符,改为直接遍历字符串
  • 增加 SQLParser 中各个解析方法增加不兼容字符串的私有方法,并在相互间调用时使用该私有方法
  • TokenScanner.search() 优先判断匹配是否超出扫描器长度,从而仅执行一次扫描器长度的检查
  • TokenScannerpop() 方法拆分为 pop() 和不返回值仅移动指针的 move() 方法
  • 重写 AMTParenthesisBase.equals() 方法,使其不需要比较源代码
  • 增加 AMTNode 节点的 __slots__ 属性
  • 优化抽象语法树解析方法的具体解析逻辑,将通用解析逻辑的 searchserach_and_move 改为专有解析逻辑
  • FSMStatus 的枚举值改为小整数,并将枚举类改为 IntEnum 以避免哈希值计算
  • FSM_OPERATION_MAP 的默认值单独拆分为一个字典,从而使第二次查询由计算元组哈希值变为直接使用整数作为哈希值
  • 优化 TokenScannersplit_by 方法,避免多次遍历相同元素
  • 优化 TokenScannergetpop 方法,移除对数组下标超界的额外判断,改为直接抛出数组超界的异常
  • 重构 FSMMemory 逻辑,不再将遍历的字符串放到列表中缓存,而是在构成词语后再从原始字符串中切片
  • 统一在异常处理中才分析 match 失败异常原因
  • 移除 TokenScannersearchsearch_and_move 中无意义的 is None 判断
  • 类似 CASE 的语句按出现频率从高到低排序
  • AMTNode 节点的 @property 属性 sourcechildren 改为实例的 __slots__ 属性
  • 将 AMTNode 父类中的初始化逻辑全部移动到子类中
  • FSMMemorycache_reset_and_handle 方法逻辑移动到 FSMOperateexecute 方法中
  • 将 FSMMemory 改造为没有方法的 dataclasses(以备后续改为结构体)
  • 将 ASCII 编码 20 - 7E 之间的字符添加到行为映射表中,从而减少需要在默认字典中查询的数量
  • TokenScannersearch 方法和 search_and_move 方法拆分出各种不需要类型判断的特有匹配方法
  • FSMMemory 中维护当前下标,重新将 FSMMachine.parse 中改为字符串遍历而非 enumerate
  • 优化 FSMMachine 对于不移动指针执行规则的处理逻辑

其他优化:

  • 优化 WITH 子句的封装逻辑,将 UPDATE 语句改为支持 WITH 子句
  • 优化 PARTITION 子句解析逻辑,支持预匹配 PARTITION 关键字
  • 抽象语法树解析方法的类型标注优化
  • 移除在语法解析过程中检查是否包含嵌套的窗口函数的逻辑(未来在分析器中实现)
  • TokenScannerget_as_source 方法改为 get_as_source_or_null 方法

性能测试集(修改前):35.10s、31.85s、32.90s、31.75s、32.22s
性能测试集(修改后):7.35s、7.44s、7.44s、7.41s、7.31s

@ChangxingJiang ChangxingJiang self-assigned this May 26, 2024
@ChangxingJiang ChangxingJiang added the enhancement New feature or request label May 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
1 participant