By
Peng Jun
Updated:
解决问题
现有方案
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> <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>
|