Here is a simpler example where the behavior differs depending on whether you assert the fact first or load the rules first. This is just a simple fact class with a string variable called field1. I create and assert the fact with the string "hello" for field1, then I load the following rule file:
package com.vsasset.rules.isolate;
import java.lang.String;
rule "simpleDependence"
no-loop true
when
a: factA(field1=="hello")
then
a.setField1
("world");
modify(a);
System.out.println("a: " + a.getField1());
TestCase.fireRules();
end
rule "simpleRetract"
no-loop true
when
a: factA(field1 == "world")
then
retract(a);
System.out.println("Retracted a");
end
The second rule (simpleRetract) does not print when the initial factA is asserted before the rules are loaded. If the rules are loaded first, then the second rule prints.
To be honest, I'm not sure whether to expect the second rule to print -- does it get immediately de-activated upon the retract so that any further statements are not executed?
In any event, I would expect the behavior to be the same whether I assert factA first or load the rules first.
Am I missing something fundamental? Perhaps I am mis-using the API...
Thanks,
Justine