Drools字符串版本的Accumulate

时间:2015-11-05 21:24:13

标签: drools

我尝试做的基础是从一组符合特定条件的对象中获取连接字符串,就像从累积中获得一个数字总和一样。

以下规则是尝试获取任何给定的IEP对象并查找属于该IEP的所有服务,总结其频率持续时间,然后创建每个服务的名称报告并列出持续时间各自的频率。

这样做的正确方法是什么?我的方法是否存在固有的错误,或者我只是错过了微妙的错误。

dialect  "mvel"

import superObjects.IL.*
import objects.*;
import rules.ValidationHelper;
import java.util.List;
import java.util.ArrayList;

function String serviceDesc(ArrayList sers){
    String s = "";
    for(int i = 0 ; i<sers.size(); i++){
         Super_Service ser = (Super_Service) sers.get(i);             
         s+=ser.getName()+": "+ser.getDuration()*ser.getFrequency()+" Per Week <br>";
     }
     return s;
}

rule "Calculate Service Minutes"
    when
        $siep: Super_Iep();
           $counter : Number() from accumulate(
              $ser: Super_Service(Measurable != "Yes" && ValidationHelper.contains(Documentid, $siep.getIid()+"")),
              sum($ser.getFrequency()*$ser.getDuration())
        );
       $sers: ArrayList() from collect(Super_Service(Measurable != "Yes" && ValidationHelper.contains(Documentid, $siep.getIid()+"")));
    then
        ValidationHelper.storeCalc($siep, $counter, "Text", "SERVICE_MINUTES");
        ValidationHelper.storeCalc($siep, serviceDesc($sers), "Text", "SERVICE_REASON");
end

我不能轻易地包含ValidationHelper,因为它有数千行代码,但是这段代码中的两个函数是一个简单的包含替代方法,可以修复两个字符串,而storeCalc只是一个用于保存字段的实用函数数据库。

1 个答案:

答案 0 :(得分:1)

你在这里积累和收集的是一个

Map<String,Number> dur2min

,即每项服务(和每周)的分钟数。如何从事实中获取数据是业务逻辑的一部分,属于规则,但是&#34;报告&#34;编写并呈现(HTML!)不应该在这里展开,重复选择逻辑(!)和收集事实列表的迭代。

我会将两者都移动到一个获取列表并在一次迭代中计算机器人的函数,

function void serviceDesc(Super_Iep iep, ArrayList sers){
    int sum = 0;
    StringBuilder sb = new StringBuilder();
    for( Object obj: sers ){
        //... add and append
    }
    ValidationHelper.storeCalc( iep, sum, "Text", "SERVICE_MINUTES");
    ValidationHelper.storeCalc( iep, sb.toString(), "Text", "SERVICE_REASON");
}

这应该在这里还是ValidationHelper本身仍有待讨论,但我不想在DRL中使用它。

最后比较结果规则:

rule "Calculate Service Minutes"
when
    $siep: Super_Iep();
    $sers: ArrayList() from collect(Super_Service(Measurable != "Yes" && ValidationHelper.contains(Documentid, $siep.getIid()+"")));
then
    serviceDesc($siep, $sers);
end