Что не так с правилом Drools?
У меня большой опыт работы с JBOSS Drools. текущий проект, с которым я работаю, использует Drools 4.
вот одно из правил у меня в проекте
rule "testcase"
salience 300
when
$item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
not Tegret(targetId == $item.targetId)
then
retract ($item);
end
Идея состоит в том, чтобы отозвать такие элементы из рабочей памяти, с которой не связан целевой объект. Я проверяю это с этими объектами в рабочей памяти:
Item {itemId = 7305, itemTYpeId = ITEM_TYPE_A, targetId = -1023} Target {targetId = -1023}
в этом случае правило не должно срабатывать, но оно срабатывает. после многих экспериментов я обнаружил это странное поведение:
правило "testcase2" срабатывает, а "testcase1" - нет.
rule "testcase1"
salience 300
when
$item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
Tegret(targetId == $item.targetId)
then
...
end
rule "testcase2"
salience 300
when
$item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
Tegret($ti:targetId)
eval($ti == $item.targetId)
then
...
end
так что здесь не так? Я запускаю "testcase1" и "testcase2" отдельно на разных запусках программы.
1 ответ
Что ж, после многих экспериментов и возни вот что я обнаружил: я не знаю, является ли это ошибкой или нет, но это происходило из-за различий в типах между "связывающими" полями.
Tagret.targetId является int примитивным.Item.targetId длинный примитив.
переписав правило таким образом, решил проблему:
rule "testcase"
salience 300
when
$item : Item(itemTypeId in (Item.ITEM_TYPE_A, Item.ITEM_TYPE_B), targetId < 0)
not Tegret(targetId == ((long)$item.targetId))
then
retract ($item);
end
перечитайте документацию, чтобы найти подсказки об ограничении поля "совместимость". безрезультатно