Chaining Rules Together
-----------------------
Key: DROOLS-486
URL: http://jira.codehaus.org/browse/DROOLS-486
Project: drools
Type: Bug
Components: semantics.java
Versions: 2.5
Environment: Windows XP,
Reporter: Russ Ray
Attachments: Chain_rules_problem.rtf
When chaining together four rules in such a way that no one rule is fired more
than once and each rule is excuted squentially based upon a priority, the
second rule does not fire.
Here are the 4 rules.
<!-- priority and no recursive rule -->
<rule name="AssignTask" salience="-1" no-loop="true">
<!-- What is being passed into the rule -->
<parameter identifier="taskVO1">
<class>TaskVO</class>
</parameter>
<!-- What conditions must be true before rule is asserted -->
<java:condition>taskVO1.getIdentifiersList() != null ||
taskVO1.isIdentifiersListEmpty() == false</java:condition>
<java:condition>taskVO1.getActionStep().equalsIgnoreCase("AWAIT EVAL")==
true </java:condition>
<java:condition>taskVO1.containsIdentifier("CONTRACT", "S#1234567890") ==
true</java:condition>
<!-- What does the rule does for us -->
<java:consequence>
System.out.println("***************************** in consequence for
rule1");
taskVO1.setDepartment("DPT1");
taskVO1.setDptCode(lookupDeptCode("DPT1"));
taskVO1.setWorkBasket("rray");
taskVO1.setTaskType("ADFPAYCHK");
taskVO1.setTskCode(lookupTaskTypeCode("ADFPAYCHK"));
taskVO1.setActionStep("INDEX");
taskVO1.setActCode(lookupActStepCode("INDEX"));
taskVO1.setStatus("OPEN");
//printTaskVO(taskVO1);
<!-- Firing any other rules based on changes -->
drools.modifyObject(taskVO1);
</java:consequence>
</rule>
<!-- priority and no recursive rule -->
<rule name="AuditTask" salience="0" no-loop="true">
<!-- What is being passed into the rule -->
<parameter identifier="taskVO2">
<class>TaskVO</class>
</parameter>
<!-- What conditions must be true before rule is asserted -->
<java:condition>taskVO2.getStatus().equalsIgnoreCase("OPEN") ==
true</java:condition>
<java:condition>taskVO2.getTaskType().equalsIgnoreCase("ADFPAYCHK") ==
true</java:condition>
<java:condition>taskVO2.getActionStep().equalsIgnoreCase("INDEX")== true
</java:condition>
<java:condition>taskVO2.containsIdentifier("CONTRACT", "S#1234567890") ==
true</java:condition>
<!-- What does the rule does for us -->
<java:consequence>
System.out.println("***************************** in consequence for
rule2");
IdentifierVO ident = new IdentifierVO();
ident.setTaskId("t1234567890");
ident.addField("COMPANY20060313-0000001");
ident.addFieldName("AUDIT NBR");
ident.addFieldSize(45);
ident.setIdDesc("AUDIT NBR");
//printIdentVO(ident);
taskVO2.addIdentifier(ident);
taskVO2.setActionStep("PROCESS");
//printTaskVO(taskVO2);
<!-- Firing any other rules based on changes -->
drools.modifyObject(taskVO2);
</java:consequence>
</rule>
<!-- priority and no recursive rule -->
<rule name="RouteTask" salience="1" no-loop="true">
<!-- What is being passed into the rule -->
<parameter identifier="taskVO3">
<class>TaskVO</class>
</parameter>
<!-- What conditions must be true before rule is asserted -->
<java:condition>taskVO3.getStatus().equalsIgnoreCase("OPEN") == true
</java:condition>
<java:condition>taskVO3.getTaskType().equalsIgnoreCase("ADFPAYCHK") ==
true</java:condition>
<java:condition>!taskVO3.getActionStep().equalsIgnoreCase("QC")== true
</java:condition>
<java:condition>taskVO3.containsIdentifier("AUDIT NBR",
"COMPANY20060313-0000001") == true</java:condition>
<!-- What does the rule does for us -->
<java:consequence>
System.out.println("***************************** in consequence
for rule3");
taskVO3.setWorkBasket("mightymouse");
taskVO3.setStatus("REVIEW");
//printTaskVO(taskVO3);
<!-- Firing any other rules based on changes -->
drools.modifyObject(taskVO3);
</java:consequence>
</rule>
<!-- priority and no recursive rule -->
<rule name="SuspendTask" salience="2" no-loop="true">
<!-- What is being passed into the rule -->
<parameter identifier="taskVO4">
<class>TaskVO</class>
</parameter>
<!-- What conditions must be true before rule is asserted -->
<java:condition>taskVO4.getTaskType().equals("ADFPAYCHK") ==
true</java:condition>
<java:condition>taskVO4.getStatus().equalsIgnoreCase("REVIEW") ==
true</java:condition>
<java:condition>taskVO4.getCaseDesc().equalsIgnoreCase("missing
signature") == true</java:condition>
<!-- What does the rule does for us -->
<java:consequence>
System.out.println("***************************** in consequence for
rule4");
taskVO4.setStatus("SUSPEND");
taskVO4.setSuspOper("MightyMouse");
taskVO4.setCaseDesc("missing signature");
taskVO4.setCaseId("C1234567890");
//printTaskVO(taskVO4);
<!-- Firing any other rules based on changes -->
drools.modifyObject(taskVO4);
</java:consequence>
</rule>
Only the first rule is fired.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira