Метод накопления слюней, который возвращает ноль, если нет соответствующего исходного факта

Я пытаюсь реализовать правило в Drools, которое вычисляет сумму некоторого свойства факта. Это прекрасно работает с использованием накопления и суммы. Проблема в том, что при отсутствии фактов, соответствующих критериям в исходной части метода накопления, правило не выполняется.

Я хотел бы, чтобы метод суммы возвращал ноль, если ни один факт не совпадает, и что остальные предложения when проверяются. Это возможно как-то?

Обновление: я использую Drools 6.0.1 Проблема, похоже, заключается в предложении and. Вот код, который является моей проблемой.

rule "accu"
when
$n: Number() 
   from accumulate( $o: Order() and OrderLine( $v: quantity ),
                sum($v))
then
   System.out.println("*#*#*#*#*#*#*#*#*#* Accu has fired *#*#*#*#*#*#*#*#*#");
end

Работает только с Order или OrderLine. У меня такое чувство, что я неправильно решаю проблему. В моем реальном случае значение, которое я хочу суммировать, находится в OrderLine, но критерии находятся в другом классе.

$ol : OrderLine($q : quantity) 
and
$ac : ArticleClass(orderLine == $ol, crtiteria1=efg, criteria2=abc) 

person user2366647    schedule 19.09.2014    source источник


Ответы (1)


Но аккумуляция возвращает 0, когда нет подходящих элементов.

rule accu
when
$n: Number() 
   from accumulate( Fact( prop == "C", $v: value ),
                    sum($v))
then
   //...
end

Это срабатывает при отсутствии фактов-фактов с реквизитом == "C" и срабатывает, если фактов-фактов вообще нет. (Слюни 5.5.0)

Предоставьте полный код, воспроизводящий ошибку, версию Drools и т. д.

person laune    schedule 19.09.2014
comment
Как указано в вопросе, с одним фактом это работает, но если вы накапливаете более двух фактов, соединенных с условием and, то правило не срабатывает в случае отсутствия совпадения. - person Pino; 03.04.2018