QLExpress使用及源码分析

简介: QLExpress是阿里巴巴开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑与代码解耦。提供AST语法树解析、上下文构建及高效执行机制,适用于动态规则场景。GitHub地址:https://github.com/alibaba/QLExpress

Git仓库:https://github.com/alibaba/QLExpress

1.示例Demo

1.实体构建

@Data
public class User {
    
    @QLAlias("姓名")
    private String name;
    
    @QLAlias("年龄")
    private Integer age;
    
    @QLAlias("性别")
    private String gender;
    
    @QLAlias("身高")
    private Double height;
    
    @QLAlias("体重")
    private Double weight;
}

2.接口定义

@Service(value = "userManagerImpl")
public class UserManagerImpl implements UserManager {
  ... ...
  @Override
  @QLRule("isAdult")
  public Boolean isAdult(@QLAlias("用户") User user) {
    throw new RuntimeException("不应该走到这里");
  }
    
  @Override
  @QLRule
  public BMIResult calculate(@QLAlias("用户") User user) {
    throw new RuntimeException("不应该走到这里");
  }
}

3.脚本编写

表达式内容维护在一个yaml里,默认扫描路径为:classpath*:/rules/**/*.yaml

这里为:user.yaml

// 对应上述接口1
isAdult:
  用户.年龄 >= 18
// 对应上述接口2
com.test.UserManagerImpl.calculate: |
  import com.test.Result;
  bmiResult = new Result();
  bmiValue = 用户.体重 / (患者.身高 * 患者.身高);
  bmiResult.setBmiValue(bmiValue);
  if (bmiValue < 18.5) {
    bmiResult.setMsg("体重过低");
  } else if (bmiValue > 23.9) {
    bmiResult.setMsg("体重过高");
  } else {
    bmiResult.setMsg("体重正常");
  }
  return bmiResult;

2.运行环节

QLExpressRunner如下图所示,从语法树分析、上下文、执行过程三个方面提供二次定制的功能扩展。

1.获取原始脚本,参数

  • QLRule中的value可以使用缺省值,对应yaml的key则为缺省值对应的ruleCode
  • 存在默认读取文件路径:com.c2f.boot.starter.rule.engine.QLExpressProperties
  • String rule为获取的原始脚本,后续基于此构建AST语法树

2.构建后续赋值上下文

  • 没取别名,默认构建一组:形参:value
  • 取别名,另构建一组:别名:value(后续yaml能汉化使用也是基于此)
  • 所以默认构建的上下文数量 = 形参个数 * 1,有别名 = 形参个数 * 2

3.调用执行

延迟执行

默认第一次执行即缓存

构建AST语法树

基于:com.ql.util.express.parse.KeyWordDefine4Java 构建

选择匹配工厂

递归解析

分解为Word[]:"sum",”=“,”0“,”;“,"for","(","i",......

Word[]转化为List《ExpressNode》:每一个word变得有意义:常量、变量、符号、分割符号

解析第一行:请领状态 = 药品请领单.执行状态

解析第二行:执行计划状态 = 执行计划.当前执行状态,clearDataStack后续也会当做一个指令使用

解析第三行,不再是loadAttr而是LoadData

或需是引包则loadData,变量定义是LoadAttr,未研究

真正执行

基于不同指令进入不同的重写方法

清除栈内数据

执行完毕返回


相关文章
|
SQL 存储 缓存
面向异构数据的Schema-on-Read分析技术设计与实践
本文是12月4号在《DataFunTalk技术交流会:阿里云实时查询分析专场》分享的议题《面向异构数据的Schema-on-Read分析技术与实践》的文字版记录。一、背景介绍数字化转型浪潮中,物理世界到数字世界的映射带来了各种各样结构的数据。第一种是完全无结构的数据,完全没有任何规律,典型的如syslog这种记录系统事件的日志;第二种是半结构化数据,有局部的结构,但是不同的行的字段的数目是不确定的
20414 3
面向异构数据的Schema-on-Read分析技术设计与实践
|
Java API
QLExpress功能清单
QLExpress从一开始就是从复杂的阿里电商业务系统出发,并且不断完善的脚本语言解析引擎框架,在不追求java语法的完整性的前提下(比如异常处理,foreach循环,lambda表达式,这些都是groovy是强项),定制了很多普遍存在的业务需求解决方案(比如变量解析,spring打通,函数封装,操作符定制,宏替换),同时在高性能、高并发、线程安全等方面也下足了功夫,久经考验。
22709 1
|
5月前
|
人工智能 安全 API
私有化AI助理怎么选?OpenClaw四端部署+CoPaw 3分钟极速启动+实战配置手册
在AI工具百花齐放的2026年,个人助理类产品迎来爆发式增长。阿里云计算巢推出的开源AI助理CoPaw,以3分钟极速部署、多平台对话通道、私有化部署等优势迅速出圈;而OpenClaw(昵称“龙虾AI”)凭借250K GitHub星标、丰富的Skills生态,成为技术爱好者与效率追求者的首选。两款产品各有侧重:CoPaw胜在部署便捷、大厂背书;OpenClaw强在功能拓展、生态成熟。
3219 4
私有化AI助理怎么选?OpenClaw四端部署+CoPaw 3分钟极速启动+实战配置手册
|
8月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过YAML配置表达式规则。支持AST语法树解析、上下文构建与动态执行,提供脚本缓存、别名映射、指令重写等扩展能力,适用于灵活的业务逻辑解耦与动态化控制。
|
存储 运维 监控
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
日志数据已成为企业洞察系统状态、监控网络安全及分析业务动态的宝贵资源。网易云音乐引入 Apache Doris 作为日志库新方案,替换了 ClickHouse。解决了 ClickHouse 运维复杂、不支持倒排索引的问题。目前已经稳定运行 3 个季度,规模达到 50 台服务器, 倒排索引将全文检索性能提升7倍,2PB 数据,每天新增日志量超过万亿条,峰值写入吞吐 6GB/s 。
1251 5
从 ClickHouse 到 Apache Doris:在网易云音乐日增万亿日志数据场景下的落地
|
人工智能 SpringCloudAlibaba 自然语言处理
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
5718 2
|
机器学习/深度学习 存储 监控
实时特征处理框架:构建与应用实践
在大数据时代,实时特征处理框架成为数据驱动应用的核心组件。这些框架能够从海量数据中提取特征,并实时更新,为机器学习模型提供动力。本文将探讨实时特征框架的构建和生产实践,分享如何构建一个高效、稳定的实时特征处理系统。
454 2
|
SQL 分布式计算 关系型数据库
Clickhouse时间日期函数一文详解+代码展示
Clickhouse时间日期函数一文详解+代码展示
5008 0
Clickhouse时间日期函数一文详解+代码展示
|
数据可视化 算法 Java
JAVA规则引擎工具
本文介绍了六款常用的Java规则引擎:Drools、IBM ODM、Easy Rules、jBPM、OpenL Tablets 和 Apache Camel。每款引擎都有其独特的特点和适用场景,如Drools的高效规则匹配、IBM ODM的Web界面管理、Easy Rules的轻量级特性、jBPM的流程管理、OpenL Tablets的Excel规则定义以及Apache Camel的路由和规则结合。选择合适的规则引擎可以显著提高系统的灵活性和可维护性。
1889 0
|
jenkins Java 持续交付
Jenkins打包,发布,部署
Jenkins打包,发布,部署
1272 0

热门文章

最新文章