7 小时以前 9bad721754fe8bbe2e5f459d0706e0fefac569f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package cn.iocoder.yudao.module.qcreport.engine.rule;
 
import java.util.List;
 
/**
 * 规则语法树节点。
 * <p>
 * 与前端 {@code engine/rule-engine.ts} 的 RuleNode 联合类型一一对应:
 * 递归下降解析成这棵树后自己求值,全程不碰 eval / 脚本引擎——
 * 规则文本来自用户,一旦能被当作代码执行就是注入口子。
 */
public sealed interface RuleNode {
 
    /** 字面量:数字(Double)/ 字符串 / 布尔 / null */
    record Literal(Object value) implements RuleNode {
    }
 
    /** 上下文路径取值,如 item.actualValue */
    record Path(String path) implements RuleNode {
    }
 
    /** 白名单函数调用 */
    record Call(String name, List<RuleNode> args) implements RuleNode {
    }
 
    /** 一元运算:- 或 ! */
    record Unary(String operator, RuleNode operand) implements RuleNode {
    }
 
    /** 二元运算:AND / OR / = / != / > / >= / < / <= / + / - / * / / */
    record Binary(String operator, RuleNode left, RuleNode right) implements RuleNode {
    }
 
    /** value BETWEEN lower AND upper */
    record Between(RuleNode value, RuleNode lower, RuleNode upper, boolean negated) implements RuleNode {
    }
 
    /** value IN (items) / value NOT IN (items) */
    record In(RuleNode value, List<RuleNode> items, boolean negated) implements RuleNode {
    }
 
}