当前位置: 首页 > article >正文

02、QLExpress从入门到放弃,相关API和文档

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执行参数

/**
 * 执行一段文本
 * @param expressString 程序文本
 * @param context 执行上下文,可以扩展为包含ApplicationContext
 * @param errorList 输出的错误信息List
 * @param isCache 是否使用Cache中的指令集,建议为true
 * @param isTrace 是否输出详细的执行指令信息,建议为false
 * @param aLog 输出的log
 * @return
 * @throws Exception
 */
Object execute(String expressString, IExpressContext<String, Object> context, List<String> errorList, boolean isCache, boolean isTrace);

三、功能扩展API列表

1、执行器(ExpressRunner)

/**
 * 执行一段文本
 * @param expressString 程序表达式
 * @param context 执行上下文,可以扩展为包含ApplicationContext(动态入参等)
 * @param errorList 输出的错误信息List
 * @param isCache 是否使用Cache中的指令集,建议为true
 * @param isTrace 是否输出详细的执行指令信息,建议为false
 * @param aLog 输出的log
 * @return
 * @throws Exception
 */
Object execute(String expressString, IExpressContext<String, Object> context, List<String> errorList, boolean isCache, boolean isTrace);

在这里插入图片描述

2、操作符定义Operator

/**
 * QLExpress主要通过子类实现Operator.java提供的以下方法来最简单的操作符定义,然后可以被通过addFunction或者addOperator的方式注入到ExpressRunner中。
 * 如果你使用Operator的基类OperatorBase.java将获得更强大的能力,基本能够满足所有的要求。
 */
public abstract Object executeInner(Object[] list) throws Exception;

3、function相关API(ExpressRunner)

//通过name获取function的定义
OperatorBase getFunciton(String name);
 
//通过自定义的Operator来实现类似:fun(a, b, c)
void addFunction(String name, OperatorBase op);
 
//fun(a, b, c) 绑定 object.function(a, b, c)对象方法
void addFunctionOfServiceMethod(String name, Object aServiceObject, String aFunctionName, Class<?>[] aParameterClassTypes, String errorInfo);
 
//fun(a, b, c) 绑定 Class.function(a, b, c)类方法
void addFunctionOfClassMethod(String name, String aClassName, String aFunctionName, Class<?>[] aParameterClassTypes, String errorInfo);
 
//给Class增加或者替换method,同时支持 a.fun(b), fun(a, b) 两种方法调用
//比如扩展String.class的isBlank方法:"abc".isBlank()和isBlank("abc")都可以调用
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);
 
//添加操作符和关键字的别名,比如 if..then..else -> 如果。。那么。。否则。。
void addOperatorWithAlias(String keyWordName, String realKeyWordName, String errorInfo);

5、宏定义相关API

//比如addMacro("天猫卖家", "userDO.userTag &1024 == 1024")
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);
//如果调用过程不出现异常,指令集instructionSet就是可以被加载运行(execute)了!

http://www.kler.cn/a/541873.html

相关文章:

  • 具身智能训练新思路!将生成视频用于训练机器人
  • 深度剖析责任链模式
  • PyCharm结合DeepSeek-R1
  • Windows系统下设置Vivado默认版本:让工程文件按需打开
  • (1/100)每日小游戏平台系列
  • 火爆的DeepSeek大模型怎么和智能家居结合?
  • C++ Primer 类型转换
  • Linux: debug: perf: report: no-children
  • 掌握正则表达式_模式匹配的艺术
  • window 安装GitLab服务器笔记
  • datasets: PyTorch version 2.5.1+cu124 available 这句话是什么意思
  • SQL Server安装流程
  • JavaSE基本知识补充(第三篇)-可变参数工具类
  • 实战shiro有key无链rce
  • mysql 学习11 事务,事务简介,事务操作,事务四大特性,并发事务问题,事务隔离级别
  • FANUC机器人示教器中如何显示或关闭寄存器或IO的注释信息?
  • AI时代下的安全新基石:零信任架构在人工智能系统中的应用
  • [python]png转webp的命令行工具
  • PyCharm结合DeepSeek-R1
  • JUnit5 单元测试详解
  • centos 7 关于引用stdatomic.h的问题
  • 【Git】完美解决git push报错403
  • 【20250211】栈与队列:225.用队列实现栈
  • 采集学校食堂人脸识别证件照,且尺寸底色统一的方法
  • 数据驱动企业数据智能化发展-通过财务数据分析模型评估企业经营健康度
  • ListWise 排序技术综述:从传统领域到大模型领域的跨越