我继承了一些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感到很自在,但是这些代码让我对使用属性的方式感到困惑。
感谢任何信息,谢谢。