让我们说我有一个简单的pojo
public class foo {
private String id;
private Date asOfDate;
private String product;
...getters and setters...
}
我想将一堆foos添加到规则中,根据日期对它们进行排序,然后将当前产品与之前的产品进行比较。除此之外,我想创建一个名为ProductChange的附加属性的新事实。 如果当前产品=以前的产品,则productChange将设置为"无变化"。如果当前产品<>上一个产品,将其设置为"更改"。
这里有一些示例排序数据:
| id | asOfDate | product |
+----+------------+---------+
| 1 | 2017-01-01 | A |
| 1 | 2017-02-01 | A |
| 1 | 2017-03-01 | B |
| 1 | 2017-04-01 | C |
+----+------------+---------+
以下是新事实的样子:
+----+------------+---------+---------------+
| id | asOfDate | product | productChange |
+----+------------+---------+---------------+
| 1 | 2017-01-01 | A | No Change |
| 1 | 2017-02-01 | A | No change |
| 1 | 2017-03-01 | B | change |
| 1 | 2017-04-01 | C | change |
+----+------------+---------+---------------+
这是我迄今为止在规则中所得到的:
rule "compare"
when
$foo : foo ($id : id, $asOfDate : asOfDate, $product : product)
not foo (asOfDate < $asOfDate)
then
System.out.println("id: " + $id + " date: " + $asOfDate + "product: " + $product);
end
这使得集合排序正确,但我不知道如何查看前一行。
答案 0 :(得分:1)
最简单的方法是创建2个规则:一个用于连续2个Foos具有相同的产品,一个用于何时不用。
rule "Same Product"
when
$foo1 : foo ($id : id, $asOfDate1 : asOfDate, $product : product)
$foo2 : foo (asOfDate > $asOfDate1, $asOfDate2:asOfDate, product == $product)
not foo (asOfDate > $asOfDate, asOfDate < $asOfDate2) //This will make sure that $foo1 and $foo2 are consecutive
then
$foo2.setProductChange("No change");
end
rule "Different Product"
when
$foo1 : foo ($id : id, $asOfDate1 : asOfDate, $product : product)
$foo2 : foo (asOfDate > $asOfDate1, $asOfDate2:asOfDate, product != $product)
not foo (asOfDate > $asOfDate, asOfDate < $asOfDate2) //This will make sure that $foo1 and $foo2 are consecutive
then
$foo2.setProductChange("change");
end
请注意,因为这些规则没有考虑具有相同时间戳的不同Foo。在这种情况下,您需要调整<
和>
以使其正常工作。
您还需要第一个Foo的单独规则,或者您可以在第一个规则中添加OR。
希望它有所帮助,