Drools LHS与RHS常见语法

介绍

从下面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对象,为分别设置收入为10005000

	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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值