This is an automated email from the ASF dual-hosted git repository.

pefernan 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 b3aca2e9b kie-issues#677: Data Index shows error when querying for 
ProcessInstancess that contain nodes with null enter property. (#1926)
b3aca2e9b is described below

commit b3aca2e9b9660171b32998a0e85b55a204826fcc
Author: Pere Fernández <[email protected]>
AuthorDate: Thu Nov 30 21:13:50 2023 +0100

    kie-issues#677: Data Index shows error when querying for ProcessInstancess 
that contain nodes with null enter property. (#1926)
---
 .../mapper/ProcessInstanceNodeDataEventMerger.java |  11 +-
 .../ProcessInstanceNodeDataEventMergerTest.java    | 115 +++++++++++++++++++++
 .../service/json/ProcessInstanceMetaMapper.java    |   3 +-
 3 files changed, 125 insertions(+), 4 deletions(-)

diff --git 
a/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/mapper/ProcessInstanceNodeDataEventMerger.java
 
b/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/mapper/ProcessInstanceNodeDataEventMerger.java
index 1d1eeea8a..051d933c8 100644
--- 
a/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/mapper/ProcessInstanceNodeDataEventMerger.java
+++ 
b/data-index/data-index-common/src/main/java/org/kie/kogito/index/event/mapper/ProcessInstanceNodeDataEventMerger.java
@@ -36,6 +36,8 @@ import org.kie.kogito.index.model.ProcessInstance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static 
org.kie.kogito.event.process.ProcessInstanceNodeEventBody.EVENT_TYPE_ENTER;
+import static 
org.kie.kogito.event.process.ProcessInstanceNodeEventBody.EVENT_TYPE_EXIT;
 import static org.kie.kogito.index.DateTimeUtils.toZonedDateTime;
 
 @ApplicationScoped
@@ -65,11 +67,16 @@ public class ProcessInstanceNodeDataEventMerger implements 
ProcessInstanceEventM
         nodeInstance.setName(body.getNodeName());
         nodeInstance.setType(body.getNodeType());
         switch (body.getEventType()) {
-            case 1:
+            case EVENT_TYPE_ENTER:
                 nodeInstance.setEnter(toZonedDateTime(body.getEventDate()));
                 break;
-            case 2:
+            case EVENT_TYPE_EXIT:
                 nodeInstance.setExit(toZonedDateTime(body.getEventDate()));
+
+                if (nodeInstance.getEnter() == null) {
+                    // Adding a default enter time for exit events triggered 
by EventNodeInstances
+                    nodeInstance.setEnter(nodeInstance.getExit());
+                }
                 break;
         }
         nodeInstances.add(nodeInstance);
diff --git 
a/data-index/data-index-common/src/test/java/org/kie/kogito/index/event/mapper/ProcessInstanceNodeDataEventMergerTest.java
 
b/data-index/data-index-common/src/test/java/org/kie/kogito/index/event/mapper/ProcessInstanceNodeDataEventMergerTest.java
new file mode 100644
index 000000000..331376590
--- /dev/null
+++ 
b/data-index/data-index-common/src/test/java/org/kie/kogito/index/event/mapper/ProcessInstanceNodeDataEventMergerTest.java
@@ -0,0 +1,115 @@
+package org.kie.kogito.index.event.mapper;
+
+import java.time.ZonedDateTime;
+import java.util.Date;
+import java.util.HashMap;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.kie.kogito.event.process.ProcessInstanceNodeDataEvent;
+import org.kie.kogito.event.process.ProcessInstanceNodeEventBody;
+import org.kie.kogito.index.model.NodeInstance;
+import org.kie.kogito.index.model.ProcessInstance;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static 
org.kie.kogito.event.process.ProcessInstanceNodeEventBody.EVENT_TYPE_ENTER;
+import static 
org.kie.kogito.event.process.ProcessInstanceNodeEventBody.EVENT_TYPE_EXIT;
+import static org.kie.kogito.index.DateTimeUtils.toZonedDateTime;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class ProcessInstanceNodeDataEventMergerTest {
+
+    private static final String HIRING_PROCESS_ID = "hiring";
+    private static final String PROCESS_INSTANCE_ID = 
"7b8ea46e-ffe7-4fdd-8cf5-72a3f0353947";
+
+    private static final String START_NODE_INSTANCE_ID = 
"35d525eb-868a-4056-91cc-dbc3804d157c";
+    private static final String START = "Start";
+    private static final String START_NODE_DEFINITION_ID = 
"_1639F738-45F3-4CD6-A80E-CCEBAA605D56";
+    private static final String START_NODE_TYPE = "StartNode";
+
+    private static final String ACTION_NODE_INSTANCE_ID = 
"08ee9c9c-cf67-47e5-a7e6-901a6f556c0a";
+    private static final String ACTION_NODE = "New Hiring";
+    private static final String ACTION_NODE_DEFINITION_ID = 
"_5BDBE48C-CC83-46A9-9D56-F846F8FC1045";
+    private static final String ACTION_NODE_TYPE = "ActionNode";
+
+    private static final String BOUNDARY_EVENT_NODE_INSTANCE_ID = 
"f22510d2-e0e5-460a-901e-494cda3dea26";
+    private static final String BOUNDARY_EVENT_NODE_NODE = "BoundaryEvent";
+    private static final String BOUNDARY_EVENT_NODE_NODE_DEFINITION_ID = 
"_116F3C54-A10E-4952-9E08-1CACE74CED0B";
+    private static final String BOUNDARY_EVENT_NODE_NODE_TYPE = 
"BoundaryEventNode";
+
+    private ProcessInstanceNodeDataEventMerger merger;
+    private ProcessInstance pi;
+
+    @BeforeEach
+    public void setup() {
+        merger = new ProcessInstanceNodeDataEventMerger();
+        pi = new ProcessInstance();
+        pi.setProcessId(HIRING_PROCESS_ID);
+        pi.setProcessName(HIRING_PROCESS_ID);
+        pi.setId(PROCESS_INSTANCE_ID);
+        pi.setVersion("1.0");
+        pi.setStart(ZonedDateTime.now());
+        pi.setState(1);
+    }
+
+    @Test
+    public void testMergeProcessInstanceNodeDataEvents() {
+        ProcessInstanceNodeDataEvent startNodeEnter = 
buildNodeEvent(START_NODE_INSTANCE_ID, START, START_NODE_DEFINITION_ID, 
START_NODE_TYPE, EVENT_TYPE_ENTER);
+
+        merger.merge(pi, startNodeEnter);
+
+        ProcessInstanceNodeDataEvent startNodeExit = 
buildNodeEvent(START_NODE_INSTANCE_ID, START, START_NODE_DEFINITION_ID, 
START_NODE_TYPE, EVENT_TYPE_EXIT);
+
+        merger.merge(pi, startNodeExit);
+
+        ProcessInstanceNodeDataEvent actionNodeEnter = 
buildNodeEvent(ACTION_NODE_INSTANCE_ID, ACTION_NODE, ACTION_NODE_DEFINITION_ID, 
ACTION_NODE_TYPE, EVENT_TYPE_ENTER);
+
+        merger.merge(pi, actionNodeEnter);
+
+        ProcessInstanceNodeDataEvent actionNodeExit = 
buildNodeEvent(ACTION_NODE_INSTANCE_ID, ACTION_NODE, ACTION_NODE_DEFINITION_ID, 
ACTION_NODE_TYPE, EVENT_TYPE_EXIT);
+
+        merger.merge(pi, actionNodeExit);
+
+        assertThat(pi.getNodes()).hasSize(2);
+
+        verifyNode(pi.getNodes().get(0), startNodeEnter.getData(), 
startNodeEnter.getData().getEventDate(), 
startNodeExit.getData().getEventDate());
+        verifyNode(pi.getNodes().get(1), actionNodeEnter.getData(), 
actionNodeEnter.getData().getEventDate(), 
actionNodeExit.getData().getEventDate());
+    }
+
+    @Test
+    public void testMergeBoundaryNodeExitEvent() {
+        ProcessInstanceNodeDataEvent boundaryEvent =
+                buildNodeEvent(BOUNDARY_EVENT_NODE_INSTANCE_ID, 
BOUNDARY_EVENT_NODE_NODE, BOUNDARY_EVENT_NODE_NODE_DEFINITION_ID, 
BOUNDARY_EVENT_NODE_NODE_TYPE, EVENT_TYPE_EXIT);
+
+        merger.merge(pi, boundaryEvent);
+
+        assertThat(pi.getNodes()).hasSize(1);
+
+        verifyNode(pi.getNodes().get(0), boundaryEvent.getData(), 
boundaryEvent.getData().getEventDate(), boundaryEvent.getData().getEventDate());
+    }
+
+    private void verifyNode(NodeInstance nodeInstance, 
ProcessInstanceNodeEventBody eventBody, Date enter, Date exit) {
+        assertThat(nodeInstance)
+                .hasFieldOrPropertyWithValue("id", 
eventBody.getNodeInstanceId())
+                .hasFieldOrPropertyWithValue("nodeId", 
eventBody.getNodeDefinitionId())
+                .hasFieldOrPropertyWithValue("definitionId", 
eventBody.getNodeDefinitionId())
+                .hasFieldOrPropertyWithValue("name", eventBody.getNodeName())
+                .hasFieldOrPropertyWithValue("type", eventBody.getNodeType())
+                .hasFieldOrPropertyWithValue("enter", toZonedDateTime(enter))
+                .hasFieldOrPropertyWithValue("exit", toZonedDateTime(exit));
+    }
+
+    private ProcessInstanceNodeDataEvent buildNodeEvent(String nodeInstanceId, 
String nodeName, String nodeDefinitionId, String nodeType, Integer eventType) {
+        return new ProcessInstanceNodeDataEvent(HIRING_PROCESS_ID, "", "", new 
HashMap<>(), ProcessInstanceNodeEventBody.create()
+                .processId(HIRING_PROCESS_ID)
+                .processInstanceId(PROCESS_INSTANCE_ID)
+                .nodeInstanceId(nodeInstanceId)
+                .nodeName(nodeName)
+                .nodeDefinitionId(nodeDefinitionId)
+                .nodeType(nodeType)
+                .eventDate(new Date())
+                .eventType(eventType)
+                .build());
+    }
+}
diff --git 
a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/json/ProcessInstanceMetaMapper.java
 
b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/json/ProcessInstanceMetaMapper.java
index 4c5811f77..bc1e5c3c4 100644
--- 
a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/json/ProcessInstanceMetaMapper.java
+++ 
b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/json/ProcessInstanceMetaMapper.java
@@ -25,7 +25,6 @@ import java.util.function.Function;
 import org.kie.kogito.event.process.ProcessInstanceDataEvent;
 import org.kie.kogito.event.process.ProcessInstanceStateDataEvent;
 import org.kie.kogito.event.process.ProcessInstanceVariableDataEvent;
-import org.kie.kogito.index.service.IndexingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,7 +41,7 @@ import static 
org.kie.kogito.index.storage.Constants.PROCESS_NAME;
 
 public class ProcessInstanceMetaMapper implements 
Function<ProcessInstanceDataEvent<?>, ObjectNode> {
 
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(IndexingService.class);
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(ProcessInstanceMetaMapper.class);
 
     @Override
     public ObjectNode apply(ProcessInstanceDataEvent<?> event) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to