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]

Reply via email to