Это совершенно верно, начиная с Drools 5.0 (не могу говорить раньше, это самое раннее, что я когда-либо использовал). Это плохой дизайн правил - все, что ограничивает вас, чтобы не добавлять второе правило, просто неверно - но вы можете иметь if / else с правой стороны. when ') и правая часть (then) должны иметь последствия. Drools оптимизирует проверку условий на LHS, но выполняет последствия для RHS как есть. Таким образом, перемещая условия в RHS, вы снижаете производительность ваших правил, потому что вы обходите оптимизацию, которую предоставляет Drools. out - иметь два следующих правила. (Поскольку я не знаю вашей конкретной проблемы с использованием, я собираюсь кое-что придумать - разницу в последствиях в зависимости от того, возраст больше или меньше 18.)
rule "TEST - Under 18"
when
Age( value < 18 )
then
System.out.println("User is underage.");
end
rule "TEST - Adult"
when
Age( value >= 18 )
then
Sytem.out.println("User is an adult.");
end
Как уже упоминалось , вы все равно можете использовать if-else, если необходимо, но это плохой дизайн правил, и если бы я проводил проверку вашего кода, я бы отправил его обратно на доработку. :)
rule "TEST WITH BAD PRACTICES"
when
Age( $age: value )
then
if ($age < 18) {
System.out.println("User is underage.");
} else {
System.out.println("User is an adult.");
}
end
Это правило действительно и работает. Если это не сработает для вас, проблема не в правиле, а в чем-то другом в том, как вы загружаете или запускаете свои правила, которыми вы не поделились. Может это твой диалект. Может так ты их загружаешь. Возможно, у вас есть опечатка в вашем «если», например, пропущенная кавычка или дефис, которые вы не показали нам, потому что вы не предоставили свое действительное правило.
Это то, что вы Придется исследовать в вашей собственной среде (я предлагаю точки останова и сеанс отладки в вашей среде IDE.)
Для полноты картины в Drools 7 введена концепция условных и именованных последствий . Хотя многие из тех, кого я знаю, предпочитают простоту и рациональность передовой практики использования нескольких правил, это альтернативный способ обеспечения условной обработки в одном правиле. аналогичные условия, например, что одно строится на другом, вы можете использовать синтаксис, очень похожий на "goto", чтобы инициировать перестановки правой части. Вот как вы могли бы go сделать это для вашей ситуации:
rule "TEST with named consequences"
when
Age( $age: value )
if ( $age < 18 ) break[underage]
then
System.out.println("User is an adult.");
then[underage]
System.out.println("User is underage.");
end