Что не так с правилом 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

перечитайте документацию, чтобы найти подсказки об ограничении поля "совместимость". безрезультатно

Другие вопросы по тегам