This is an automated email from the ASF dual-hosted git repository.
gitgabrio pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-kogito-apps.git
The following commit(s) were added to refs/heads/main by this push:
new 94fc55e39 [incubator-kie-issues#1591] Aggregate evaluationHitIds to
Map<String, Integer> (#2134)
94fc55e39 is described below
commit 94fc55e3982aac20bdbcee44677208a7e26042d5
Author: Gabriele Cardosi <[email protected]>
AuthorDate: Wed Oct 30 16:14:24 2024 +0100
[incubator-kie-issues#1591] Aggregate evaluationHitIds to Map<String,
Integer> (#2134)
* [incubator-kie-issues#1591] Aggregate evaluationHitIds to Map<String,
Integer>
* [incubator-kie-issues#1591] Fixed as per PR suggestion
---------
Co-authored-by: Gabriele-Cardosi <[email protected]>
---
.../kie/kogito/jitexecutor/dmn/DMNEvaluator.java | 5 +-
.../kie/kogito/jitexecutor/dmn/JITDMNListener.java | 12 ++--
.../jitexecutor/dmn/responses/JITDMNResult.java | 10 ++--
.../jitexecutor/dmn/JITDMNServiceImplTest.java | 41 +++++++-------
.../jitexecutor/dmn/api/JITDMNResourceTest.java | 64 ++++++++++++----------
5 files changed, 68 insertions(+), 64 deletions(-)
diff --git
a/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/DMNEvaluator.java
b/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/DMNEvaluator.java
index 92ec93303..7c73c5ecc 100644
---
a/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/DMNEvaluator.java
+++
b/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/DMNEvaluator.java
@@ -22,7 +22,6 @@ import java.io.StringReader;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -81,12 +80,12 @@ public class DMNEvaluator {
DMNContext dmnContext =
new DynamicDMNContextBuilder(dmnRuntime.newContext(),
dmnModel).populateContextWith(context);
DMNResult dmnResult = dmnRuntime.evaluateAll(dmnModel, dmnContext);
- Optional<List<String>> evaluationHitIds =
dmnRuntime.getListeners().stream()
+ Optional<Map<String, Integer>> evaluationHitIds =
dmnRuntime.getListeners().stream()
.filter(JITDMNListener.class::isInstance)
.findFirst()
.map(JITDMNListener.class::cast)
.map(JITDMNListener::getEvaluationHitIds);
- return new JITDMNResult(getNamespace(), getName(), dmnResult,
evaluationHitIds.orElse(Collections.emptyList()));
+ return new JITDMNResult(getNamespace(), getName(), dmnResult,
evaluationHitIds.orElse(Collections.emptyMap()));
}
public static DMNEvaluator fromMultiple(MultipleResourcesPayload payload) {
diff --git
a/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/JITDMNListener.java
b/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/JITDMNListener.java
index 9f753e754..2da2e74e4 100644
---
a/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/JITDMNListener.java
+++
b/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/JITDMNListener.java
@@ -18,8 +18,8 @@
*/
package org.kie.kogito.jitexecutor.dmn;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
import org.kie.dmn.api.core.event.AfterConditionalEvaluationEvent;
import org.kie.dmn.api.core.event.AfterEvaluateAllEvent;
@@ -36,14 +36,14 @@ import org.slf4j.LoggerFactory;
public class JITDMNListener implements DMNRuntimeEventListener {
- private final List<String> evaluationHitIds = new ArrayList<>();
+ private final Map<String, Integer> evaluationHitIds = new HashMap<>();
private static final Logger LOGGER =
LoggerFactory.getLogger(JITDMNListener.class);
@Override
public void afterEvaluateDecisionTable(AfterEvaluateDecisionTableEvent
event) {
logEvent(event);
- evaluationHitIds.addAll(event.getSelectedIds());
+ event.getSelectedIds().forEach(s -> evaluationHitIds.compute(s, (k, v)
-> v == null ? 1 : v + 1));
}
@Override
@@ -79,10 +79,10 @@ public class JITDMNListener implements
DMNRuntimeEventListener {
@Override
public void afterConditionalEvaluation(AfterConditionalEvaluationEvent
event) {
logEvent(event);
- evaluationHitIds.add(event.getExecutedId());
+ evaluationHitIds.compute(event.getExecutedId(), (k, v) -> v == null ?
1 : v + 1);
}
- public List<String> getEvaluationHitIds() {
+ public Map<String, Integer> getEvaluationHitIds() {
return evaluationHitIds;
}
diff --git
a/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/responses/JITDMNResult.java
b/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/responses/JITDMNResult.java
index 4f43a123f..c444dd014 100644
---
a/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/responses/JITDMNResult.java
+++
b/jitexecutor/jitexecutor-dmn/src/main/java/org/kie/kogito/jitexecutor/dmn/responses/JITDMNResult.java
@@ -50,17 +50,17 @@ public class JITDMNResult implements Serializable,
private Map<String, JITDMNDecisionResult> decisionResults = new
HashMap<>();
- private List<String> evaluationHitIds;
+ private Map<String, Integer> evaluationHitIds;
public JITDMNResult() {
// Intentionally blank.
}
public JITDMNResult(String namespace, String modelName,
org.kie.dmn.api.core.DMNResult dmnResult) {
- this(namespace, modelName, dmnResult, Collections.emptyList());
+ this(namespace, modelName, dmnResult, Collections.emptyMap());
}
- public JITDMNResult(String namespace, String modelName,
org.kie.dmn.api.core.DMNResult dmnResult, List<String> evaluationHitIds) {
+ public JITDMNResult(String namespace, String modelName,
org.kie.dmn.api.core.DMNResult dmnResult, Map<String, Integer>
evaluationHitIds) {
this.namespace = namespace;
this.modelName = modelName;
this.setDmnContext(dmnResult.getContext().getAll());
@@ -110,11 +110,11 @@ public class JITDMNResult implements Serializable,
}
}
- public List<String> getEvaluationHitIds() {
+ public Map<String, Integer> getEvaluationHitIds() {
return evaluationHitIds;
}
- public void setEvaluationHitIds(List<String> evaluationHitIds) {
+ public void setEvaluationHitIds(Map<String, Integer> evaluationHitIds) {
this.evaluationHitIds = evaluationHitIds;
}
diff --git
a/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/JITDMNServiceImplTest.java
b/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/JITDMNServiceImplTest.java
index e99957ef0..0e627f7a3 100644
---
a/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/JITDMNServiceImplTest.java
+++
b/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/JITDMNServiceImplTest.java
@@ -79,7 +79,8 @@ public class JITDMNServiceImplTest {
JITDMNResult dmnResult =
jitdmnService.evaluateModel(decisionTableModel, context);
Assertions.assertEquals("LoanEligibility", dmnResult.getModelName());
-
Assertions.assertEquals("https://github.com/kiegroup/kogito-examples/dmn-quarkus-listener-example",
dmnResult.getNamespace());
+
Assertions.assertEquals("https://github.com/kiegroup/kogito-examples/dmn-quarkus-listener-example",
+ dmnResult.getNamespace());
Assertions.assertTrue(dmnResult.getMessages().isEmpty());
Assertions.assertEquals("Yes",
dmnResult.getDecisionResultByName("Eligibility").getResult());
}
@@ -101,12 +102,12 @@ public class JITDMNServiceImplTest {
Assertions.assertEquals("DMN_A77074C1-21FE-4F7E-9753-F84661569AFC",
dmnResult.getModelName());
Assertions.assertTrue(dmnResult.getMessages().isEmpty());
Assertions.assertEquals(BigDecimal.valueOf(50),
dmnResult.getDecisionResultByName("Risk Score").getResult());
- List<String> evaluationHitIds = dmnResult.getEvaluationHitIds();
+ Map<String, Integer> evaluationHitIds =
dmnResult.getEvaluationHitIds();
Assertions.assertNotNull(evaluationHitIds);
Assertions.assertEquals(3, evaluationHitIds.size());
- Assertions.assertTrue(evaluationHitIds.contains(elseElementId));
- Assertions.assertTrue(evaluationHitIds.contains(ruleId0));
- Assertions.assertTrue(evaluationHitIds.contains(ruleId3));
+ Assertions.assertTrue(evaluationHitIds.containsKey(elseElementId));
+ Assertions.assertTrue(evaluationHitIds.containsKey(ruleId0));
+ Assertions.assertTrue(evaluationHitIds.containsKey(ruleId3));
context = new HashMap<>();
context.put("Credit Score", "Excellent");
@@ -118,9 +119,9 @@ public class JITDMNServiceImplTest {
evaluationHitIds = dmnResult.getEvaluationHitIds();
Assertions.assertNotNull(evaluationHitIds);
Assertions.assertEquals(3, evaluationHitIds.size());
- Assertions.assertTrue(evaluationHitIds.contains(thenElementId));
- Assertions.assertTrue(evaluationHitIds.contains(ruleId1));
- Assertions.assertTrue(evaluationHitIds.contains(ruleId4));
+ Assertions.assertTrue(evaluationHitIds.containsKey(thenElementId));
+ Assertions.assertTrue(evaluationHitIds.containsKey(ruleId1));
+ Assertions.assertTrue(evaluationHitIds.containsKey(ruleId4));
}
@Test
@@ -141,12 +142,12 @@ public class JITDMNServiceImplTest {
Assertions.assertTrue(dmnResult.getMessages().isEmpty());
Assertions.assertEquals(BigDecimal.valueOf(50),
dmnResult.getDecisionResultByName("Risk Score").getResult());
- List<String> evaluationHitIds = dmnResult.getEvaluationHitIds();
+ Map<String, Integer> evaluationHitIds =
dmnResult.getEvaluationHitIds();
Assertions.assertNotNull(evaluationHitIds);
Assertions.assertEquals(3, evaluationHitIds.size());
- Assertions.assertTrue(evaluationHitIds.contains(thenElementId));
- Assertions.assertTrue(evaluationHitIds.contains(thenRuleId0));
- Assertions.assertTrue(evaluationHitIds.contains(thenRuleId4));
+ Assertions.assertTrue(evaluationHitIds.containsKey(thenElementId));
+ Assertions.assertTrue(evaluationHitIds.containsKey(thenRuleId0));
+ Assertions.assertTrue(evaluationHitIds.containsKey(thenRuleId4));
context = new HashMap<>();
context.put("Credit Score", "Excellent");
@@ -159,9 +160,9 @@ public class JITDMNServiceImplTest {
evaluationHitIds = dmnResult.getEvaluationHitIds();
Assertions.assertNotNull(evaluationHitIds);
Assertions.assertEquals(3, evaluationHitIds.size());
- Assertions.assertTrue(evaluationHitIds.contains(elseElementId));
- Assertions.assertTrue(evaluationHitIds.contains(elseRuleId2));
- Assertions.assertTrue(evaluationHitIds.contains(elseRuleId5));
+ Assertions.assertTrue(evaluationHitIds.containsKey(elseElementId));
+ Assertions.assertTrue(evaluationHitIds.containsKey(elseRuleId2));
+ Assertions.assertTrue(evaluationHitIds.containsKey(elseRuleId5));
}
@Test
@@ -185,12 +186,12 @@ public class JITDMNServiceImplTest {
expectedStatistcs.add(BigDecimal.valueOf(1));
Assertions.assertTrue(dmnResult.getMessages().isEmpty());
Assertions.assertEquals(expectedStatistcs,
dmnResult.getDecisionResultByName("Statistics").getResult());
- final List<String> evaluationHitIds = dmnResult.getEvaluationHitIds();
+ final Map<String, Integer> evaluationHitIds =
dmnResult.getEvaluationHitIds();
Assertions.assertNotNull(evaluationHitIds);
- Assertions.assertEquals(6, evaluationHitIds.size());
- Assertions.assertEquals(3,
evaluationHitIds.stream().filter(rule0::equals).count());
- Assertions.assertEquals(2,
evaluationHitIds.stream().filter(rule1::equals).count());
- Assertions.assertEquals(1,
evaluationHitIds.stream().filter(rule2::equals).count());
+ Assertions.assertEquals(3, evaluationHitIds.size());
+ Assertions.assertEquals(3, evaluationHitIds.get(rule0));
+ Assertions.assertEquals(2, evaluationHitIds.get(rule1));
+ Assertions.assertEquals(1, evaluationHitIds.get(rule2));
}
@Test
diff --git
a/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/api/JITDMNResourceTest.java
b/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/api/JITDMNResourceTest.java
index 6c2960308..cacf23891 100644
---
a/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/api/JITDMNResourceTest.java
+++
b/jitexecutor/jitexecutor-dmn/src/test/java/org/kie/kogito/jitexecutor/dmn/api/JITDMNResourceTest.java
@@ -19,7 +19,10 @@
package org.kie.kogito.jitexecutor.dmn.api;
import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.assertj.core.api.Assertions;
@@ -31,7 +34,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
@@ -43,9 +46,9 @@ import static
org.kie.kogito.jitexecutor.dmn.TestingUtils.getModelFromIoUtils;
@QuarkusTest
public class JITDMNResourceTest {
- private static String model;
+ private static String invalidModel;
private static String modelWithExtensionElements;
- private static String modelWithEvaluationHitIds;
+ private static String modelWithMultipleEvaluationHitIds;
private static final ObjectMapper MAPPER = new ObjectMapper();
@@ -57,14 +60,14 @@ public class JITDMNResourceTest {
@BeforeAll
public static void setup() throws IOException {
- model = getModelFromIoUtils("invalid_models/DMNv1_x/test.dmn");
+ invalidModel = getModelFromIoUtils("invalid_models/DMNv1_x/test.dmn");
modelWithExtensionElements =
getModelFromIoUtils("valid_models/DMNv1_x/testWithExtensionElements.dmn");
- modelWithEvaluationHitIds =
getModelFromIoUtils("valid_models/DMNv1_5/RiskScore_Simple.dmn");
+ modelWithMultipleEvaluationHitIds =
getModelFromIoUtils("valid_models/DMNv1_5/MultipleHitRules.dmn");
}
@Test
void testjitEndpoint() {
- JITDMNPayload jitdmnpayload = new JITDMNPayload(model, buildContext());
+ JITDMNPayload jitdmnpayload = new JITDMNPayload(invalidModel,
buildContext());
given()
.contentType(ContentType.JSON)
.body(jitdmnpayload)
@@ -76,46 +79,44 @@ public class JITDMNResourceTest {
@Test
void testjitdmnResultEndpoint() {
- JITDMNPayload jitdmnpayload = new JITDMNPayload(model, buildContext());
+ JITDMNPayload jitdmnpayload = new
JITDMNPayload(modelWithMultipleEvaluationHitIds, buildMultipleHitContext());
given()
.contentType(ContentType.JSON)
.body(jitdmnpayload)
.when().post("/jitdmn/dmnresult")
.then()
.statusCode(200)
- .body(containsString("Loan Approval"),
containsString("Approved"), containsString("xls2dmn"));
+ .body(containsString("Statistics"));
}
@Test
void testjitdmnResultEndpointWithEvaluationHitIds() throws
JsonProcessingException {
- JITDMNPayload jitdmnpayload = new
JITDMNPayload(modelWithEvaluationHitIds, buildRiskScoreContext());
- final String elseElementId = "_2CD02CB2-6B56-45C4-B461-405E89D45633";
- final String ruleId0 = "_1578BD9E-2BF9-4BFC-8956-1A736959C937";
- final String ruleId3 = "_2545E1A8-93D3-4C8A-A0ED-8AD8B10A58F9";
+ JITDMNPayload jitdmnpayload = new
JITDMNPayload(modelWithMultipleEvaluationHitIds, buildMultipleHitContext());
+ final String rule0 = "_E5C380DA-AF7B-4401-9804-C58296EC09DD";
+ final String rule1 = "_DFD65E8B-5648-4BFD-840F-8C76B8DDBD1A";
+ final String rule2 = "_E80EE7F7-1C0C-4050-B560-F33611F16B05";
String response = given().contentType(ContentType.JSON)
.body(jitdmnpayload)
.when().post("/jitdmn/dmnresult")
.then()
.statusCode(200)
- .body(containsString("Risk Score"),
- containsString("Loan Pre-Qualification"),
+ .body(containsString("Statistics"),
containsString(EVALUATION_HIT_IDS_FIELD_NAME),
- containsString(elseElementId),
- containsString(ruleId0),
- containsString(ruleId3))
+ containsString(rule0),
+ containsString(rule1),
+ containsString(rule2))
.extract()
.asString();
JsonNode retrieved = MAPPER.readTree(response);
- ArrayNode evaluationHitIdsNode = (ArrayNode)
retrieved.get(EVALUATION_HIT_IDS_FIELD_NAME);
- Assertions.assertThat(evaluationHitIdsNode).hasSize(3)
- .anyMatch(node -> node.asText().equals(elseElementId))
- .anyMatch(node -> node.asText().equals(ruleId0))
- .anyMatch(node -> node.asText().equals(ruleId3));
+ ObjectNode evaluationHitIdsNode = (ObjectNode)
retrieved.get(EVALUATION_HIT_IDS_FIELD_NAME);
+ Assertions.assertThat(evaluationHitIdsNode).hasSize(3);
+ final Map<String, Integer> expectedEvaluationHitIds = Map.of(rule0, 3,
rule1, 2, rule2, 1);
+ evaluationHitIdsNode.fields().forEachRemaining(entry ->
Assertions.assertThat(expectedEvaluationHitIds).containsEntry(entry.getKey(),
entry.getValue().asInt()));
}
@Test
void testjitExplainabilityEndpoint() {
- JITDMNPayload jitdmnpayload = new JITDMNPayload(model, buildContext());
+ JITDMNPayload jitdmnpayload = new JITDMNPayload(invalidModel,
buildContext());
given()
.contentType(ContentType.JSON)
.body(jitdmnpayload)
@@ -142,13 +143,6 @@ public class JITDMNResourceTest {
.body(containsString("m"), containsString("n"),
containsString("sum"));
}
- private Map<String, Object> buildRiskScoreContext() {
- Map<String, Object> context = new HashMap<>();
- context.put("Credit Score", "Poor");
- context.put("DTI", 33);
- return context;
- }
-
private Map<String, Object> buildContext() {
Map<String, Object> context = new HashMap<>();
context.put("FICO Score", 800);
@@ -156,4 +150,14 @@ public class JITDMNResourceTest {
context.put("PITI Ratio", .1);
return context;
}
+
+ private Map<String, Object> buildMultipleHitContext() {
+ final List<BigDecimal> numbers = new ArrayList<>();
+ numbers.add(BigDecimal.valueOf(10));
+ numbers.add(BigDecimal.valueOf(2));
+ numbers.add(BigDecimal.valueOf(1));
+ final Map<String, Object> context = new HashMap<>();
+ context.put("Numbers", numbers);
+ return context;
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]