🔔🔔好消息!好消息!🔔🔔
有需要的朋友👉:微信号 kaigejava2022
1、基本的匹配规则
1.1变量
drools使用匹配的方式对Fact进行比对,
比如
Java代码 
account : Account(balance > 100)
这个规则的含义就是在Fact中找到类型为Account,且balance属性值大于100的所有Account实例。
可以指定变量来描述一个类型或者一个映射一个类的属性,
比如
Java代码 
$account : Account($type : type)
使用$Variable来定义一个变量,这里定义了两个变量,$account表示定义一个类型为Account的变量,而$type映射Account类型中的type属性。定义变量是为了在后续的规则中使用。
Java代码 
$account : Account(balance >100)
Customer(account == $account)
这个就是说要找到一些Custom类型的Fact,且其account属性必须满足前面定义的balance>100的条件。
1.2类型
drools支持各种java数据类型
String:字符串
Java代码 
Customer(name == "john")
正则表达式:
Java代码 
Customer(name matches "[A-Z][a-z]+")
表示Customer类型的name属性必须满足首字母为大写A-Z,且第二位以后有一个或者多个小写的a-z组成。
Date:日期类型
Java代码 
Account(dateCreate > "01-Feb-2009")
日期的格式默认是"dd-mmmm-yyyy",可以更改。
Boolean:布尔类型
Java代码 
Transaction(isApprove == true)
Enum:枚举类型
Java代码 
Account(type == Account.Type.STUDENT)
1.3注释
单行注释://或者#
多行注释: /* */
1.4包
Java代码 
package com.kingsun.drools.rules
声明该规则文件所属的包,是一种namespace组织方式,和java的包类似,物理上不需要存在相应的目录结构,它只是逻辑上的划分。
1.5导入
import可以导入在规则中使用到的类,也可以导入在规则中使用到的外部定义的functiong
Java代码 
import java.util.Map;
import com.kingsun.drools.service.LegacyBankService.extractData;
当导入方法时,这个方法必须是static的,因为利用的是jdk1.5的static import特性。
1.6全局变量global
声明一个global变量
Java代码 
global ReportFactory reportFactory;
给全局变量赋值
Java代码 
session.setGlobal("reportFactory", reportFactory);
或者
Java代码 
List<Command> commands = new ArrayList<Command>();
commmands.add(CommandFactory.newSetGlobal("reportFactory", reportFactory));
使用全局变量
Java代码 
session.getGlobals();
1.7函数Functions
function可以在规则文件中定义,但更多的是使用外部类中定义的static方法,这样只要java中可以实现的逻辑,在规则中都可以做为function调用。
调用外部类的functiong需要注意的是方法必须是静态的,static,而且这个类可以在Help辅助类中定义。
外部类需要import,此时在function中用到的参数类型也需要import。
如: 在外部的ValidationHelper辅助类中定一个一个static方法
Java代码 
public static double calculateAccount(Account account) {
return 100 + account.balance * 1.2;
}
在规则drl文件中可以这么使用:
Drl代码 
import com.kingsun.drools.domain.Account;
import function com.kingsun.drools.util.ValidationHelper.calculateAccount;
rule "validation account"
when
$account : Account(balance > 100)
then
Account(balance == calculateAccount($account));
end
1.8方言dialect
在规则表达式中可以使用方言来简化表达式,使之更加具有可读性。
Java代码 
package com.kingsun.drools.rules;
dialect "mvel"
方言默认的是java,drools也支持mvel,在package的后面声明该规则文件使用的方言
mvel
mvel是一种基于java应用程序的表达式语言,它支持属性和方法的直接访问
简单属性表达式:
Java代码 
($customer.name == "john") && (balance > 100)
满足姓名为“john”,且balance必须大于100的customer
支持属性导航:
Bean属性导航
Java代码 
$customer.address.postalCode = "123" 等同于 $customer.getAddress().setPostalCode("123")
访问List数据结构
Java代码 
$customer.accounts[3] 等同于 $customer.getAccounts(3)
访问Map数据结构
Java代码 
$customerMap["123"] 等同于$customerMap.get["123"]
内置的List、Map和数组arrays
Map:创建一个AccountMap实例-->
Java代码 
["001", new Account("001"), "002", new Account("002")]
等同于创建了一个Map,并向Map中put了两个entry。
List:创建一个List实例-->
Java代码 
["001", "002", "003"]
等同于创建了一个List,并向List中add了三个对象。
Arrays:创建一个数组-->
Java代码 
{"001", "002", "003"}
等同于创建了一个Array,并初始化了三个成员。
嵌套
使用这个可以方便的访问复杂对象中包括的集合类型的对象。
Java代码 
listOfPostCode = (postCode in (addresses in $customerS))
这个得到一个postCode列表,它是customers集合中的每一个custemer对象的地址属性中包含的postCode信息的汇集。
强制转换
当使用array = {1, 2, 3}时,mvel会自动将元素转换成integer类型。
返回值
保存变量的值等于最后一次赋予的值。
mvel同时还支持方法调用、控制流、赋值、动态类型等等,使用mvel的性能很好,不过要小心使用。在drools中有一些核心特性就是通过mvel来实现的。
1.9规则的条件部分
And 与
Java代码 
$customer : Customer(name == "john", age > 20)
在condition中使用换行来表示与
OR 或
Java代码 
$customer : Customer(name == "john" || age > 20)
Not 非
Java代码 
not Account(type == Account.Type.STUDENT)
表示所有账户类型不是STUDENT的账户
exists 存在
Java代码 
exists Account(type == Account.Type.STUDENT)
Eval
捕获异常,只要eval表达式中的结果为true或者false就可以
Java代码 
$account : Account()
; font-family: Helvetica, Tahoma, Arial, sans-serif;">
https://blog.csdn.net/caomiao2006/article/details/46417207