QLExpress脚本语言技术讲解(8)-------逻辑的处理

(注:相关代码请参考 com.ql.util.express.test.logic.ShortCircuitLogicTest类,

QLExpress 源代码下载地址:http://code.taobao.org/p/QLExpress/src/ )

 

昨天收到一份厂外人士的邮件,需求如下:

天樵,您好!
 
        网上看到你BLOG中开源出的QLExpress表达式,在实际的项目应用中有个问题请教你一下:
                   
        我们的项目想要使用QLExpress表达式来控制业务操作的可行性校验,通过表达式返回的true/false 确定业务操作是否被允许
        
        例如:
        用户.状态 =='有效' && (用户.网龄 > 2年 || 用户.类型=='VIP')
 
        但是要求结果除了true/false外,如果最终操作不被允许,还想得出具体不被允许的原因(哪一段、几段原子表达式导致了整体的结果为不通过);、、
 
        目前未在QL中看到类似功能,如果想要基于QLExpress来实现,希望你能向我们提供一些方向或者指导性的意见。

 

 

其实逻辑方面的控制大概在两年前我们就已经实现了,而且淘宝内部业务系统也多有在使用。物流宝,营销系统,监管系统等等。

 

隐含两个需求:

1、避免逻辑短路,因为要输出所有出错信息。

2、友好地显示出错信息。

 

解答:1

第一个问题很好解决:设置runner属性即可,这个设置在很多场景下还是很有用的(即想运行完所有的表达式,又想获取一个最后的结果)。

runner.setShortCircuit(true);

 

解答:2

 

ExpressRunner.addOperatorWithAlias(String keyWordName, String realKeyWordName,String errorInfo)

美其名曰:“操作符 重命名”,这个函数其实是专为逻辑判断出错信息的设计的。

 

例如我希望 (100 小于 99) 的时候报错,那我就可以重新定义下 “<”

runner.addOperatorWithAlias("小于","<","$1 小于 $2 不满足期望");

这样就会显示出错信息: 100小于99不满足期望

那有些大哥会苦恼了 ,我如果表达式内容就希望是  (100<99)而非 (100 小于 99)怎么办?

由于受限于ExpressRunner内部的操作符体系设计,我们只能妥协下,先做一个文字替换工作。

 

text = "100<99 and 100<=99 and 100>1";
text = text.replaceAll("<",“小于”).replaceAll("<=",“小于或等于”).replaceAll(">","大于");
runner.setShortCircuit(true);
runner.addOperatorWithAlias("小于","<","$1 小于 $2");
runner.addOperatorWithAlias("小于或等于","<=","$1 小于 $2");
runner.addOperatorWithAlias("大于",">","$1 小于 $2");

List<String> errorInfo = new ArrayList<String>();
IExpressContext<String,Object> expressContext = new DefaultContext<String,Object>();
runner.execute(text , expressContext, errorInfo, true, false);
if(result){
	System.out.println("result is success!");
}else{
	System.out.println("result is fail!");
	for(String error : errorInfo){
		error=error.replaceAll(“小于”,"<").replaceAll(“小于或等于”,"<=").replaceAll("大于",">");
		System.out.println(error);
	}
}

 

 

你可能感兴趣的:(qlexpress,脚本语言)