[rules-users] Drools Rule Evaluations are Inconsistent

bdolbeare bdolbeare at yahoo.com
Sat Sep 22 12:24:42 EDT 2012


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.


More information about the rules-users mailing list