Skip to content

Commit 6f15d2c

Browse files
committed
Fix index out of bounds exception when using DMN Hit Policy Priority and no results
Fixes #4092
1 parent 5069de5 commit 6f15d2c

6 files changed

Lines changed: 104 additions & 1 deletion

File tree

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/hitpolicy/HitPolicyPriority.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ public int compare(Object o1, Object o2) {
7373
}
7474
});
7575

76-
executionContext.getAuditContainer().addDecisionResultObject(ruleResults.get(0));
76+
if (!ruleResults.isEmpty()) {
77+
executionContext.getAuditContainer().addDecisionResultObject(ruleResults.get(0));
78+
}
79+
7780
}
7881
}

modules/flowable-dmn-engine/src/test/java/org/flowable/dmn/engine/test/runtime/HitPolicyCollectTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ public void collectHitPolicyNoAggregator() {
4444
.containsExactly("OUTPUT1", "OUTPUT2", "OUTPUT3");
4545
}
4646

47+
@Test
48+
@DmnDeployment(resources = "org/flowable/dmn/engine/test/runtime/HitPolicyCollectTest.collectHitPolicyNoAggregator.dmn")
49+
public void collectHitPolicyNoAggregatorNoMatch() {
50+
DmnDecisionService dmnRuleService = dmnEngine.getDmnDecisionService();
51+
52+
List<Map<String, Object>> result = dmnRuleService.createExecuteDecisionBuilder()
53+
.decisionKey("decision1")
54+
.variable("inputVariable1", 50)
55+
.execute();
56+
57+
assertThat(result).isEmpty();
58+
}
59+
4760
@Test
4861
@DmnDeployment
4962
public void collectHitPolicyNoAggregatorCompound() {
@@ -110,6 +123,19 @@ public void collectHitPolicySUM() {
110123
.containsExactly(entry("outputVariable1", 90D));
111124
}
112125

126+
@Test
127+
@DmnDeployment(resources = "org/flowable/dmn/engine/test/runtime/HitPolicyCollectTest.collectHitPolicySUM.dmn")
128+
public void collectHitPolicySUMNoMatch() {
129+
DmnDecisionService dmnRuleService = dmnEngine.getDmnDecisionService();
130+
131+
Map<String, Object> result = dmnRuleService.createExecuteDecisionBuilder()
132+
.decisionKey("decision1")
133+
.variable("inputVariable1", 50)
134+
.executeWithSingleResult();
135+
136+
assertThat(result).isNull();
137+
}
138+
113139
@Test
114140
@DmnDeployment
115141
public void collectHitPolicySUM_force_DMN11() {

modules/flowable-dmn-engine/src/test/java/org/flowable/dmn/engine/test/runtime/HitPolicyFirstTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,17 @@ public void firstHitPolicy() {
4343
entry("outputVariable2", "result2")
4444
);
4545
}
46+
47+
@Test
48+
@DmnDeployment
49+
public void firstHitPolicyNoMatch() {
50+
DmnDecisionService dmnRuleService = dmnEngine.getDmnDecisionService();
51+
52+
Map<String, Object> result = dmnRuleService.createExecuteDecisionBuilder()
53+
.decisionKey("decision1")
54+
.variable("inputVariable1", 50)
55+
.executeWithSingleResult();
56+
57+
assertThat(result).isNull();
58+
}
4659
}

modules/flowable-dmn-engine/src/test/java/org/flowable/dmn/engine/test/runtime/HitPolicyOutputOrderTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ public void outputOrderHitPolicy() {
4444
.containsExactly("OUTPUT2", "OUTPUT3", "OUTPUT1");
4545
}
4646

47+
@Test
48+
@DmnDeployment(resources = "org/flowable/dmn/engine/test/runtime/HitPolicyOutputOrderTest.outputOrderHitPolicy.dmn")
49+
public void outputOrderHitPolicyNoMatch() {
50+
DmnDecisionService dmnRuleService = dmnEngine.getDmnDecisionService();
51+
52+
List<Map<String, Object>> result = dmnRuleService.createExecuteDecisionBuilder()
53+
.decisionKey("decision1")
54+
.variable("inputVariable1", 50)
55+
.execute();
56+
57+
assertThat(result).isEmpty();
58+
}
59+
4760
@Test
4861
@DmnDeployment
4962
public void outputOrderHitPolicyNumberAsString() {

modules/flowable-dmn-engine/src/test/java/org/flowable/dmn/engine/test/runtime/HitPolicyPriorityTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,19 @@ public void priorityHitPolicy() {
4242
.containsOnly(entry("outputVariable1", "OUTPUT2"));
4343
}
4444

45+
@Test
46+
@DmnDeployment(resources = "org/flowable/dmn/engine/test/runtime/HitPolicyPriorityTest.priorityHitPolicy.dmn")
47+
public void priorityHitPolicyNoMatch() {
48+
DmnDecisionService dmnRuleService = dmnEngine.getDmnDecisionService();
49+
50+
Map<String, Object> result = dmnRuleService.createExecuteDecisionBuilder()
51+
.decisionKey("decision1")
52+
.variable("inputVariable1", 50)
53+
.executeWithSingleResult();
54+
55+
assertThat(result).isNull();
56+
}
57+
4558
@Test
4659
@DmnDeployment
4760
public void priorityHitPolicyCompound() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<definitions xmlns="http://www.omg.org/spec/DMN/20151101" id="full" name="Full" namespace="http://www.flowable.org/dmn">
2+
<decision id="decision1" name="Full Decision">
3+
<decisionTable id="decisionTable" hitPolicy="FIRST">
4+
<input>
5+
<inputExpression id="inputVariable1" typeRef="double">
6+
<text>inputVariable1</text>
7+
</inputExpression>
8+
</input>
9+
<output id="output1" label="Output 1" name="outputVariable1" typeRef="string"></output>
10+
<output id="output2" label="Output 2" name="outputVariable2" typeRef="string"></output>
11+
<rule>
12+
<inputEntry id="inputEntry1">
13+
<text><![CDATA[< 10]]></text>
14+
</inputEntry>
15+
<outputEntry id="outputEntry1_1">
16+
<text>'lt 10'</text>
17+
</outputEntry>
18+
<outputEntry id="outputEntry1_2">
19+
<text>'result1'</text>
20+
</outputEntry>
21+
</rule>
22+
<rule>
23+
<inputEntry id="inputEntry3">
24+
<text><![CDATA[< 20]]></text>
25+
</inputEntry>
26+
<outputEntry id="outputEntry3_1">
27+
<text>'lt 20'</text>
28+
</outputEntry>
29+
<outputEntry id="outputEntry3_2">
30+
<text>'result3'</text>
31+
</outputEntry>
32+
</rule>
33+
</decisionTable>
34+
</decision>
35+
</definitions>

0 commit comments

Comments
 (0)