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);
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4dc63ac8120645b7a700074398b5a577.png#pic_center)
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);