Question

I have a long time experience working with JBOSS Drools. current project I'm working with uses Drools 4.

here is the one of the rules I have in project

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

idea is to retract such Items from working memory that does not have associated Target object. I'm testing it with these objects in working memory:

Item {itemId=7305, itemTYpeId=ITEM_TYPE_A, targetId=-1023} Target {targetId = -1023}

in this case rule should not fire, but it does. after lot of experimenting I have found this strange behaviour:

rule "testcase2" fires, while "testcase1" does not.

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

so what is going wrong here? I'm running "testcase1" and "testcase2" separately on different program runs.

Was it helpful?

Solution

Well, after lots of experimenting and fiddling here is what I found: I don't know if is it bug or not, but this was happening due to type differences between "linking" fields.

Tagret.targetId is int primitive. Item.targetId is long primitive.

rewriting rule this way solved the problem:

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

re-read documentation to find any hints about field "compatibility" restriction. no result

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top