当前位置:网站首页>Drools(3):Drools基础语法(1)
Drools(3):Drools基础语法(1)
2022-07-26 06:58:00 【不死鸟.亚历山大.狼崽子】
1 规则文件的构成
drl是Drools Rule Language的缩写。在规则⽂件中编写具体的规则内容。
⼀套完整的规则⽂件内容构成如下:
package:包名,package对应的不⼀定是真正的⽬录,可以任意写com.abc,同⼀个包下的drl⽂件可以相互访问
import:⽤于导⼊类或者静态⽅法
global:全局变量
function:⾃定义函数
query:查询
rule end:规则体
2 规则体语法结构
⼀个规则通常包括三个部分:属性部分(attribute) 、条件部分(LHS)和结果部分(RHS)
rule "ruleName" //rule关键字,表示规则开始,参数为规则的唯⼀名称
attributes //规则属性,是rule与when之间的参数,为可选项
when //关键字,后⾯是规则的条件部分
LHS //Left Hand Side,是规则的条件部分
then //后⾯跟规则的结果部分
RHS //是规则的结果或⾏为
end //表示⼀个规则的结束3 条件部分的规则语法
LHS(Left Hand Side):是规则的条件部分的通⽤名称。它由零个或多个条件元素组成。如果LHS 为空,则它将被视为始终为true的条件元素。(左⼿边)
LHS部分由⼀个或者多个条件组成,条件⼜称为pattern。
pattern的语法结构为:绑定变量名:Object(Field约束)其中绑定变量名可以省略,通常绑定变量名的命名⼀般建议以$开始。如果定义了绑定变量名,就可以 在规则体的RHS部分使⽤此绑定变量名来操作相应的Fact对象。Field约束部分是需要返回true或者false 的0个或多个表达式。
//规则1:100元以下, 不加分
rule "score_1"
When
//⼯作内存中必须存在Order这种类型的Fact对象-----类型约束
//Fact对象的amout属性值必须⼩于等于100------属性约束
$s : Order(amout <= 100)
Then
$s.setScore(0);
System.out.println("成功匹配到规则1:100元以下, 不加分 ");
end如果LHS部分为空的话,那么引擎会⾃动添加⼀个eval(true)的条件,由于该条件总是返回true,所 以 LHS为空的规则总是返回true
3.1 约束连接
在 LHS 当中,可以包含 0~n 个条件,多个pattern之间可以采⽤“&&” (and) 、 “||”(or)和“,”(and) 来实现,也可以不写,默认连接为and。
//规则2:100元-500元 加100分
rule "score_2"
when
$s : Order(amout > 100 && amout <= 500)
then
$s.setScore(100);
System.out.println("成功匹配到规则2:100元-500元 加100分 ");
end3.2 比较操作符
在 Drools当中共提供了⼗⼆种类型的⽐较操作符, 分别是: >、 >=、 <、 <=、 = =、 !=、 contains、 not contains、memberof、not memberof、matches、not matches;在这⼗⼆种类型的比较操作符当中,前六个是比较常用也是用的比较多的比较操作符
| 符号 | 说明 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| == | 等于 |
| != | 不等于 |
| contains | 检查⼀个Fact对象的某个属性值是否包含⼀个指定的对象值 |
| not contains | 检查⼀个Fact对象的某个属性值是否不包含⼀个指定的对象值 |
| memberOf | 判断⼀个Fact对象的某个属性是否在⼀个或多个集合中 |
| not memberOf | 判断⼀个Fact对象的某个属性是否不在⼀个或多个集合中 |
| matches | 判断⼀个Fact对象的属性是否与提供的标准的Java正则表达式进⾏匹配 |
| not matches | 判断⼀个Fact对象的属性是否不与提供的标准的Java正则表达式进⾏匹配 |
示例:
第⼀步:创建实体类,⽤于测试⽐较操作符
package com.xiongpeng.entity;
import java.util.List;
public class Customer {
//客户姓名
private String name;
private List<Order> orderList;
//订单集合
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
}第⼆步:在/resources/rules下创建规则⽂件customer-rules.drl
package rules
import com.xiongpeng.entity.*;
//测试contains规则
rule "rule1"
when
$order:Order();
$customer:Customer(orderList contains $order);
then
System.out.println("测试contains规则触发:"+$customer.getName());
end
//测试not contains规则
rule "rule2"
when
$order:Order();
$customer:Customer(orderList not contains $order);
then
System.out.println("测试not contains规则触发:"+$customer.getName());
end
//测试⽐较操作符matches
rule "rule3"
when
Customer(name matches "张.*")
then
System.out.println("测试⽐较操作符matches触发...");
end
//测试⽐较操作符not matches
rule "rule4"
when
Customer(name not matches "张.*")
then
System.out.println("测试⽐较操作符not matches触发...");
end第三步:编写单元测试
@Test
public void test2() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
//会话对象,⽤于和规则引擎交互
KieSession kieSession = kieContainer.newKieSession();
//构造订单对象,设置订单⾦额,由规则引擎计算获得的积分
Order order = new Order();
//匹配规则:$order:Order();
kieSession.insert(order);
Customer customer = new Customer();
List<Order> orderList = new ArrayList<Order>();
//匹配规则: $customer:Customer(orderList contains $order);
// orderList.add(order);
customer.setOrderList(orderList);
customer.setName("Jack");
//将数据交给规则引擎,规则引擎会根据提供的数据进⾏规则匹配
kieSession.insert(customer);
//激活规则引擎,如果匹配成功则执⾏规则
kieSession.fireAllRules();
//关闭会话
kieSession.dispose();
}执行结果如下:

以上结果在调用时调用了全部的规则,连上一个案例中的score-rules.drl规则都进行了调用,这样的话,我们可以调用指定的规则。
注意:
执行指定规则
我们在调⽤规则代码时,满足条件的规则都会被执行。那么如果我们只想执⾏其中的某个规则如何实现呢?
Drools给我们提供的⽅式是通过规则过滤器来实现执⾏指定规则。对于规则⽂件不用做任何修改,只需要修改Java代码即可,
如下:
@Test
public void test3() {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
//会话对象,⽤于和规则引擎交互
KieSession kieSession = kieContainer.newKieSession();
//构造订单对象,设置订单⾦额,由规则引擎计算获得的积分
Order order = new Order();
//匹配规则:$order:Order();
kieSession.insert(order);
Customer customer = new Customer();
List<Order> orderList = new ArrayList<Order>();
//匹配规则: $customer:Customer(orderList contains $order);
// orderList.add(order);
customer.setOrderList(orderList);
customer.setName("Jack");
//将数据交给规则引擎,规则引擎会根据提供的数据进⾏规则匹配
kieSession.insert(customer);
//激活规则引擎,如果匹配成功则执⾏规则
kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule4"));
//关闭会话
kieSession.dispose();
}关键语句:
//通过规则过滤器实现只执⾏指定规则
kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule4"));执行结果如下:

边栏推荐
猜你喜欢

buuReserve(4)
![[arm learning (8) AXF tool analysis]](/img/6c/df2ebb3e39d1e47b8dd74cfdddbb06.gif)
[arm learning (8) AXF tool analysis]

XSS labs (1-10) break through details

Acwing- daily question

文件服务器FastDFS

Quick sort

Click "Niuke | daily question" to eliminate it

问题:Can‘t download sh shellcheck. Please install it manually及shell脚本的一些命令使用

28. Implement strstr() implement strstr()

7. Reverse integer integer
随机推荐
Is there any online account opening process of Huatai Securities? Is online account opening safe
IV Actual combat - global unified return result class
强网杯2021 pwn 赛题解析——baby_diary
Huffman coding principle
浅谈eval与assert一句话木马执行区别
An album has been released, from introductory practical demonstration to advanced live Q & A, playing with container service so easy~
Delete ^m from VIM
Torth file read vulnerability (cnvd-2020-27769)
替换license是否要重启数据库?
MySQL intent lock
mysql优化之索引及索引失效
"Niuke | daily question" template stack
针对前面文章的整改思路
Quick sort
[hardware ten treasures] - 7.1 [dynamic RAM] key points of DDR hardware design
[Star Project] small hat aircraft War (III)
MySql 执行计划
The creation of "harmonyos" project and the use of virtual machines
[749. Isolate virus]
The results of the soft test can be checked, and the entry to query the results of the soft test has been opened in the first half of 2022