Drools:如果一组事件具有n个不同的属性值,则触发规则

时间:2017-08-15 07:49:14

标签: drools drools-fusion

假设我们的Event类型有3个属性:constraintcommondistinct。目标是在Drools中编写一个规则,当存在满足以下条件的Event子集时触发该规则:

  • Event发生在最后 t 秒;和
  • Event s constraint属性的以前已知值;和
  • common财产分享以前的未知值;和
  • distinct属性
  • 至少有 n 个不同的值

如果规则触发,我们需要一组参与的事件进行进一步处理。

您如何建议我们解决这个问题?

注1:这个问题与link有些相似,史蒂夫的回答似乎很有希望,但不完整。

注2:表现至关重要。我们已经成功地制定了执行此任务的规则,但它们显着降低了整个规则库的性能,因此是不可接受的。

编辑1:当前(效果不佳)解决方案如下所示:

rule ""
when
    $event : Event(constraint == CONSTANT_VALUE)
    $events : ArrayList() from collect(
            Event(constraint == CONSTANT_VALUE, 
            common == $event.common)
            over window:time( t ))
    $distinctVals : Set( size >= n ) from accumulate(Event($d : distinct) from $events, collectSet($d))
then
    // process $events
end

1 个答案:

答案 0 :(得分:0)

Drools并不意味着用于需要重复评估潜在大量事实的计算。在这种情况下,您必须将详细信息卸载到某些Java代码中。

// DSL

object create {
  def an(t: Employee.type) = new ModelDSL(Employee(null, null, null))
  def a(t: Customer.type) = new ModelDSL(Customer(null, 0))
}

object that_s

class ModelDSL[T](model: T) {
  def where(field: String): ValueDSL[ModelDSL2[T], Any] = new ValueDSL(value => {
    val f = model.getClass.getDeclaredField(field)
    f.setAccessible(true)
    f.set(model, value)
    new ModelDSL2[T](model)
  })

  def and(t: that_s.type) = new { def it = model }
}

class ModelDSL2[T](model: T) {
  def and(field: String) = new ModelDSL(model).where(field)

  def and(t: that_s.type) = new { def it = model }
}

class ValueDSL[T, V](callback: V => T) {
  def is(value: V): T = callback(value)
}

// Models

case class Employee(homeAddress: Address, workAddress: Address, department: Department)

case class Customer(address: Address, age: Int)

case class Address(name: String, pincode: String) {
  override def toString = name + "=" + pincode
}

case class Department(name: String) {
  override def toString = name
}

您必须决定是否希望此规则仅在超出阈值n时或在多样性为> = n时设置发生更改时触发。

您可能希望添加规则以删除空收藏家。