Drools is not producing consistent results in the following example.  If you
run the DRL shown below, you will see that rules 2 and 3 activate and log a
message.  If you then comment out rule 3 in the DRL (you must put the entire
rule inside /*  */ characters rather than simply disabling it), and rerun
it, you'll notice that rules 1 and 2 fire.  How is it that the presence of
rule 3 affects whether or not rule 1 activates?  These two rules are not
dependent in their DRL.

It appears to be related to the fact that rule 1 uses single quotes instead
of double quotes.  If you change that, then Drools starts behaving
consistently.  This makes me believe that the problem is somehow related to
how Drools is building the Rete tree with the single quotes.



With all three rules active I get:

[main]::INFO ::DroolsTest::test 3 hit on RecordA( id=100 ) - RecordB(
id=100, role=2 )
[main]::INFO ::DroolsTest::test 2 hit on RecordA( id=100 ) - RecordB(
id=100, role=1 )


With rule 3 commented out I get:

[main]::INFO ::DroolsTest::test 2 hit on RecordA( id=100 ) - RecordB(
id=100, role=1 )
[main]::INFO ::DroolsTest::test 1 hit on RecordA( id=100 ) - RecordB(
id=100, role=1 )


Interestingly, if you comment out rule 2 so only rules 1 and 3 are active,
rule 1 fires again:

[main]::INFO ::DroolsTest::test 3 hit on RecordA( id=100 ) - RecordB(
id=100, role=2 )
[main]::INFO ::DroolsTest::test 1 hit on RecordA( id=100 ) - RecordB(
id=100, role=1 )



*Environment:  Drools 5.4.0*




package tests

import org.apache.log4j.Logger;

global Logger log


declare RecordA
        id : long
end

declare RecordB
        id : long
        role : String
end

rule "insert data 1"
salience 99999
        when
        then
                insert (new RecordA(100));
                insert (new RecordB(100, "1"));
                insert (new RecordB(100, "2"));
end

rule "test 1"
        when
                a : RecordA( )
                b : RecordB( id == b.id, role == '1' )
        then
                log.info(String.format("%s hit on %s - %s", 
kcontext.getRule().getName(),
a, b));
end

rule "test 2"
        when
                a : RecordA( )
                b : RecordB( id == b.id, role == "1" )
        then
                log.info(String.format("%s hit on %s - %s", 
kcontext.getRule().getName(),
a, b));         
end

rule "test 3"
        when
                a : RecordA( )
                b : RecordB( id == b.id, role == "2" )
        then
                log.info(String.format("%s hit on %s - %s", 
kcontext.getRule().getName(),
a, b));
end






--
View this message in context: 
http://drools.46999.n3.nabble.com/Drools-Rule-Evaluations-are-Inconsistent-tp4019900.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to