Использование слюны 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 и повторного запуска тестовых огней все правила, как ожидалось.
Похоже, очень странное поведение, при котором срабатывает одно правило, сравнение классов является действительным, но только для одного правила?
Это не может быть воспроизведена, если вы не предоставите точный код для классов А и В и перечисления AType и BType. – laune
Я не согласен, учитывая, что первые три условия в обоих правилах одинаковы, их фактическая реализация не имеет значения. Возможно, мне следовало бы упроститься дальше и оставить там CClass, вопрос в том, что два правила, учитывая почти совпадающие условия, похоже, блокируют друг друга. –
Я тоже не согласен, так как ситуация (как описано здесь) не может быть воспроизведена, т. Е. Оба правила стреляют. – laune