Drools在属性上积累

时间:2017-02-13 13:57:42

标签: drools accumulate

我继承了一些Drools代码,并试图准确理解它是如何工作的。 有问题的代码应该经过两个不同来源的日期,一个来源找到最早的,另一个来源找到最新的。

代码是:

when

    $flags: Properties()
    // these properties contain key/value pairs with dates (as Strings)

    $root: Map()
    Map.Entry( key == "someRequest", $someRequestValue : value) from $root.entrySet()
    $someRequestMap: Map() from $someRequestValue
    // this map contains some timestamps as Strings

$earliestTimestamp: String() from accumulate(
    $value : String(),
    init( String found = null; ),
    action( found = found == null? $value : ($value.compareTo(found) < 0? $value: found); ),
    result( found ) 
)
$latestTimestamp: String() from accumulate(
    $value : String(),
    init( String found = null; ),
    action( found = found == null? $value : ($value.compareTo(found) > 0? $value: found); ),
    result( found ) 
)

then
    log("earliestTimestamp: {}", $earliestTimestamp);

    String latestDate = (String) $flags.get($latestTimestamp);
    log("latestDate: {}", latestDate);
end

$ flags属性填充如下:

when
    $flags: Properties()
    $root: Map()
    Map.Entry( key == "someRequest", $someRequestValue : value) from $root.entrySet()
    $someRequestMap: Map() from $someRequestValue 
    Map.Entry( key == "timestamp", $timestampValue: value) from $someRequestMap.entrySet()
    Map.Entry( key == "data", $dataValue: value) from $someRequestMap.entrySet()
    $data: Map() from $dataValue
    Map.Entry( key == "simple", $simpleValue: value) from $data.entrySet()
    $simple: Map() from $simpleValue
    Map.Entry( key == "somedate", $somedateValue: value) from $simple.entrySet()
then
    $someRequestMap.remove("data");
    update($root);
    $flags.put($timestampValue, $somedateValue); 
    insert ($timestampValue);
end

输入到规则的JSON就是这样(带有时间戳字符串):

{
 "someRequest": {
      "data": {
          "simple": {
            "somedate": "13-01-2016",
          }
    },
    "timestamp": "2016-01-01 12:34:56.789"
  }
}

我可以看到它获取工作内存中可用的所有String事实来获取最早的时间戳。 我认为对于latestTimestamp,因为它在$ flags.get上的RHS中调用,它实际上是在$ flags中找到所有字符串。 但是,如果我在两个累积操作部分中插入日志输出,我看到的只是来自工作内存的时间戳字符串(我没有看到$ flags字符串)。

我对使用Drools感到很自在,但是这些代码让我对使用属性的方式感到困惑。

感谢任何信息,谢谢。

0 个答案:

没有答案