2015-04-01 121 views
2

我有一个名为Customer的对象。客户对象由库存对象列表组成,库存由报价列表和内部报价组成,其中有一个称为状态的字段。这是我的对象图。遍历对象列表

class Customer{ 
List<Stock> stocks; 
//getter and setters 
} 

class Stock{ 
List<Quote> quotes; 
//getter and setters 
} 

class Quote{ 
String status; 
//getter and setters 
} 

现在我需要写在DRL规则来验证,如果状态在任何引用对象的股票名单中所有股票报价的状态为客户“启动”,那么所有其他值应该只是“发起”。

含义如果状态为“启动”,则只有启动对于所有客户的股票的所有报价均为有效值。这仅用于“启动”状态。

我花了一天的时间写一条规则,但没有成功。我只能将整个Customer对象传递给规则引擎。任何人都可以帮忙吗?

回答

0

如果客户在所有股票的所有行情中处于状态“初始化”或完全没有“初始化”,即当客户是“干净”时,以下规则触发一次。

rule checkini 
    dialect "java" 
when 
    $c: Customer($ss: stocks) 
    Boolean(booleanValue) 
    from accumulate(Stock($qs: quotes) from $ss, 
    init(int notini = 0; int isini = 0;), 
    action(for(Object q: $qs) 
       if("Initiate".equals(((Quote)q).getStatus())) isini++; 
       else notini++; ), 
    result(notini == 0 || isini == 0)) 
then 
    System.out.println("clean"); 
end 

要查看客户是否有“启动”和别的,否定的结果条件的大杂烩。

+0

我们正在使用m方言。对于,如果和其他行动内的行动? – user2997551 2015-04-02 16:19:34

+0

尽管已经做了很多工作来改善这种情况,方言“mvel”在许多Drools版本中被打破。在这个规则中使用'方言'java''切换回有序编译。或者使用一个静态的Java方法来检查这个属性,就像积累的方式一样。或者按照Drools文档中的说明实施自定义累积。 – laune 2015-04-02 16:40:01