基于groovy实现的复杂布尔表达式规则引擎

groovy-bool-rule

个人博客:http://www.geek-make.com

groovy-bool-rule是一款开源的用于计算复杂布尔表达式的规则引擎,使用groovy动态脚本引擎设计与实现。
github: https://github.com/JavaPentesters/groovy-bool-rule

1、基于groovy实现的复杂布尔表达式规则引擎

在规则引擎决策中,规则往往涉及到多个复杂布尔表达式条件的逻辑计算。
条件(condition)通过或与非逻辑运算符组合成复杂的布尔表达式。这类布尔表达式有两种特点:一是条件及表达式是动态可配置的;二是表达式是条件的组合,所以相对是比较复杂的。
本项目基于groovy动态脚本引擎实现了计算复杂性布尔表达式的规则引擎。

1.1 规则与条件模型

Drools规则引擎中定义的规则包含两个部分:LHS(Left Hand Side)和RHS(Right Hand Side),一条规则可以抽象成if-then语句。

when <LHS>
then <RHS>

一条规则也可以理解为包含多个条件的复杂布尔表达式, 其中每一个条件执行的结果要么是true,要么是false。
规则中的条件可以简化为三个部分: “左变量”、“操作符”、“右变量”。比如,某个用户的登陆次数大于10次。
用户的登陆次数就是左变量,"大于"就是,登陆次数的阈值10次就是右变量。

用户的登陆次数> 10次

例如,某个具体的规则:

    boolean result = exp1 || exp2 && (exp3 || exp4) 

其中每一条条件exp1、exp2、exp3、exp4的形式可能如下:

    exp1  = var1 > 5
    exp2  = var2 < 5
    exp3  = var3 != "北京"
    exp4  = var4 >= 20

为方便规则的计算,我们将规则简化成:

    boolean result = 1 || 2 && (3 || 4) 

1 || 2 && (3 || 4)可以看出,规则就是多个条件语句与或非的组合。

使用groovy使用上诉复杂布尔表达式时,可以提前将数字替换为在数字前增加前缀以便在groovy中执行以及计算:

boolean result = e1 || e2 && (e3 || e4)

示例代码:

    /**
     * 字符串内所有数字前面增加前缀
     *
     * @param str   String
     *              原字符串
     * @param prefix String
     *               数字前面需要增加的前缀
     * @return String
     */
    public static String addPrefixBeforeNumber(String str, String prefix) {
        StringBuilder result = new StringBuilder();
        boolean isChar = false;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c >= '0' && c <= '9') {
                sb.append(str.charAt(i));
                if (i == str.length() - 1) {
                    sb.setLength(0);
                }
                isChar = false;
            } else {
                if (sb.length() > 0 && isChar == false) {
                    result.append(prefix).append(sb.toString());
                    sb.setLength(0);
                }
                result.append(c);
                isChar = true;
            }
        }

        return result.toString();
    }

规则的运算操作支持数值运算和字符串运算两大类:

  • 数值运算操作符
序号符号说明
1==等于
2>大于
3<小于
4>=大于等于
5<=小于等于
6!=不等于
  • 字符串运算操作符
序号符号说明
1CONTAINS包含
2NOT_CONTAINS不包含
3EQUAL_IGNORE_CASE不区分大小写的字符串等于
4STRING_EQUAL字符串相等
5NOTSTRING_EQUAL字符串不等
6NOT_EQUAL_IGNORE_CASE不区分大小写的字符串不等
7MATCHES正则匹配
8NOT_MATCHES正则不匹配
1.2 Reference
  • 1、What about == in Groovy?
    https://objectpartners.com/2018/11/07/equals-is-compareto-and-the-groovy-identity-operator/

Behaviour of == In Java == means equality of primitive types or identity for objects.
In Groovy == translates to a.compareTo(b)==0, if they are Comparable, and a.equals(b) otherwise.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于Flink与Groovy实现全实时动态规则智能营销与风控系统,主要利用了Flink的实时流处理能力和Groovy动态语言特性。 首先,Flink作为一个开源流处理框架,可以支持大规模数据的实时处理和分析。通过Flink的流式计算模型和状态管理机制,我们可以实时地对数据流进行分析和处理。在这个系统中,Flink可以承担数据的实时传输和处理任务,从不同的数据源获取数据,并进行实时的数据清洗、过滤、转换、聚合等操作。 其次,Groovy作为一种动态编程语言,具有灵活的语法和扩展性。在该系统中,我们可以使用Groovy作为规则引擎的脚本语言,编写并执行各种规则。Groovy动态性使得我们可以根据实际情况,在系统运行过程中动态地修改、添加、删除规则,从而实现实时的动态规则调整和更新。 基于上述两个技术,我们可以实现全实时动态规则智能营销与风控系统。该系统可以在实时数据流中根据预先定义或动态添加的规则,判断数据是否满足某些条件,进而触发相应的营销或风控策略。例如,在营销方面,可以根据用户的行为数据,动态地识别用户的购买意向,并实时推送个性化的营销信息;在风控方面,可以根据实时的交易数据,动态地检测风险事件,实施实时的异常交易监控和风险预警。 综上所述,基于Flink与Groovy的全实时动态规则智能营销与风控系统,可以实现实时的数据处理和规则匹配,有效地提升营销效果和风控能力。该系统具有高效性、灵活性和可扩展性,能够适应不断变化的业务需求和规则变动。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值