锁定老帖子 主题:Drools3.1M1 发布标注
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
||||
---|---|---|---|---|
作者 | 正文 | |||
发表时间:2007-07-08
语言增强<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>
注意<o:p></o:p> M1版本有一个遗留问题将在M2版本解决<o:p></o:p>
<o:p> </o:p> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
||||
返回顶楼 | ||||
浏览 2150 次