Мой вопрос касается использования эквивалента конструкции «не существует» в функции накопления Drools.
Я использую простое накопление объектов Performance со следующей частью правила, которая отлично компилируется и дает ожидаемые результаты:
rule "rule-conflicting-code-set-1"
...
when
...
$conflicts : List(size() > 1)
from accumulate(
$p : Performance(code == "FOO", /*other conditions*/)
from $patient.performances,
collectList($p))
then
...
end
Теперь я хотел бы расширить правило с дополнительным условием. Я хочу предотвратить накопление исполнений, удовлетворяющих определенному условию (т. е. попадание в список $conflicts).
Новое условие: я не хочу накапливать Выступление, для которого существует Внимание, содержащее это выступление. Внимание — это объект с полем performanceSet, которое содержит объекты типа Performance (Set performanceSet;). Я создал thisPerformance() как метод Performance для обращения к $p.
Само условие будет выглядеть так:
not exists Attention(performanceSet contains thisPerformance())
Я попытался переписать соответствующее накопление следующим образом:
$conflicts : List(size() > 1)
from accumulate(
$p : Performance(
code == "FOO",
not exists Attention(performanceSet contains
thisPerformance()),
/*other conditions*/)
from $patient.performances,
collectList($p))
Компилятор жалуется на ключевое слово 'exists': [ERR 102] Строка 50:40 несоответствующий ввод 'exists' в правиле "rule-conflicting-code-set-1". Синтаксический анализатор вернул пустой пакет.
Подозреваю, что решение моей проблемы будет выглядеть совсем иначе, но пусть пример послужит пояснением того, чего я хотел бы добиться.