QLExpress从入门到放弃,相关API和文档
一、属性开关
public class ExpressRunner {
private boolean isTrace;
private boolean isShortCircuit;
private boolean isPrecise;
}
/**
* 是否需要高精度计算
*/
private boolean isPrecise = false;
高精度计算在会计财务中非常重要,java的float、double、int、long存在很多隐式转换,做四则运算和比较的时候其实存在非常多的安全隐患。
所以类似汇金的系统中,会有很多BigDecimal转换代码。而使用QLExpress,
你只要关注数学公式本身 订单总价 = 单价 * 数量 + 首重价格 + ( 总重量 - 首重) * 续重单价 ,然后设置这个属性即可,所有的中间运算过程都会保证不丢失精度。
/**
* 是否使用逻辑短路特性
*/
private boolean isShortCircuit = true;
在很多业务决策系统中,往往需要对布尔条件表达式进行分析输出,普通的java运算一般会通过逻辑短路来减少性能的消耗。例如规则公式:
star > 10000 and shopType in ('tmall', 'juhuasuan') and price between (100, 900)
假设第一个条件 star>10000 不满足就停止运算。但业务系统却还是希望把后面的逻辑都能够运算一遍,并且输出中间过程,保证更快更好的做出决策。
/**
* 是否输出所有的跟踪信息,同时还需要log级别是DEBUG级别
*/
private boolean isTrace = false;
这个主要是是否输出脚本的编译解析过程,一般对于业务系统来说关闭之后会提高性能。
二、execute执行参数
Object execute ( String expressString, IExpressContext < String , Object > context, List < String > errorList, boolean isCache, boolean isTrace) ;
三、功能扩展API列表
1、执行器(ExpressRunner)
Object execute ( String expressString, IExpressContext < String , Object > context, List < String > errorList, boolean isCache, boolean isTrace) ;
2、操作符定义Operator
public abstract Object executeInner ( Object [ ] list) throws Exception ;
3、function相关API(ExpressRunner)
OperatorBase getFunciton ( String name) ;
void addFunction ( String name, OperatorBase op) ;
void addFunctionOfServiceMethod ( String name, Object aServiceObject, String aFunctionName, Class < ? > [ ] aParameterClassTypes, String errorInfo) ;
void addFunctionOfClassMethod ( String name, String aClassName, String aFunctionName, Class < ? > [ ] aParameterClassTypes, String errorInfo) ;
void addFunctionAndClassMethod ( String name, Class < ? > bindingClass, OperatorBase op) ;
4、Operator相关API
void addOperator ( String name, Operator op) ;
void addOperator ( String name, String aRefOpername, Operator op) ;
OperatorBase replaceOperator ( String name, OperatorBase op) ;
void addOperatorWithAlias ( String keyWordName, String realKeyWordName, String errorInfo) ;
5、宏定义相关API
void addMacro ( String macroName, String express) ;
6、语法校验API
String expressString = "for(i = 0; i < 10; i++) {sum = i + 1;} return sum;" ;
InstructionSet instructionSet = expressRunner. parseInstructionSet ( expressString) ;