介绍
从下面rule规则整体结构可以看出,LHS
其实指的是when后面的条件部分
,RHS
指的是then后面的结论部分
rule “name“
attributes
when
LHS --Left Hand Side
then
RHS -- Right Hand Side
end
目录
一、LHS
1.1、基础语法
1.1.1、语法格式
格式:patternBinding : patternType ( constraints)
patternBinding
表示对象变量的绑定(前缀为$符号),patternType
指规则匹配的对象类型,constraints
表示规则匹配的条件,比如下面是一个判断职员收入的规则形式
$s:Staff($s.getIncome() >= 5000.00 )
1.1.2、且/或不同写法
下面两种都是且
的条件关系,需要同时满足才会触发规则
$s:Staff($s.getIncome() >= 5000.00 && $s.getIncome() < 10000.00)
$s1:Staff($s1.getIncome() >= 5000.00 )
and
$s2:Staff($s2.getIncome() < 10000.00 )
或
则分别使用||
逻辑或符号和or
关键字
1.1.3、逗号分隔符
逗号分隔符也是且
的关系,如下形式需同时满足两个规则
$s:Staff($s.getIncome() >= 5000.00 , $s.getIncome() < 10000.00)
1.1.4、属性简写
第二种写法属性看上去更简单
$s:Staff($s.getIncome() >= 5000.00)
$s:Staff(income >= 5000.00)
1.1.5、变量绑定
可以在规则对象内部,对属性
进行变量定义,然后在其他地方引用
$s:Staff($ic:income, $ic < 10000)
1.1.6、&&和||特殊写法
按照java的习惯,我们一般会如下方式编写判断条件
$s:Staff(income >= 5000.00 && income < 10000.00)
但在drools中可用如下简化,多个条件使用一个属性即可
$s:Staff(income >= 5000.00 && < 10000.00)
$s:Staff(income ((>= 5000.00 && < 10000.00) || (>= 15000.00 && < 20000.00)))
1.1.7、!.判空符号
通常从对象中获取某个属性值,我们会使用obj.attribute
形式,通过.
号取值,而在drools中还可用使用obj!.attribute
形式,差别在于!.
会先进行obj判空,不为空则取值
1.2、集合
1.2.1、Map集合
定义一个map集合,放入两个值
HashMap<String, String> map = new HashMap<>();
map.put("key1","zhangsan");
map.put("key2","lisi");
kieSession.insert(map);
数据获取:在规则文件中,需要先import
集合,直接绑定变量$m : Map()
后就可以使用
条件判断:Map(this["key1"] == "zhangsan")
表示如果map集合中key1的值为zhangsan,规则才会触发
package com.other;
import java.util.Map
rule "mapAndList"
when
// $m : Map()
$m : Map(this["key1"] == "zhangsan")
then
System.out.println("key1=" + $m.get("key1"));
end
1.2.2、List集合
定义一个list集合,放入两个Staff
对象,为分别设置收入为1000
和5000
List<Staff> list = new ArrayList<>();
Staff s1 = new Staff();
s1.setIncome(new BigDecimal(1000));
Staff s2= new Staff();
s2.setIncome(new BigDecimal(5000));
list.add(s1);
list.add(s2);
kieSession.insert(list);
数据获取:需要先import
集合和对象,直接绑定变量$l : List()
后就可以使用,如果直接获取对象中的属性值,需要先强转
,如((Staff)$l.get(0)).getIncome())
先强转为Staff然后获取里面的属性值
条件判断:$s : Staff(income == 5000) from $l
表示从list集合中提取income等于5000的Staff对象,这里使用到from
关键字
package com.other;
import java.util.List
import com.example.droolsdemo.model.Staff
rule "mapAndList"
when
$l : List()
$s : Staff(income == 5000) from $l
then
System.out.println("Income=" + ((Staff)$l.get(0)).getIncome());
System.out.println("Income=" + $s.getIncome());
end
1.2.3、集合包含判断
contains
用于判断集合中是否包含某个值
$s:Staf( skillList contains "java")
not contains
相反
1.2.4、属于集合判断
memberOf
用于判断值中是否属于集合中
$s:Staff( area memberOf ["北京","上海","广州","深圳"])
not memberOf
相反
二、RHS
RHS部分的逻辑,主要是对working memory中的数据进行insert、update、delete或modify操作
2.1、insert使用
insert()
函数是往Working Memory中插入FACT对象
java中写法:
KieSession kieSession = kieContainer.newKieSession("xxxxx-rules");
Staff s = new Staff();
s.setName("张三");
s.setIncome(new BigDecimal(8000.00));
kieSession.insert(s);
drl文件中写法:
rule "xxxxxx"
when
then
Staff s = new Staff();
s.setName("张三");
s.setIncome(new BigDecimal(8000.00));
insert(s)
end
调用insert()
后,规则会进行重新匹配,所以通常与lock-on-active
属性配合使用,设置为true
则会重新执行满足条件的规则。
2.2、update使用
update()
函数可对Working Memory中的FACT对象进行更新操作
java中写法:
Staff s= new Staff ();
//1.执行insert(),并返回fact对象
s.setIncome(new BigDecimal(100));
FactHandle factHandle = kieSession.insert(s);
kieSession.fireAllRules();
//2.修改income值,使用update()更新fact对象
s.setIncome(new BigDecimal(200));
kieSession.update(factHandle, s);
kieSession.fireAllRules();
drl文件中写法:
rule "规则一"
when
$s:Staff(income = 5000.00)
then
//在规则一中更新了income值,符合规则二的判断条件,所以会触发规则二
$s.setIncome(new BigDecimal(8000.00));
update($s)
end
rule "规则二"
when
$s:Staff(income == 8000.00)
then
end
2.3、delete使用
delete()
函数可对Working Memory中的FACT对象进行删除操作
java中写法:
Staff s= new Staff ();
//1.执行insert(),并返回fact对象
s.setIncome(new BigDecimal(100));
FactHandle factHandle = kieSession.insert(s);
kieSession.fireAllRules();
//2.使用delete()删除fact对象后,再次执行fireAllRules()时不会触发规则
kieSession.delete(factHandle);
kieSession.fireAllRules();
// 其它写法
// kieSession.delete(factHandle ,FactHandle.State.ALL); //删除所有
// kieSession.delete(factHandle ,FactHandle.State.STATED); //删除真实对象
// kieSession.delete(factHandle ,FactHandle.State.LOGICAL); //逻辑删除
drl文件中写法:
rule "规则一"
when
$s:Staff(income = 5000.00)
then
//在规则一中删除了工作内存中的Staff对象,规则二中再次调用时不会触发
delete($s)
end
rule "规则二"
when
$s:Staff(income == 5000.00)
then
end
2.4、modify使用
modify()
函数用来更改FACT对象中的属性值,格式如下:
modify ( <fact-expression> ) {
<expression> [ , <expression> ]*
}
drl文件中写法:
rule "规则一"
when
$s:Staff(income = 5000.00)
then
//在规则一中修改Staff对象中的income属性值,规则二中会触发
modify($s){
setIncome(8000.00)
}
end
rule "规则二"
when
$s:Staff(income == 8000.00)
then
end