alibaba/QLExpress

QLExpress4支持返回运行时覆盖情况

Open

#384 opened on Jun 2, 2025

View on GitHub
 (0 comments) (0 reactions) (0 assignees)Java (4,457 stars) (1,113 forks)batch import
help wanted

Description

需求描述

在一段脚本执行后,给应用返回语法树节点是否被执行的信息。相比 #373,支持面的更加广(比如可以支持循环),但是不会包含具体的计算结果 value

实现思路

因为分支覆盖信息统计会产生性能损耗,所以默认不进行统计。需要用户主动打开 traceEvaluated 选项后才会在 QLResult 中返回覆盖信息。

覆盖信息以 EvaluatedTrace 对象的形式返回,一个 EvaluatedTrace 对象代表一个计算节点:

public class EvaluatedTrace {
    private TraceType type;
    private String token;
    private Object value;
    private boolean evaluated;
    private List<EvaluatedTrace> children;
}

案例1,无短路运算场景:

if (a>3) {
    sum = 0
    for (i:[1,2,3]) {
        sum += i
    }
    sum
} else {
    100
}

则返回的 EvaluatedTrace 对象如下(假设上下文传入的a为4):

即下钻每一个 Block(代码块) 的结构,每一行作为 children 中的一个元素,并且整体标记该 block 是否执行过。

Contributor guide