alibaba/QLExpress

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

Open

#384 opened on Jun 2, 2025

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

Repository metrics

Stars
 (4,457 stars)
PR merge metrics
 (Avg merge 17d) (4 merged PRs in 30d)

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