Использование эквивалента «не существует» в слюнях накапливается

Мой вопрос касается использования эквивалента конструкции «не существует» в функции накопления 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". Синтаксический анализатор вернул пустой пакет.

Подозреваю, что решение моей проблемы будет выглядеть совсем иначе, но пусть пример послужит пояснением того, чего я хотел бы добиться.


person Edvaaart    schedule 27.09.2017    source источник


Ответы (1)


not exists не является допустимой конструкцией в Drools. Просто используйте not вместо этого.

Тогда то, что вы ищете, - это использовать несколько шаблонов в накоплении. Вам нужно переписать правило примерно так:

$conflicts : List(size() > 1) 
    from accumulate( 
        ($p : Performance(code == "FOO") from $patient.performances and
        not Attention(performanceSet contains $p)),
        collectList($p)) 

Надеюсь, поможет,

person Esteban Aliverti    schedule 27.09.2017
comment
Это был именно тот синтаксис, который я искал! Большое спасибо! - person Edvaaart; 28.09.2017