如何将当前行的属性与Drools中前一行的属性进行比较

时间:2018-01-25 19:50:20

标签: drools

让我们说我有一个简单的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

这使得集合排序正确,但我不知道如何查看前一行。

1 个答案:

答案 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。

希望它有所帮助,