首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Drools中多嵌套对象的处置

2012-11-20 
Drools中多嵌套对象的处理原来的文章就曾经提到过,在drools中,域约束好像只能适用于对象的简单类型域,复杂

Drools中多嵌套对象的处理
原来的文章就曾经提到过,在drools中,域约束好像只能适用于对象的简单类型域,复杂对象类型的是不能用域限定方式来做的。如:

rule "WEEKDAY_BALANCE"      salience 0      when          $customer : Customer( $card : card )         $scard : $card( discount == 0.9 )    then           System.out.println("...");end  

其中,card域就是一个“复杂”对象。那么上面的rule就是不合法的。
这个问题困扰多时,请教过dada,得知可以用eval来解决(或者,在3.1M中可以用from解决)。可处理了一些之后感觉还是有问题,尤其是一个对象中有多个“复杂”对象的时候。例如下面:
public class ProjMem {private Project proj;private Member mem;}

这个类中的两个成员都是“复杂”对象。他们表征了一个项目参与关系。现在我想要实现这样的判断:如果一个成员mem(有id,name等属性)参与了2个或者以上的类型tp的项目proj(有id,type等属性),那么输出错误。可是怎么想也不知道该如何处理?!!!

这个答案在3.06版和3.1M版中的解决方案应该不一样吧?分别应该怎么解决呢?哪位高手可以指导一下?
谢谢了。。。 最好的方法是这块别放在规则引擎里面。如果一定要用规则引擎的话晚上放一段3.1M1的写法,3.0.X很难处理这种情况。 最好的方法是这块别放在规则引擎里面。如果一定要用规则引擎的话晚上放一段3.1M1的写法,3.0.X很难处理这种情况。

3.1M的也可以啊!现在就是解决不了啊!麻烦你贴一个吧。拜托啦!!! public class Member {private Long id;private String name;private Set projects = new HashSet();//omit...public String toString() {return "成员 :" + name;}}public class Project {private Long id;private String name;private String type;private Set memebers = new HashSet();//omit...public String toString() {return "项目 :" + name;}}
RULE
#created on: 2007-4-23package compositeimport com.sample.support.Member;import com.sample.support.Project;rule "sample"when$member : Member()$bar : Integer()from accumulate($project : Project( type == "foo", memebers contains $member),init(int foo = 0;),action(foo++;),result(new Integer(foo)))then         System.out.println("catch it - " + $member);System.out.println($bar);end

不知道lz是不是这个意思呢?#created on: 2007-4-23package compositeimport com.sample.support.Member;import com.sample.support.Project;rule "sample"when$member : Member()$bar : Integer()from accumulate($project : Project( type == "foo", memebers contains $member),init(int foo = 0;),action(foo++;),result(new Integer(foo)))then System.out.println("catch it - " + $member);System.out.println($bar);end
不知道lz是不是这个意思呢?

非常感谢dada费心解决。这个解决方案目前大概是最好的了。只是只能将别的对象作为Collection类型的集合的话还是颇感不便!不知道以后还会不会遇到更郁闷的问题。唉。。。

9 楼 Godlikeme 2007-04-24   埃,要在lhs写这么复杂的东西。 10 楼 Audion 2007-04-24   Godlikeme 写道埃,要在lhs写这么复杂的东西。

这个 from accumulate和from collect等是3.1M中新加入的呢。ms就是为了方便在lhs里来方便表达的。如果不在lsh里写好限制条件,你用if……else写的一大堆逻辑要怎么样等价的表达呢? 11 楼 dada 2007-04-24   Audion 写道

非常感谢dada费心解决。这个解决方案目前大概是最好的了。只是只能将别的对象作为Collection类型的集合的话还是颇感不便!不知道以后还会不会遇到更郁闷的问题。唉。。。


我觉得首先要确定项目中规则引擎处理的问题域,不同业务的问题域都不尽相同。我是以“规则是否可以提供比JAVA更高的开发效率”为原则来确定问题域。拿你的这个需求举例,在给memeber添加project或者project添加member的时候就可以直接抛出业务异常,还硬用规则解决总给人怪怪的感觉。

热点排行