Предположим, у нас есть тип Event
, который имеет 3 свойства: constraint
, common
и distinct
. Цель состоит в том, чтобы написать правило в Drools, которое срабатывает, когда существует подмножество Event
s, удовлетворяющее следующим критериям:
Event
s произошло за последние t секунд; а такжеEvent
s Иметь ранее известное значение свойстваconstraint
; а также- Поделиться ранее неизвестным значением свойства
common
; а также - Существует как минимум n различных значений для свойства
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
$event: Event
, не убедившись, что оно не старше t секунд. Это приводит к тому, что правило запускается для старых событий, для которых может быть или не быть решения, и оно будет выполняться повторно в тех случаях, когда решение есть. - person laune   schedule 15.08.2017