首页 > 其他分享 >阿里规则引擎 QLExpress 学习

阿里规则引擎 QLExpress 学习

时间:2023-11-07 17:15:22浏览次数:27  
标签:引擎 execute QLExpress runner express 阿里 context new null

maven依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>QLExpress</artifactId>
    <version>3.2.0</version>
</dependency>

简单运算表达式

ExpressRunner runner = new ExpressRunner();
DefaultContext<String, Object> context = new DefaultContext<>();
context.put("a",1);
context.put("b",2);
context.put("c",3);
String express = "a + b * c";
Object execute = runner.execute(express, context, null, true, false);
System.out.println(execute);

逻辑表达式

ExpressRunner runner = new ExpressRunner();
runner.addOperatorWithAlias("如果", "if", null);
runner.addOperatorWithAlias("则", "then", null);
runner.addOperatorWithAlias("否则", "else", null);

DefaultContext<String, Object> context = new DefaultContext<>();
context.put("语文", 100);
context.put("数学", 100);
context.put("英语", 90);
String express = "如果 (语文 + 数学 + 英语 > 270) 则 {return 1;} 否则 {return 0;";
Object execute = runner.execute(express, context, null, true, false);
System.out.println(execute);

复杂逻辑表达式

ExpressRunner runner = new ExpressRunner();
runner.addOperatorWithAlias("如果", "if", null);
runner.addOperatorWithAlias("或", "||", null);
runner.addOperatorWithAlias("且", "&&", null);
runner.addOperatorWithAlias("等于", "==", null);
runner.addOperatorWithAlias("大于", ">", null);
runner.addOperatorWithAlias("小于", "<", null);
runner.addOperatorWithAlias("则", "then", null);
runner.addOperatorWithAlias("否则", "else", null);
runner.addOperatorWithAlias("返回", "return", null);
runner.addFunctionOfClassMethod("获取JSON中的值", Test.class.getName(), "getValue", new String[]{"String"}, null);
runner.addFunctionOfClassMethod("字符串等于", Test.class.getName(), "equals", new String[]{"String", "String"}, null);

DefaultContext<String, Object> context = new DefaultContext<>();
String express = "如果 (获取JSON中的值(\"code\") 等于 1) 则 {返回 true} 否则 {返回 false}";
Object execute = runner.execute(express, new DefaultContext<>(), null, true, false);
System.out.println(execute);

// DefaultContext<String, Object> context = new DefaultContext<>();
// String express = "如果 ( 字符串等于( 获取JSON中的值(\"message\"), \"success\") ) 则 {返回 true} 否则 {返回 false}";
// Object execute = runner.execute(express, context, null, true, false);
// System.out.println(execute);

完整代码


import com.alibaba.fastjson.JSONObject;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import com.ruoyi.common.core.utils.StringUtils;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class Test {
    public static void main(String[] args) throws Exception {

        // 简单运算表达式
//        ExpressRunner runner = new ExpressRunner();
//        DefaultContext<String, Object> context = new DefaultContext<>();
//        context.put("a",1);
//        context.put("b",2);
//        context.put("c",3);
//        String express = "a + b * c";
//        Object execute = runner.execute(express, context, null, true, false);
//        System.out.println(execute);


//        逻辑表达式
//        ExpressRunner runner = new ExpressRunner();
//        runner.addOperatorWithAlias("如果", "if", null);
//        runner.addOperatorWithAlias("则", "then", null);
//        runner.addOperatorWithAlias("否则", "else", null);
//
//        DefaultContext<String, Object> context = new DefaultContext<>();
//        context.put("语文", 100);
//        context.put("数学", 100);
//        context.put("英语", 90);
//        String express = "如果 (语文 + 数学 + 英语 > 270) 则 {return 1;} 否则 {return 0;}";
//        Object execute = runner.execute(express, context, null, true, false);
//        System.out.println(execute);

        //复杂逻辑表达式
        ExpressRunner runner = new ExpressRunner();
        runner.addOperatorWithAlias("如果", "if", null);
        runner.addOperatorWithAlias("或", "||", null);
        runner.addOperatorWithAlias("且", "&&", null);
        runner.addOperatorWithAlias("等于", "==", null);
        runner.addOperatorWithAlias("大于", ">", null);
        runner.addOperatorWithAlias("小于", "<", null);
        runner.addOperatorWithAlias("则", "then", null);
        runner.addOperatorWithAlias("否则", "else", null);
        runner.addOperatorWithAlias("返回", "return", null);
        runner.addFunctionOfClassMethod("获取JSON中的值", Test.class.getName(), "getValue", new String[]{"String"}, null);
        runner.addFunctionOfClassMethod("字符串等于", Test.class.getName(), "equals", new String[]{"String", "String"}, null);

//        DefaultContext<String, Object> context = new DefaultContext<>();
//        String express = "如果 (获取JSON中的值(\"code\") 等于 1) 则 {返回 true} 否则 {返回 false}";
//        Object execute = runner.execute(express, new DefaultContext<>(), null, true, false);
//        System.out.println(execute);

        DefaultContext<String, Object> context = new DefaultContext<>();
        String express = "如果 ( 字符串等于( 获取JSON中的值(\"message\"), \"success\") ) 则 {返回 true} 否则 {返回 false}";
        Object execute = runner.execute(express, context, null, true, false);
        System.out.println(execute);
    }

    /**
     * 获取JSON中属性的值
     *
     * @param name 属性名
     * @return 结果
     */
    public static Object getValue(String name) {
        String json = "{\"code\": 1,\"message\": \"success\"}";
        return JSONObject.parseObject(json).get(name);
    }

    /**
     * 判断两个值是否相等
     *
     * @param param1 值1
     * @param param2 值2
     * @return 结果
     */
    public static boolean equals(String param1, String param2) {
        return StringUtils.equals(param1, param2);
    }

}

仿实际应用场景

伪代码

if(新用户) {
  赠送优惠券;
} else {
  赠送积分;
}
if(有手机号){
  发送短信;
}

完整代码

import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class Test {

    public static void main(String[] args) throws Exception {
        ExpressRunner runner = new ExpressRunner();

        // 定义逻辑
        runner.addOperatorWithAlias("如果", "if", null);
        runner.addOperatorWithAlias("则", "then", null);
        runner.addOperatorWithAlias("否则", "else", null);

        // 定义执行方法
        runner.addFunctionOfClassMethod("赠送优惠券", Test.class.getName(), "sendCoupon", new Class[]{Integer.class}, null);
        runner.addFunctionOfClassMethod("赠送积分", Test.class.getName(), "sendIntegral", new Class[]{Integer.class}, null);
        runner.addFunctionOfClassMethod("发送短信", Test.class.getName(), "sendMsg", new String[]{"String"}, null);

        // 定义逻辑
        runner.addFunctionOfServiceMethod("是否新用户", new Test(), "isNewAcct", new Class[]{Integer.class}, null);
        runner.addFunctionOfServiceMethod("是否有手机号", new Test(), "isMobile", new Class[]{Integer.class}, null);

        // 定义规则
//        String express = "如果 (是否新用户(1)) 则 {赠送优惠券(1)} 否则 {赠送积分(1)} 如果(是否有手机号(1)) 则 {发送短信(\"欢迎您哦\")}";
        String express = "如果  (是否新用户(2)) 则 { 赠送优惠券(1)} 否则 { 赠送积分(1)} 如果 (是否有手机号(1)) 则 {发送短信(\"欢迎您哦\")}";
        DefaultContext<String, Object> context = new DefaultContext<>();
        Object execute = runner.execute(express, context, null, true, false);
        System.out.println(execute);
    }

    /**
     * 赠送优惠券
     *
     * @param num 优惠券
     */
    public static void sendCoupon(Integer num) {
        System.out.println("赠送优惠券啦:" + num);
    }

    /**
     * 赠送积分
     *
     * @param num 积分
     */
    public static void sendIntegral(Integer num) {
        System.out.println("赠送积分啦:" + num);
    }

    /**
     * 发送短信
     *
     * @param msg 短信
     * @return 内容
     */
    public String sendMsg(String msg) {
        System.out.println("发送短信啦:" + msg);
        return msg;
    }

    /**
     * 判断是否为新客户
     *
     * @param userType 类型
     * @return 结果
     */
    public boolean isNewAcct(Integer userType) {
        return userType == 1;
    }

    /**
     * 是否有手机号
     *
     * @param mobileType 类型
     * @return 结果
     */
    public boolean isMobile(Integer mobileType) {
        return mobileType == 1;
    }
}

标签:引擎,execute,QLExpress,runner,express,阿里,context,new,null
From: https://www.cnblogs.com/Linzj5950/p/17815385.html

相关文章

  • 没有文件扩展“.vbs”的脚本引擎的解决方案
    当你在运行一些基于VBS脚本语言的文件时,系统可能报错。这时候可能是你的VBS脚本服务在注册表中出错了,原因可能是卸载或安装一些代码不规范的程序引起的。这里给出无法找到脚本引擎"vbscript"的解决方法:1)找到文件:C:\WINDOWS\inf\wsh.inf,右键“安装”;2)开始→运行行里输入......
  • 代码规范(阿里)
    一、代码规范:接口中分方法和属性,不加修饰符号如:publc,正确为:voidf()long或Long,统一用Long类型处理常量按功能分类归类if/for/while/switch/do等保留字与括号之间都必须加空格注释的双斜线与注释内容之间有且仅有一个空格当字符数超过120个时,换行规则:第二行相对第一行缩进4个空格......
  • PHP如何判断一个网址是否被百度搜索引擎收录?判断的原理又是什么?
    下面就是我今天用PHP实现这个功能的具体代码:1234567891011121314151617181920212223242526function checkBaiduInclude($url){    $url = 'http://www.baidu.com/s?wd='.$url;    $ch = curl_init();    curl_setopt($ch,......
  • SRE-基于阿里云的告警体系建设
    基于数据源来做分类sls日志告警配置以及查看方式sls日志左侧点击铃铛进入告警中心配置告警规则触发就是sls日志的查询语句,配置的规则时间内,查询语句查询的数量达到配置值,就会触发告警现状5XX告警应用error日志告警云产品监控告警配置以及查看方式阿里云直接搜索云监控......
  • 华为云云容器引擎CCE产品文档带来4个升级,降低使用难度
    本文分享自华为云社区《华为云云容器引擎CCE产品文档优化升级!》,作者:云容器大未来。云原生产品技术栈庞大,需要用户对容器、Kubernetes等核心技术都有扎实的理解和掌握;同时问题定位和排查也较为困难,需要用户对不同系统模块原理非常熟悉。这些因素导致云原生产品上手门槛高、配置......
  • 阿里云网盘扩容
    1、登录阿里云控制台进行在线扩容2、使用以下命令确认已有分区的文件系统类型df-Th3、运行以下命令扩容分区growpart/dev/vda1注意:1之前有空格4、扩容文件系统resize2fs/dev/vda15、运行以下命令检查扩容后的结果df-Th......
  • 阿里云-docker容器相关操作
    查看所有的容器dockerps-a进入容器dockerexec-it容器ID/bin/bash停用全部运行中的容器dockerstop$(dockerps-q)删除全部容器dockerrm$(dockerps-aq)多条命令连接符&dockerstop$(dockerps-q)&dockerrm$(dockerps-aq)......
  • 阿里云安装docker
    yum更新yumupdateyuminstallepel-release-yyumcleanallyumlist安装并运行dockeryuminstalldocker-io-ysystemctlstartdocker检查安装结果docker-vdockerinfo启动dockersystemctlstartdocker#运行docker的守护进程重启dockersystemctlrestar......
  • 阿里大佬:DDD 领域层,该如何设计?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • GOM引擎搭建时需要注意哪些问题以及需要准备哪些东西
    如何选择合适的gom引擎版本首先,您需要了解自己的需求和预算。市面上的gom引擎版本琳琅满目,价格也各不相同。在选择版本时,建议您根据自己的实际情况进行选择,切勿盲目追求高级版本。同时,建议在购买前先查看该版本的官方网站和用户评价,确保该版本具备所需的功能并符合您的需求。传奇版......