Если условие в предложении THEN пускает слюни - PullRequest
0 голосов
/ 11 июля 2020

Я много пробовал исследовать в Интернете, но не смог найти точную причину моей ошибки

Вот моя проблема

Я пытаюсь написать условие if-else в RHS (THEN) но мои слюни показывают следующую ошибку

[An error occurred when attempting to build drools rule set. Error: Unable to Analyse Expression if (

Я знаю, что это ясно говорит о том, что я не могу писать, если внутри THEN (RHS), но я смог сделать это в слюнявых версиях 6.5.0-FINAL

это что-то появилось в версии 6.5.0? Пожалуйста, направьте меня в правильном направлении для этого расследования

Я не могу создать для этого два правила. Мне нужно условие if-else внутри THEN

моя версия слюни 5.5.0

rule "TEST"
when
     $aa : Age()
then
     if(//something)
     {
        //something
     }
     else
     {
     }
end

1 Ответ

2 голосов
/ 11 июля 2020

Это совершенно верно, начиная с 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
...