Drools<st1:chmetcnv unitname="m" sourcevalue="3.1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">3.1M</st1:chmetcnv>1 ReleaseNotes<o:p></o:p> |
<o:p> </o:p> |
<o:p> </o:p> |
语言增强<o:p></o:p>
新的条件元素: 'from', 'collect', 'accumulate', 'forall'<o:p></o:p>
'from'<o:p></o:p>
'from'允许引擎对不在引擎之中的数据进行推论,这可以通过使用全局变量与数据提供服务进行交互,如Hibernate。MVEL为此提供脚本语言,任何之前绑定的变量可以用在MVEL表达式中。接下来的例子显示一个Hibernate命名的查询使用一些虚拟的属性,返回一个餐馆列表。Restaurant()是标准的模式,能够像其它模式一样拥有自己的字段约束和绑定。<o:p></o:p>
$r : Restaurant( $postCode ) from hbSession.getNamedQuery( "some query" ).setProperties( [ key1 : value2, key2 : value ] ).list()<o:p></o:p>
collect<o:p></o:p>
'collect' 允许在数据集上进行推论a <o:p></o:p>
rule "Collect Test" salience 70<o:p></o:p>
when<o:p></o:p>
$person : Person( name == "Bob", $likes : likes )<o:p></o:p>
$cheeseList : ArrayList(size > 2) from collect( Cheese( type == $likes ) );<o:p></o:p>
then<o:p></o:p>
results.add($cheeseList);<o:p></o:p>
end<o:p></o:p>
accumulate<o:p></o:p>
'accumulate' 是collect的更强大的版本,它能够用来承担集合操作,如sum或total<o:p></o:p>
<o:p> </o:p>
rule "Accumulate with Bindings" salience 90<o:p></o:p>
when<o:p></o:p>
$person : Person( name == "Bob", $likes : likes )<o:p></o:p>
$totalAmount : Integer() from accumulate( $cheese : Cheese( type == $likes ),<o:p></o:p>
init( int total = 0; ),<o:p></o:p>
action( total += $cheese.getPrice(); ),<o:p></o:p>
result( new Integer( total ) ) );<o:p></o:p>
then<o:p></o:p>
results.add($totalAmount);<o:p></o:p>
end <o:p></o:p>
forall<o:p></o:p>
'forall' 允许规则在引擎中所有的值都是真时激活<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
rule "test nested CEs" <o:p></o:p>
when<o:p></o:p>
forall( State( $state : state ),<o:p></o:p>
Person( status == $state, $likes : likes ),<o:p></o:p>
Cheese( type == $likes ) )<o:p></o:p>
then <o:p></o:p>
results.add("OK"); <o:p></o:p>
end<o:p></o:p>
完全支持一阶逻辑: 元素的嵌套完成<o:p></o:p>
You can now nest 'and' and 'or' inside 'not' and 'exists'. <o:p></o:p>
rule "test nested CEs" <o:p></o:p>
when<o:p></o:p>
not ( State( $state : state ) and<o:p></o:p>
not( Person( status == $state, $likes : likes ) and<o:p></o:p>
Cheese( type == $likes ) ) )<o:p></o:p>
then <o:p></o:p>
results.add("OK"); <o:p></o:p>
end<o:p></o:p>
支持多个约束条件的逻辑组合<o:p></o:p>
“&”和“|”现在可以使用在模式中。它们的行为是不同的,因为它不会导致产生子规则。<o:p></o:p>
<o:p> </o:p>
rule "& operator with ! and strings"<o:p></o:p>
when <o:p></o:p>
$person : Person( hair != "blue" & != "purple", age > 30 & < 40 ) <o:p></o:p>
then<o:p></o:p>
list2.add( $person );<o:p></o:p>
end <o:p></o:p>
<o:p> </o:p>
rule "| operator with == and strings"<o:p></o:p>
when <o:p></o:p>
$person : Person( hair == "blue" | == "purple", age < 30 ) <o:p></o:p>
then<o:p></o:p>
list3.add( $person );<o:p></o:p>
end <o:p></o:p>
解析器增强:<o:p></o:p>
解决关键字冲突 <o:p></o:p>
对断行的更好支持 <o:p></o:p>
支持字符串中的Escaped字符 <o:p></o:p>
原型支持: 不再需要自动封箱/拆箱<o:p></o:p>
原型现在可以直接使用,允许更容易的维护规则以及更好的执行性能<o:p></o:p>
<o:p> </o:p>
模板支持:<o:p></o:p>
现在可以使用Fact模板,允许你在自己的DRL中定义Fact,并在规则中使用,而不需要一个POJO。<o:p></o:p>
<o:p> </o:p>
template Cheese<o:p></o:p>
String name<o:p></o:p>
Integer price<o:p></o:p>
end<o:p></o:p>
<o:p> </o:p>
rule "Match Stilton"<o:p></o:p>
when<o:p></o:p>
$stilton : Cheese( name == "stilton" )<o:p></o:p>
then<o:p></o:p>
$stilton.setFieldValue( "price", new Integer( 200 ) );<o:p></o:p>
list.add( $stilton );<o:p></o:p>
end <o:p></o:p>
支持额外的断言语义: <o:p></o:p>
在变量绑定之后,你不再需要使用“->”语法标记。现在断言只要在逗号后面简单的使用一个相等/不等判断表达式,引擎会自己找到它需要的变量,<o:p></o:p>
Pattern( $var1 : attr1, $var2 : attr2, ( $var1.blabla() != $var2.xyz() ) ) <o:p></o:p>
核心增强:<o:p></o:p>
阴影Fact:<o:p></o:p>
现在阴影Fact允许系统在多线程环境下工作,并且在引擎外面对Fact进行改变。每一个值都被隐藏在引擎中,只有在一个“安全点”才更新。因此不用再危及引擎的完整性。<o:p></o:p>
支持在相同对象的字段之间进行约束判断<o:p></o:p>
之前绑定的变量只能用在下一个范式中,现在它们可以在定义的范式中就使用。<o:p></o:p>
执行性能增强<o:p></o:p>
JBoss Rules 比之前更快,使用更少的内存。<o:p></o:p>
为执行性能特殊化的“exists”节点<o:p></o:p>
传统的Rete系统为exists实现两个Not节点,我们发现使用一个专门的Exists节点可以增强性能并使得Rete网络更简单。<o:p></o:p>
IDE 摘要<o:p></o:p>
IDE现在支持调试规则:断点可以加在Drl文件中规则的右手边(推论)以及函数中。无论何时在调试中遇到规则断点,相应的规则被显示,你可以单步调试。规则调试与Java调试完全集成,这样同时可以使用两者。<o:p></o:p>
一个新的规则视图允许你可以同时对所有在工作空间中的规则,函数,查询和全局变量做一个快速浏览。你也可以通过选择一个元素然后双击来快速浏览它们。<o:p></o:p>
支持新的语言特性(像from,collect,accumulate),并且IDE也已经更新以支持所有内核改变。并且不断改进和更好的调整其它的功能,如对大纲和规则视图提供过滤器,(可配置的)解析器结果缓存等等<o:p></o:p>
注意<o:p></o:p>
M1版本有一个遗留问题将在M2版本解决<o:p></o:p>
<o:p> </o:p>