关于累积事实的 Drools 复杂规则建议

Drools Complex Rule Advice on Accumulating Facts

我需要一些关于如何为以下情况编写规则的建议。首先,这是我的事实:

SessionClock($now : new Date(getCurrentTime()))

ClickEvent( $userId : userId, $productId : productId, $event : "FAVORITE" / "REMOVE_FAVORITE" )

Product($id : id, $endDate : endDate)

Purchase ( $userId : userId, $purchasedProducts : purchasedProducts )

其中 purchasedProductsList 的:

PurchasedProduct( $id : id, $price : price)

现在我想每次在特定时间发送通知:

  1. 今天是产品的结束日期
  2. 用户已收藏但未取消收藏产品(来自 ClickEvent)和
  3. 用户还没有购买产品(来自Purchase)并且
  4. 在一个通知中包含所有此类产品(基本上我需要 collect 个产品)

感谢您对此提供的任何帮助。

提前致谢!

分步执行此操作可能是个好主意

rule "interesting user/product"
when
  SessionClock( $now: time )
  Purchase( $uid: userId, $purchases: purchasedProducts )
  ClickEvent( userId == $uid, $pid: productId,
              event == "FAVORITE" )
  not ClickEvent( userId == $uid, productId == $pid,
                  event == "REMOVE_FAVORITE" )     
  Product( id == $pid, $endDate: endDate )
  eval( endDateIsToday( $now, $endDate ) )
then
end

rule "make Collection" extends "interesting user/product"
when
  not Collection( userId == $uid )
then
  insert( new Collection( $uid ) )
end

rule "fill Collection" extends "interesting user/product"
when
  $coll: Collection( userId == $uid, products not contains $pid )
then
  modify( $coll ){ addProduct( $pid ) }
end

第三条规则,运行降低显着性,可以做通知。

Edit 澄清一下,endDateIsToday 是 (DRL) 函数或静态方法。集合是一个 class,您需要使用几个字段来定义:userId 和一组产品 ID。