Drools规则引擎技术指南
上QQ阅读APP看书,第一时间看更新

3.3 pattern(匹配模式)

LHS部分由一个或多个条件组成,条件又称为pattern。多个pattern之间既可以使用and或or进行连接,又可以使用小括号确定pattern的优先级,默认条件是true。

例如,第2章中“Hello World”例子规则中的LHS部分“$p:Person(name=="张三",age==30)”,其中$p为绑定变量名,其语法结构为:[绑定变量名:Object(Field约束)]。

pattern的“绑定变量名”是可选的,当前规则的RHS部分需要操作pattern匹配的参数,若要用到某些对象,则可以通过为该对象设定一个绑定变量名来实现对它的操作。对于绑定变量的命名,通常是为其添加一个“$”符号作为前缀,与对象的命名方法相同;绑定变量不仅可以用在对象上,也可以用在对象的属性上,作用是方便RHS部分的操作,同时也避免与Fact对象属性的使用相混淆。

“Field约束”是指当前对象中属性或方法的使用,如添加条件限制“name=="张三",age==30”。

规则体中LHS部分绑定变量基本上有两种形式:一种是整个Fact变量的绑定,另一种是约束条件属性变量的绑定。

第一种方式:

rule "rule1"
    when
     $customer:Customer(age>20,gender=='male')
    then
        ....
end

第二种方式:

rule "rule1"
    when
     $customer:Customer(age>20,$g:gender=='male')
    then
        ....
End

上述两种方式没有本质的区别,主要考虑是在约束条件中使用,还是在结果设置中使用,即是在LHS多个匹配模式下,还是RHS需要单独处理某一个Fact对象属性。

多个匹配模式是指多个Fact对象的匹配,执行匹配时只有结果都为true才会被执行。上述的代码中,约束条件有3个:①必须有insert(Customer对象);②age必须是大于20的;③gender必须等于'male'。

多匹配模式说明的内容为:

rule "rule1"
     when
     $customer:Customer(age>20,gender=='male')
     Order(customer==$customer,price>1000)
    then
        ....
end

分析上述规则代码。

第一个:pattern(模式)有以下3个约束。

① 对象类型必须是Cutomer。

② Cutomer的age要大于20。

③ Cutomer的gender是'male'。

第二个:pattern(模式)有以下3个约束。

① 对象类型必须是Order。

② Order对应的Cutomer必须是上一个匹配模式中的Customer。

③ 当前Order的price要大于1000。

pattern没有符号连接,Drools语法默认的约束为逻辑与(and),当该规则的LHS部分中两个pattern都满足时才会被执行。then默认情况下,每行可以用“;”作为结束符(与Java的结束符一样),当然行尾是可以不加“;”的。

注意:接下来的讲述中,将Person的age属性变更为int类型。