QLExpress使用及源码分析

简介: 111

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,未研究

真正执行

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

清除栈内数据

执行完毕返回


相关文章
|
5月前
|
机器人 数据挖掘 数据处理
LingBot-VLA 具身大模型全面开源
蚂蚁灵波团队开源具身大模型LingBot-VLA:在GM-100真机评测中跨本体成功率提升至17.3%(+4.3%),RoboTwin 2.0仿真任务成功率超Pi0.5达9.92%;基于20,000小时多构型真机数据预训练,支持高效微调与跨平台迁移,代码、模型、数据、基准全开源。(239字)
895 0
LingBot-VLA 具身大模型全面开源
|
5月前
|
存储 人工智能 安全
深度揭秘 ooderAgent MIT 开源框架
在人工智能技术快速发展的今天,AI Agent系统已成为实现复杂任务协作的重要架构。ooderAgent(全称ooder SuperAgent)作为一套基于MIT协议的开源企业级AI能力分发与自动化协作框架,通过创新的Agent架构和SKILL管理机制,为企业提供了从简单任务到复杂流程的全场景自动化解决方案。该框架由ooder团队开发,采用SpringCloud分布式架构,于2026年1月发布最新版本v0.6.2,目前已在企业级AI应用领域展现出重要的技术价值。 本研究旨在全面剖析ooderAgent框架的技术特点与技术价值,重点关注其在技术架构设计、应用能力边界、技术创新突破以及商业价值创造
|
7月前
|
人工智能 JSON Java
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
AI时代下,规则引擎的需求反而更旺盛。QLExpress4 通过全面重构,在性能、可观测性和AI友好性上大幅提升。
2110 15
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
|
人工智能 运维 搜索推荐
杭州速车携手蚂蚁百宝箱,快速抢滩文旅AI新市场
杭州速车科技依托蚂蚁百宝箱,打造“福小厝”等9个文旅智能体,实现从技术服务商向“AI+场景”转型。通过低代码平台快速交付,覆盖导览、打卡、营销等场景,服务超10万用户,助力景区提升体验与消费转化。
385 0
|
5月前
|
存储 人工智能 监控
OoderAgent P2P 核心技术揭秘:多 Agent 协作入网架构与全链路安全
ooderAgent是基于MIT协议的开源AI协作框架,采用无中心P2P架构,通过MCP/Route/End三类Agent实现分布式存储与协同。文档详述其自组织拓扑、多Agent入网机制及涵盖身份认证、端到端加密、CAP快速重连的全链路安全体系,并覆盖家庭、企业、教育三大场景实践方案。(239字)
|
5月前
|
人工智能 架构师 安全
从架构师和产品经理角度来看 A2UI 的企业级应用
A2UI(Architect-to-UI)是面向企业级应用的AI驱动开发范式,通过ooderAgent实现架构设计到用户界面的直接转换。它 bridging 架构师与产品经理需求:保障架构一致性、提升开发效率、强化质量与安全,支持云原生、低代码及行业定制化演进。(239字)
|
5月前
|
存储 人工智能 缓存
别再把大脑当成 /dev/null 了!用这套AI指令给记忆装个 "Redis 缓存层"
本文将大脑记忆比作数据库存储,指出传统记忆的"无索引"缺陷。通过一套"记忆架构师AI指令",利用数据预处理、建立索引和持久化策略(遗忘曲线),帮助开发者构建高效、稳固的知识记忆系统,实现认知的"架构升级"。
672 4
|
5月前
|
人工智能 决策智能
多智能体军事协同系统:智能化防务体系中的关键技术框架
多智能体军事协同系统是智能化防务的重要理论方向,通过分布式感知、决策一致与协同控制,构建高效、鲁棒的系统协同模型。本文从概念、技术基础到发展趋势进行系统解析,探讨其在提升整体作战效能、推动系统智能演进中的理论价值,为相关研究提供参考。(238字)
513 2

热门文章

最新文章