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类型。