假设我们的Event
类型有3个属性:constraint
,common
和distinct
。目标是在Drools中编写一个规则,当存在满足以下条件的Event
子集时触发该规则:
Event
发生在最后 t 秒;和Event
s constraint
属性的以前已知值;和common
财产分享以前的未知值;和distinct
属性如果规则触发,我们需要一组参与的事件进行进一步处理。
您如何建议我们解决这个问题?
注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
答案 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时设置发生更改时触发。
您可能希望添加规则以删除空收藏家。