详细使用方案请看:https://github.com/alibaba/QLExpress官网,这里讲述一个实战场景:即B端系统的上配置的规则引擎。
需求背景:A(接入方)需要对产生的数据进行质检,即校对一些数据比昨天、上周同天的对比情况。需要在页面上提供一些功能,让用户可以个性化的配置校验规则。
以技术的语言来说,就是将页面上的一些参数组装成一段“代码脚本”,然后Java程序去运行这块代码校脚本。
引入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>QLExpress</artifactId>
<version>3.2.0</version>
</dependency>
实现代码(伪代码):
public class QlExpressTest {
public static void main(String[] args) throws Exception {
test4();
}
public static void test4() throws Exception {
ExpressRunner runner = new ExpressRunner();
DefaultContext<String, Object> context = new DefaultContext<>();
context.put("ecpm", 100);
context.put("lastWeek_ecpm", 90.11);
String dataIndicators = DataIndicators.ecpm.name;
String dataComparison = DataComparison.lastWeek.name;
String to = dataComparison + "_" + dataIndicators;
//打印表达式(汉化-别人可以理解的)
String alias =
DataIndicators.ecpm.alias + "-" + DataComparison.lastWeek.alias + "的" + DataIndicators.ecpm.alias + ">="
+ 3;
System.out.println("汉化的表达式:" + alias);
//真正的表达式
String express = dataIndicators + "-" + to + ">=" + "3";
System.out.println("真正执行的表达式:" + express);
Object mapValueSum = runner.execute(express, context, null, true, false);
System.out.println("执行结果:" + mapValueSum);
}
public enum DataComparison {
lastWeek("lastWeek", "上周同期"),
yesterday("yesterday", "昨天");
private String name;
private String alias;
DataComparison(String name, String alias) {
this.name = name;
this.alias = alias;
}
public String getName() {
return name;
}
public String getAlias() {
return alias;
}
}
public enum DataIndicators {
ecpm("ecpm", "ecpm(¥)"),
click("click", "点击量");
private String name;
private String alias;
public String getName() {
return name;
}
public String getAlias() {
return alias;
}
DataIndicators(String name, String alias) {
this.name = name;
this.alias = alias;
}
}
}
网友评论