2016-04-25 2 views
0

Использование слюны 6.4-FINALDrools Состояние конфликтует/потребляет факты?

У нас есть два правила;

rule "Rule1" 
when 
    // conditions 
    $aclass: AClass(type == AType.DOG); 
    $bclass: BClass(type == BType.SHIP); 
    $cclass: CClass(); 
    $xclass: XClass(); 
then 
    //actions  
    System.out.println("Actioning Rule1"); 
end 

rule "Rule2" 
when 
    // conditions 
    $aclass: AClass(type == AType.DOG); 
    $bclass: BClass(type == BType.SHIP); 
    $cclass: CClass(); 
    $yclass: YClass(); 
then 
    //actions 
    System.out.println("Actioning Rule2"); 
end 

Обратите внимание, что первые 3 условия обоих правил одинаковы (соответствие над ClassType и внутренний тип в некоторых случаях классов AClass, BClass и CClass. правила отличаются от с XCLASS или YClass присутствует . в фактах

Мы обнаружили следующее поведение;.

  • Если классы а, в, с и Y снабжены rule2 пожаров
  • Если классы а, в, с и Х при условии, нет правила fi re, хотя Rule1 должен иметь.
  • Правило удаления 2 разрешает запуск правила 1, когда предусмотрены A, B, C и X.
  • Перестановка правил по порядку в файле отменяет описанное выше поведение (X = Rule1 срабатывает, Y = нет огня, хотя Rule2 должен делать).
  • Опять же, в этом обратном порядке удаление второго правила позволяет первыми уволить.

Может кто-нибудь объяснить, что здесь происходит. Хотя я подозреваю, что заказ - это красная селедка, похоже, что первое правило пытаться сопоставить каким-то образом поглощает факты, или есть некоторый конфликт при передаче фактов переменным.

ОБНОВЛЕНИЕ

После дальнейших исследований я упрощенно код, указанный выше. Вместо сравнения перечисления в BClass на самом деле есть геттер, такой, что;

public Class<?> getConfigClass() { 
     return BConfig.class; 
    } 

И на самом деле правила строки BClass;

$bclass: BClass(configClass == BConfig.class); 

Мы уточнили вопрос до линии BClass. Сравнение классов каким-то образом поглощает или конфликтует. Добавление дополнительных правил (например, Rule3, Rule4) того же формата только усугубляет проблему. Дальнейшее сокращение правил для удаления их только дифференцирующего класса (X или Y);

rule "Rule1" 
when 
    // conditions 
    $aclass: AClass(type == AType.DOG); 
    $bclass: BClass(configClass == BConfig.class); 
    $cclass: CClass(); 
then 
    //actions  
    System.out.println("Actioning Rule1"); 
end 

rule "Rule2" 
when 
    // conditions 
    $aclass: AClass(type == AType.DOG); 
    $bclass: BClass(configClass == BConfig.class); 
    $cclass: CClass(); 
then 
    //actions 
    System.out.println("Actioning Rule2"); 
end 

rule "Rule3" 
when 
    // conditions 
    $aclass: AClass(type == AType.DOG); 
    $bclass: BClass(configClass == BConfig.class); 
    $cclass: CClass(); 
then 
    //actions 
    System.out.println("Actioning Rule3"); 
end 

Переходя в фактах, которые удовлетворяют эти 3 условия (т.е. AClass с GetType == AType.DOG, BClass с getConfigClass == BConfig.class и CClass) всегда бежит последнее правило, независимо от того, сколько правил есть.

Удаление условий сравнения класса BClass и повторного запуска тестовых огней все правила, как ожидалось.

Похоже, очень странное поведение, при котором срабатывает одно правило, сравнение классов является действительным, но только для одного правила?

+0

Это не может быть воспроизведена, если вы не предоставите точный код для классов А и В и перечисления AType и BType. – laune

+0

Я не согласен, учитывая, что первые три условия в обоих правилах одинаковы, их фактическая реализация не имеет значения. Возможно, мне следовало бы упроститься дальше и оставить там CClass, вопрос в том, что два правила, учитывая почти совпадающие условия, похоже, блокируют друг друга. –

+0

Я тоже не согласен, так как ситуация (как описано здесь) не может быть воспроизведена, т. Е. Оба правила стреляют. – laune

ответ

0

Это ошибка, по крайней мере, в 6.3.0 и 6.4.0.

Это довольно интересно: до тех пор, пока есть только два одинаковых LHS, оба огня; если нет ограничения с использованием поля типа java.lang.Класс все в порядке; только если существует такое ограничение, и если есть три правила, две активации удаляются.

Заключение

Исправлена ​​ошибка была сообщена как Drools-1144 и исправление доступно по запросу тяговой https://github.com/droolsjbpm/drools/pull/763

+0

Я сообщил об ошибке. – laune

+0

Мне сообщили, что подобная ошибка исправлена. Подтверждение того, что это исправление также вылечит вашу ошибку ABC, придет в течение 24 часов. – laune

+0

Обновление: Этот, кажется, новый. - Может запускаться только одним шаблоном B с одним ограничением, сравнивающим «configClass == Config.class» во всех трех из них. Будьте на связи. – laune

Смежные вопросы