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月前
|
存储 人工智能 安全
深度揭秘 ooderAgent MIT 开源框架
在人工智能技术快速发展的今天,AI Agent系统已成为实现复杂任务协作的重要架构。ooderAgent(全称ooder SuperAgent)作为一套基于MIT协议的开源企业级AI能力分发与自动化协作框架,通过创新的Agent架构和SKILL管理机制,为企业提供了从简单任务到复杂流程的全场景自动化解决方案。该框架由ooder团队开发,采用SpringCloud分布式架构,于2026年1月发布最新版本v0.6.2,目前已在企业级AI应用领域展现出重要的技术价值。 本研究旨在全面剖析ooderAgent框架的技术特点与技术价值,重点关注其在技术架构设计、应用能力边界、技术创新突破以及商业价值创造
|
人工智能 运维 搜索推荐
杭州速车携手蚂蚁百宝箱,快速抢滩文旅AI新市场
杭州速车科技依托蚂蚁百宝箱,打造“福小厝”等9个文旅智能体,实现从技术服务商向“AI+场景”转型。通过低代码平台快速交付,覆盖导览、打卡、营销等场景,服务超10万用户,助力景区提升体验与消费转化。
393 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指令",利用数据预处理、建立索引和持久化策略(遗忘曲线),帮助开发者构建高效、稳固的知识记忆系统,实现认知的"架构升级"。
686 4
|
5月前
|
人工智能 决策智能
多智能体军事协同系统:智能化防务体系中的关键技术框架
多智能体军事协同系统是智能化防务的重要理论方向,通过分布式感知、决策一致与协同控制,构建高效、鲁棒的系统协同模型。本文从概念、技术基础到发展趋势进行系统解析,探讨其在提升整体作战效能、推动系统智能演进中的理论价值,为相关研究提供参考。(238字)
540 2
|
5月前
|
人工智能 自然语言处理 运维
业内首发泛娱乐底座大模型!元象开源XVERSE-Ent中英双模型,单卡部署超低门槛
元象开源首款聚焦泛娱乐场景的大模型XVERSE-Ent,含中英双版本,专精角色一致性、长剧情理解与多元语境适配,支持轻量化部署,助力开发者低成本打造AI社交、游戏与创意内容应用。
516 3
|
6月前
|
应用服务中间件 微服务
微服务雪崩问题
高并发下商品服务占用过多Tomcat连接,可能导致接口延迟或阻塞,进而影响依赖它的购物车服务,引发连锁反应。若不加控制,将导致整个微服务集群雪崩。微服务保护旨在防止此类级联失败,保障系统稳定。
|
6月前
|
缓存 前端开发 API
Python 开发进阶:从初级到全栈工程师的能力提升路径
本文系统梳理了Python开发者从初级到全栈的进阶路径,涵盖框架深度应用、性能优化、架构设计、容器化部署及DevOps实践。通过分阶段技能升级与真实项目落地,助力开发者突破“脚本思维”,构建全链路工程能力,实现从“会编码”到“能交付完整系统”的质变跨越。(238字)

热门文章

最新文章