Получить все условия, которые привели к выполнению правила

Я хочу получить все индивидуальные условия, которые привели к выполнению правила.

Например, если у меня есть следующее правило:

package app1;

rule 'rule1'
when
    MyObjectType1( booleanPredicate1() )
    or
    (
      MyObjectType2( booleanPredicate2() )
      and
      MyObjectType3( booleanPredicate3() )
    )
    or
    MyObjectType4( booleanPredicate4() )
then
    System.out.println("In rule - " + drools.getRule().getName());
end

а также booleanPredicate1(), booleanPredicate2() а также booleanPredicate4() являются true тогда я хочу получить следующий вывод:

  • booleanPredicate1() resulted in rule execution.
  • booleanPredicate4() resulted in rule execution.

До сих пор я пробовал внутри реализации всех таких методов предикатов, я добавил оператор ведения журнала, который выполняется только тогда, когда этот метод собирается вернуть true:

boolean booleanPredicate1()
{
  boolean ret = false;
  ...
  ...
  if (<business-logic-defined-predicate>)
  {
    ret = true;
  }
  if(ret)
  {
    addToLog("booleanPredicate1 became true.");
  }
  return ret;
}

но с этим решением, я также получу вывод booleanPredicate2() resulted in rule execution. что неправильно.

Есть ли способ, с помощью которого я могу получить правильные результаты регистрации?

1 ответ

Посмотрите мою статью о шаблонах разработки правил, в которой есть раздел, отвечающий на ваш вопрос.

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

Другие вопросы по тегам