drools规则语法(一)

  • 作者: 凯哥Java(公众号:凯哥Java)
  • Drools
  • 时间:2021-07-15 17:23
  • 5396人已阅读
简介 1、基本的匹配规则1.1变量drools使用匹配的方式对Fact进行比对,比如Java代码   account : Account(balance > 100)   这个规则的含义就是在Fact中找到类型为Account,且balance属性值大于100的所有Account实例。可以指定变量来

🔔🔔好消息!好消息!🔔🔔

 如果您需要注册ChatGPT,想要升级ChatGPT4。凯哥可以代注册ChatGPT账号代升级ChatGPT4

有需要的朋友👉:微信号 kaigejava2022

1、基本的匹配规则

1.1变量

drools使用匹配的方式对Fact进行比对

比如

Java代码   收藏代码

  1. account : Account(balance > 100)  

 这个规则的含义就是在Fact中找到类型为Account,且balance属性值大于100的所有Account实例。

可以指定变量来描述一个类型或者一个映射一个类的属性

比如

Java代码   收藏代码

  1. $account : Account($type : type)  

 使用$Variable来定义一个变量,这里定义了两个变量,$account表示定义一个类型为Account的变量,而$type映射Account类型中的type属性。定义变量是为了在后续的规则中使用。

Java代码   收藏代码

  1. $account : Account(balance >100)   

  2. Customer(account == $account)  

 这个就是说要找到一些Custom类型的Fact,且其account属性必须满足前面定义的balance>100的条件。

1.2类型

drools支持各种java数据类型

String:字符串

Java代码   收藏代码

  1. Customer(name == "john")  

正则表达式:

 

Java代码   收藏代码

  1. Customer(name matches "[A-Z][a-z]+")  

 

表示Customer类型的name属性必须满足首字母为大写A-Z,且第二位以后有一个或者多个小写的a-z组成。

Date:日期类型

Java代码   收藏代码

  1. Account(dateCreate > "01-Feb-2009")  

 

日期的格式默认是"dd-mmmm-yyyy",可以更改。

Boolean:布尔类型

Java代码   收藏代码

  1. Transaction(isApprove == true)  

 

Enum:枚举类型

Java代码   收藏代码

  1. Account(type == Account.Type.STUDENT)  

 

1.3注释

单行注释://或者#

多行注释: /*   */

1.4包

Java代码   收藏代码

  1. package com.kingsun.drools.rules  

 

声明该规则文件所属的包,是一种namespace组织方式,和java的包类似,物理上不需要存在相应的目录结构,它只是逻辑上的划分。

1.5导入

import可以导入在规则中使用到的类,也可以导入在规则中使用到的外部定义的functiong

Java代码   收藏代码

  1. import java.util.Map;  

  2.   

  3. import com.kingsun.drools.service.LegacyBankService.extractData;  

 

导入方法时,这个方法必须是static的,因为利用的是jdk1.5的static import特性。

1.6全局变量global

声明一个global变量

Java代码   收藏代码

  1. global ReportFactory reportFactory;  

 

给全局变量赋值

Java代码   收藏代码

  1. session.setGlobal("reportFactory", reportFactory);  

 

或者

Java代码   收藏代码

  1. List<Command> commands = new ArrayList<Command>();  

  2.   

  3. commmands.add(CommandFactory.newSetGlobal("reportFactory", reportFactory));  

 使用全局变量

Java代码   收藏代码

  1. session.getGlobals();  

 

1.7函数Functions

function可以在规则文件中定义,但更多的是使用外部类中定义的static方法,这样只要java中可以实现的逻辑,在规则中都可以做为function调用。

调用外部类的functiong需要注意的是方法必须是静态的,static,而且这个类可以在Help辅助类中定义。

外部类需要import,此时在function中用到的参数类型也需要import。

如: 在外部的ValidationHelper辅助类中定一个一个static方法

Java代码   收藏代码

  1. public static double calculateAccount(Account account) {  

  2.   

  3.     return 100 + account.balance * 1.2;  

  4.   

  5. }  

 

在规则drl文件中可以这么使用:

Drl代码   收藏代码

  1. import com.kingsun.drools.domain.Account;  

  2.   

  3. import function com.kingsun.drools.util.ValidationHelper.calculateAccount;  

  4.   

  5. rule "validation account"  

  6.   

  7.     when  

  8.   

  9.         $account : Account(balance > 100)  

  10.   

  11.     then  

  12.   

  13.         Account(balance == calculateAccount($account));  

  14.   

  15. end  

 

 

1.8方言dialect

在规则表达式中可以使用方言来简化表达式,使之更加具有可读性。

Java代码   收藏代码

  1. package com.kingsun.drools.rules;  

  2.   

  3. dialect "mvel"  

 

方言默认的是java,drools也支持mvel,在package的后面声明该规则文件使用的方言

 mvel

   mvel是一种基于java应用程序的表达式语言,它支持属性和方法的直接访问

    简单属性表达式:

        

Java代码   收藏代码

  1. ($customer.name == "john") && (balance > 100)   

    满足姓名为“john”,且balance必须大于100的customer

         支持属性导航:

               Bean属性导航

        

Java代码   收藏代码

  1. $customer.address.postalCode = "123" 等同于 $customer.getAddress().setPostalCode("123")  

 

              访问List数据结构

        

Java代码   收藏代码

  1. $customer.accounts[3] 等同于 $customer.getAccounts(3)  

              访问Map数据结构

        

Java代码   收藏代码

  1. $customerMap["123"] 等同于$customerMap.get["123"]  

        内置的List、Map和数组arrays

               Map:创建一个AccountMap实例-->

Java代码   收藏代码

  1. ["001"new Account("001"), "002"new Account("002")]  

 等同于创建了一个Map,并向Map中put了两个entry。

               List:创建一个List实例-->

Java代码   收藏代码

  1. ["001""002""003"]   

 等同于创建了一个List,并向List中add了三个对象。

              Arrays:创建一个数组-->

Java代码   收藏代码

  1. {"001""002""003"}  

          等同于创建了一个Array,并初始化了三个成员。

      嵌套

       使用这个可以方便的访问复杂对象中包括的集合类型的对象。

           

Java代码   收藏代码

  1. listOfPostCode = (postCode in (addresses in $customerS))  

     这个得到一个postCode列表,它是customers集合中的每一个custemer对象的地址属性中包含的postCode信息的汇集。

      强制转换

      当使用array = {1, 2, 3}时,mvel会自动将元素转换成integer类型。

      返回值

      保存变量的值等于最后一次赋予的值。

      mvel同时还支持方法调用、控制流、赋值、动态类型等等,使用mvel的性能很好,不过要小心使用。在drools中有一些核心特性就是通过mvel来实现的。

1.9规则的条件部分

 And 与

Java代码   收藏代码

  1. $customer : Customer(name == "john", age > 20)  

 
在condition中使用换行来表示与

OR 或

 

Java代码   收藏代码

  1. $customer : Customer(name == "john" || age > 20)  

 

 Not 非

Java代码   收藏代码

  1. not Account(type == Account.Type.STUDENT)   

 

 

表示所有账户类型不是STUDENT的账户

exists 存在

Java代码   收藏代码

  1. exists Account(type == Account.Type.STUDENT)  

 

Eval

捕获异常,只要eval表达式中的结果为true或者false就可以

Java代码   收藏代码

  1. $account : Account()  

  2.   

  3. ; font-family: Helvetica, Tahoma, Arial, sans-serif;"> 


    https://blog.csdn.net/caomiao2006/article/details/46417207

TopTop