Contents
  1. 1. 解决问题
  2. 2. 现有方案
  3. 3. RuleEngine接口
  4. 4. 一个例子
    1. 4.1. 语法验证
    2. 4.2. 执行规则
  5. 5. RuleEngine语法
    1. 5.1. 基本类型
    2. 5.2. 模板参数运算
    3. 5.3. 运算符
      1. 5.3.1. 算法运算符
      2. 5.3.2. 字符串运算符
      3. 5.3.3. Set运算
      4. 5.3.4. List运算
      5. 5.3.5. Map运算
      6. 5.3.6. Collection运算
      7. 5.3.7. 关系运算
      8. 5.3.8. 逻辑运算
  6. 6. 工程配置

解决问题

现有方案

RuleEngine接口

一个例子

语法验证

check方法可以用来验证“$testDoubleVar < -0.1”这条规则语法书写是否正确,

RulesEngine rulesEngine = RulesEngineFactory.createRulesEngine(new RulesEngineListener() {
@Override
public RulesEngineRenderValue onRuleRenderRequest(String key) {
return null;
}
});
try {
bool isSuccess = rulesEngine.check("$testDoubleVar < -0.1 ");
} catch (ReException e) {
e.printStackTrace();
}

执行规则

//输入参数key对应的value
Map<String, Object> map = new HashMap();
map.put("key1", "123");
map.put("key2", "android");

//创建引擎,实现参数key对应value的查询方法
RulesEngine rulesEngine = RulesEngineFactory.createRulesEngine(new RulesEngineListener() {
@Override
public RulesEngineRenderValue onRuleRenderRequest(String key) {
RulesEngineRenderValue value = new RulesEngineRenderValue();
value.setObject(map.get(key));//所有value要经过RulesEngineRenderValue转化
return value;
}
});


//输入规则基本信息
RulesEngineParam param = new RulesEngineParam();
param.setTemplateRule("$key1 == \"123\" and $key2 == \"android\"");
param.setAppInfo("Unit Test");
param.setRuleId(UUID.randomUUID().toString());

//执行规则
try {
Object object = rulesEngine.execute(UUID.randomUUID().toString(), param);
} catch (RulesEngineException e) {
e.printStackTrace();
}

RuleEngine语法

基本类型

类型 说明 例子 备注
整型 数字整型 1000 取值范围与Java中Long一致
浮点型 数字整型浮点型 3.1 取值范围与Java中Double长整型一致
字符串 字符串变量 “1234abcd”
布尔类型 表示true或者false true
模板参数类型 表示一个参数 $ctype 参数需要调用方通过API传入
Set 表示一组变量,每个变量唯一 {“a”, “b”}
List 表示一组变量,每个变量不唯一 [“a”, “b”]
Map 表示一组key,value对 { “1”=”3” , “2”=”3” , “3”=”3” }

模板参数运算

例子 备注
$testStringVar == “1” 返回结果依赖$testStringVar的取值

运算符

算法运算符

运算符类型 说明 例子 备注
+ 加法 2 + 3 返回5
- 减发 3 - 2 返回1
* 乘法 3.0 * 2 返回6.0
/ 除法 5 / 2 返回2.5

字符串运算符

运算符类型 说明 例子 备注
contains 包含 “1234” contains “123” 返回true
matches 正则匹配,和Java String中的match方法一样 “abcdef” matches “abcd.*” 返回true

Set运算

运算符类型 说明 例子 备注
contains by 字符串是否被Set中元素包含 “abcdef” contains by { “abcdefg” , “bcdef” } “abcdefg” contains “abcdef”, 返回true
contains one of 字符串是否包含Set中的元素 “abcdefg” contains one of { “abcde” , “bcdeff” } “abcdefg” contains “abcde”, 返回true
matches by 字符串是否被Set中元素matches “abcde.*” matches by { “abcdef” , “bcdef” } “abcdef” matches “abcde.*” 返回true
matches one of 字符串是否matches Set中的元素 “abcde” matches one of { “abcd.“ , “bcdef.“ } “abcde” matches “abcd.*” 返回true
== 两个Set是相等 { “abcdef” , “bcdef” } == { “abcdef” , “bcdef” } 返回true
in 数值是否在Set中 “abcdef” in { “abcdef” , “bcdef” } 返回true
not in 数值是Set中 “abcdef” not in { “abcdef” , “bcdef” } 返回true

List运算

运算符类型 说明 例子 备注
count in 返回List元素的个数 12 count in [ 12 , 12 , 1 ] == 2 返回true

Map运算

运算符类型 说明 例子 备注
key in 返回元素是否在map的key中 “1” key in { “1”=”3” , “2”=”3” , “3”=”3” } 返回true

Collection运算

Collection包含Set、List、Map

运算符类型 说明 例子 备注
size of 返回Collection大小 size of [ 12 , 12 , 1 ] == 3 返回true

关系运算

运算符类型 说明 例子 备注

| 大于 | 2 > 3 | 返回false
= | 大于等于 | 3 >= 2 | 返回true
< | 小于 | 3.0 < 2 | 返回false
<= | 小于等于 | 5 <= 2 | 返回false
== | 等于 | 5 == 2 | 返回false
!= | 不等于 | 5 != 2 | 返回true

逻辑运算

运算符类型 说明 例子 备注
and (-6 +5.4 > 6.1 -3) and 5 > 4 返回false
or (3 < 2 or 5 < 4) or (3 > 2 and 5 > 4) 返回true
not 取反 not(3 > 2) 返回false

工程配置

<dependency>
<dependency>
<groupId>com.ali.wy.madai</groupId>
<artifactId>rules-engine</artifactId>
<version>1.0.0.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>4.7</version>
</dependency>
<!-- middleware logger provided -->
<dependency>
<groupId>com.taobao.middleware</groupId>
<artifactId>logger.api</artifactId>
<version>2.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
</dependency>
Contents
  1. 1. 解决问题
  2. 2. 现有方案
  3. 3. RuleEngine接口
  4. 4. 一个例子
    1. 4.1. 语法验证
    2. 4.2. 执行规则
  5. 5. RuleEngine语法
    1. 5.1. 基本类型
    2. 5.2. 模板参数运算
    3. 5.3. 运算符
      1. 5.3.1. 算法运算符
      2. 5.3.2. 字符串运算符
      3. 5.3.3. Set运算
      4. 5.3.4. List运算
      5. 5.3.5. Map运算
      6. 5.3.6. Collection运算
      7. 5.3.7. 关系运算
      8. 5.3.8. 逻辑运算
  6. 6. 工程配置