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

fjtiradosarti 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 270119abe [Fix apache/incubator-kie-issues#1857] Adding triggerCount 
(#2204)
270119abe is described below

commit 270119abefd7e4e8656fea556e9483828914b998
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Tue Mar 18 13:48:14 2025 +0100

    [Fix apache/incubator-kie-issues#1857] Adding triggerCount (#2204)
    
    * [Fix apache/incubator-kie-issues#1857] Adding triggerCount
    
    * [Fix apache/incubator-kie-issues#1857] Adding isRetrigger
    
    * [Fix apache/incubator-kie-issues#1857] Clearing error
    
    * [Fix apache/incubator-kie-issues#1857] Adding IT test for retrigger
---
 .../src/main/resources/basic.schema.graphqls       |  8 ++++
 .../org/kie/kogito/index/model/NodeInstance.java   | 20 ++++++++
 .../kogito/index/model/ProcessInstanceError.java   |  9 ++++
 .../java/org/kie/kogito/index/test/TestUtils.java  |  1 +
 .../test/query/AbstractProcessInstanceQueryIT.java | 12 +++++
 .../ProcessInstanceErrorDataEventMerger.java       | 16 +++++--
 .../merger/ProcessInstanceNodeDataEventMerger.java |  3 ++
 .../ProcessInstanceStateDataEventMerger.java       |  2 +
 .../protostream/NodeInstanceMarshaller.java        |  5 ++
 .../kogito/index/jpa/model/NodeInstanceEntity.java | 19 ++++++++
 .../jpa/model/ProcessInstanceErrorEntity.java      | 31 ++++++++-----
 .../jpa/storage/ProcessInstanceEntityStorage.java  |  7 +++
 .../storage/AbstractProcessInstanceStorageIT.java  |  4 +-
 .../db/data-index/ansi/V1.45.1.1__retrigger.sql    | 22 +++++++++
 .../index/mongodb/model/ProcessInstanceEntity.java | 54 +++++++++++++++++-----
 .../mongodb/model/ProcessInstanceEntityMapper.java |  6 +++
 .../data-index/postgresql/V1.45.1.1__retrigger.sql | 21 +++++++++
 .../src/main/resources/META-INF/kogito-index.proto |  2 +
 .../addon/api/KogitoAddonRuntimeClientImpl.java    | 12 ++---
 .../api/KogitoAddonRuntimeClientImplTest.java      |  2 +-
 20 files changed, 218 insertions(+), 38 deletions(-)

diff --git 
a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls 
b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls
index e3a2086b2..7e568a493 100644
--- a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls
+++ b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls
@@ -106,6 +106,7 @@ type ProcessInstance {
 
 type ProcessInstanceError {
     nodeDefinitionId: String!
+    nodeInstanceId: String
     message: String
 }
 
@@ -142,6 +143,8 @@ type NodeInstance {
     definitionId: String!
     nodeId: String!
     slaDueDate: DateTime
+    retrigger: Boolean
+    errorMessage: String
 }
 
 enum MilestoneStatus {
@@ -207,6 +210,9 @@ input ProcessInstanceErrorArgument {
 }
 
 input NodeInstanceArgument {
+    and: [NodeInstanceArgument!]
+    or: [NodeInstanceArgument!]
+    not: NodeInstanceArgument
     id: IdArgument
     name: StringArgument
     definitionId: StringArgument
@@ -214,6 +220,8 @@ input NodeInstanceArgument {
     type: StringArgument
     enter: DateArgument
     exit: DateArgument
+    errorMessage: StringArgument
+    retrigger: BooleanArgument
 }
 
 input MilestoneStatusArgument {
diff --git 
a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java
 
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java
index ab9df6cad..96586f703 100644
--- 
a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java
+++ 
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java
@@ -40,6 +40,26 @@ public class NodeInstance {
 
     private ZonedDateTime slaDueDate;
 
+    private Boolean retrigger;
+
+    private String errorMessage;
+
+    public Boolean isRetrigger() {
+        return retrigger;
+    }
+
+    public void setRetrigger(Boolean retrigger) {
+        this.retrigger = retrigger;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
     @JsonProperty("nodeDefinitionId")
     private String definitionId;
 
diff --git 
a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java
 
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java
index 0023df32e..7cdc5b7ec 100644
--- 
a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java
+++ 
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java
@@ -25,6 +25,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class ProcessInstanceError {
 
     private String nodeDefinitionId;
+    private String nodeInstanceId;
     @JsonProperty("errorMessage")
     private String message;
 
@@ -77,4 +78,12 @@ public class ProcessInstanceError {
     public int hashCode() {
         return Objects.hash(nodeDefinitionId, message);
     }
+
+    public String getNodeInstanceId() {
+        return nodeInstanceId;
+    }
+
+    public void setNodeInstanceId(String nodeInstanceId) {
+        this.nodeInstanceId = nodeInstanceId;
+    }
 }
diff --git 
a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java
 
b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java
index 954bbf4a2..ffbb87fc6 100644
--- 
a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java
+++ 
b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java
@@ -111,6 +111,7 @@ public class TestUtils {
                 .nodeType(nodeType)
                 .eventDate(new Date())
                 .eventType(eventType)
+                .setRetrigger(false)
                 .build();
 
         ProcessInstanceNodeDataEvent event = new 
ProcessInstanceNodeDataEvent();
diff --git 
a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java
 
b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java
index e92b8aeed..cdb5c329a 100644
--- 
a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java
+++ 
b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java
@@ -49,4 +49,16 @@ public abstract class AbstractProcessInstanceQueryIT extends 
QueryTestBase<Strin
                 processInstanceId);
     }
 
+    @Test
+    void testProcessRetriggerQuery() {
+        String processId = "no_retrigger";
+        String processInstanceId = UUID.randomUUID().toString();
+        String subProcessId = processId + "_sub";
+        String subProcessInstanceId = UUID.randomUUID().toString();
+        ProcessInstanceStorage storage = getStorage();
+        
storage.indexState(TestUtils.createProcessInstanceEvent(processInstanceId, 
processId, subProcessId, subProcessInstanceId, COMPLETED.ordinal()));
+        
storage.indexNode(TestUtils.createProcessInstanceNodeDataEvent(processInstanceId,
 processId, "1", "1", "Javierito", "type", 1));
+        
storage.indexError(TestUtils.createProcessInstanceErrorDataEvent(processInstanceId,
 processId, "1", "kkdevaca", "1", "1"));
+        queryAndAssert(assertWithId(), storage, 
singletonList(equalTo("nodes.retrigger", false)), null, null, null, 
processInstanceId);
+    }
 }
diff --git 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java
 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java
index 3408a7247..021c9ebe5 100644
--- 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java
+++ 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java
@@ -20,6 +20,7 @@ package org.kie.kogito.index.storage.merger;
 
 import org.kie.kogito.event.process.ProcessInstanceDataEvent;
 import org.kie.kogito.event.process.ProcessInstanceErrorDataEvent;
+import org.kie.kogito.event.process.ProcessInstanceErrorEventBody;
 import org.kie.kogito.index.CommonUtils;
 import org.kie.kogito.index.model.ProcessInstance;
 import org.kie.kogito.index.model.ProcessInstanceError;
@@ -30,14 +31,19 @@ import jakarta.enterprise.context.ApplicationScoped;
 public class ProcessInstanceErrorDataEventMerger extends 
ProcessInstanceEventMerger {
 
     @Override
-    public ProcessInstance merge(ProcessInstance pi, 
ProcessInstanceDataEvent<?> data) {
-        ProcessInstanceErrorDataEvent event = (ProcessInstanceErrorDataEvent) 
data;
-        pi = getOrNew(pi, data, event.getData().getEventDate());
+    public ProcessInstance merge(ProcessInstance pi, 
ProcessInstanceDataEvent<?> dataEvent) {
+        ProcessInstanceErrorDataEvent event = (ProcessInstanceErrorDataEvent) 
dataEvent;
+        ProcessInstanceErrorEventBody data = event.getData();
+        pi = getOrNew(pi, dataEvent, data.getEventDate());
         ProcessInstanceError error = new ProcessInstanceError();
-        error.setMessage(event.getData().getErrorMessage());
-        error.setNodeDefinitionId(event.getData().getNodeDefinitionId());
+        error.setMessage(data.getErrorMessage());
+        error.setNodeDefinitionId(data.getNodeDefinitionId());
+        error.setNodeInstanceId(data.getNodeInstanceId());
         pi.setError(error);
         pi.setState(CommonUtils.ERROR_STATE);
+        if (pi.getNodes() != null) {
+            pi.getNodes().stream().filter(n -> 
n.getId().equals(error.getNodeInstanceId())).findAny().ifPresent(n -> 
n.setErrorMessage(data.getErrorMessage()));
+        }
         return pi;
     }
 
diff --git 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java
 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java
index bb7c39a5b..5ac329df7 100644
--- 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java
+++ 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java
@@ -64,6 +64,9 @@ public class ProcessInstanceNodeDataEventMerger extends 
ProcessInstanceEventMerg
         nodeInstance.setName(body.getNodeName());
         nodeInstance.setType(body.getNodeType());
         nodeInstance.setSlaDueDate(toZonedDateTime(body.getSlaDueDate()));
+        if (body.isRetrigger() != null) {
+            nodeInstance.setRetrigger(body.isRetrigger());
+        }
         ZonedDateTime eventDate = toZonedDateTime(body.getEventDate());
         switch (body.getEventType()) {
             case EVENT_TYPE_ENTER:
diff --git 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java
 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java
index a7be6d0ea..61196cd15 100644
--- 
a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java
+++ 
b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java
@@ -56,6 +56,8 @@ public class ProcessInstanceStateDataEventMerger extends 
ProcessInstanceEventMer
             pi.setCreatedBy(event.getData().getEventUser());
         } else if (event.getData().getEventType() == 
ProcessInstanceStateEventBody.EVENT_TYPE_STARTED) {
             pi.setEnd(toZonedDateTime(event.getData().getEventDate()));
+        } else if (event.getData().getEventType() == 
ProcessInstanceStateEventBody.EVENT_TYPE_RETRIGGERED) {
+            pi.setError(null);
         }
         pi.setBusinessKey(event.getData().getBusinessKey());
         pi.setAddons(isNullOrEmpty(event.getKogitoAddons()) ? null : 
Set.of(event.getKogitoAddons().split(",")));
diff --git 
a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java
 
b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java
index dd4b5f557..fc60ad7ab 100644
--- 
a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java
+++ 
b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java
@@ -43,6 +43,9 @@ public class NodeInstanceMarshaller extends 
AbstractMarshaller implements Messag
         node.setDefinitionId(reader.readString("definitionId"));
         node.setNodeId(reader.readString("nodeId"));
         node.setSlaDueDate(dateToZonedDateTime(reader.readDate("slaDueDate")));
+        node.setRetrigger(reader.readBoolean("retrigger"));
+        node.setErrorMessage(reader.readString("errorMessage"));
+
         return node;
     }
 
@@ -56,6 +59,8 @@ public class NodeInstanceMarshaller extends 
AbstractMarshaller implements Messag
         writer.writeString("definitionId", node.getDefinitionId());
         writer.writeString("nodeId", node.getNodeId());
         writer.writeDate("slaDueDate", 
zonedDateTimeToDate(node.getSlaDueDate()));
+        writer.writeBoolean("retrigger", node.isRetrigger());
+        writer.writeString("errorMessage", node.getErrorMessage());
     }
 
     @Override
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java
 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java
index 51c5bef91..ef3babab5 100644
--- 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java
+++ 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java
@@ -45,11 +45,30 @@ public class NodeInstanceEntity extends AbstractEntity {
     private ZonedDateTime exit;
     private ZonedDateTime slaDueDate;
     private String definitionId;
+    private Boolean retrigger;
+    private String errorMessage;
+
     @ManyToOne(cascade = CascadeType.ALL, optional = false)
     @OnDelete(action = OnDeleteAction.CASCADE)
     @JoinColumn(name = "processInstanceId", foreignKey = @ForeignKey(name = 
"fk_nodes_process"))
     private ProcessInstanceEntity processInstance;
 
+    public Boolean isRetrigger() {
+        return retrigger;
+    }
+
+    public void setRetrigger(Boolean isRetrigger) {
+        this.retrigger = isRetrigger;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
     @Override
     public String getId() {
         return id;
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java
 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java
index b3902299a..04b8f6775 100644
--- 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java
+++ 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java
@@ -26,6 +26,7 @@ import jakarta.persistence.Embeddable;
 public class ProcessInstanceErrorEntity {
 
     private String nodeDefinitionId;
+    private String nodeInstanceId;
     private String message;
 
     public String getNodeDefinitionId() {
@@ -44,22 +45,28 @@ public class ProcessInstanceErrorEntity {
         this.message = message;
     }
 
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ProcessInstanceErrorEntity that = (ProcessInstanceErrorEntity) o;
-        return Objects.equals(nodeDefinitionId, that.nodeDefinitionId) &&
-                Objects.equals(message, that.message);
+    public void setNodeInstanceId(String nodeInstanceId) {
+        this.nodeInstanceId = nodeInstanceId;
+    }
+
+    public String getNodeInstanceId() {
+        return nodeInstanceId;
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(nodeDefinitionId, message);
+        return Objects.hash(message, nodeDefinitionId, nodeInstanceId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!(obj instanceof ProcessInstanceErrorEntity))
+            return false;
+        ProcessInstanceErrorEntity other = (ProcessInstanceErrorEntity) obj;
+        return Objects.equals(message, other.message) && 
Objects.equals(nodeDefinitionId, other.nodeDefinitionId)
+                && Objects.equals(nodeInstanceId, other.nodeInstanceId);
     }
 
 }
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java
 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java
index b6ab5aa3e..d3ce2b35d 100644
--- 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java
+++ 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java
@@ -147,7 +147,9 @@ public class ProcessInstanceEntityStorage extends 
AbstractJPAStorageFetcher<Stri
         }
         errorEntity.setMessage(error.getErrorMessage());
         errorEntity.setNodeDefinitionId(error.getNodeDefinitionId());
+        errorEntity.setNodeInstanceId(error.getNodeInstanceId());
         pi.setState(CommonUtils.ERROR_STATE);
+        pi.getNodes().stream().filter(n -> 
n.getId().equals(error.getNodeInstanceId())).findAny().ifPresent(n -> 
n.setErrorMessage(error.getErrorMessage()));
     }
 
     private void indexNode(ProcessInstanceEntity pi, 
ProcessInstanceNodeEventBody data) {
@@ -186,6 +188,9 @@ public class ProcessInstanceEntityStorage extends 
AbstractJPAStorageFetcher<Stri
         nodeInstance.setName(body.getNodeName());
         nodeInstance.setType(body.getNodeType());
         nodeInstance.setSlaDueDate(toZonedDateTime(body.getSlaDueDate()));
+        if (body.isRetrigger() != null) {
+            nodeInstance.setRetrigger(body.isRetrigger());
+        }
         ZonedDateTime eventDate = toZonedDateTime(body.getEventDate());
         switch (body.getEventType()) {
             case EVENT_TYPE_ENTER:
@@ -220,6 +225,8 @@ public class ProcessInstanceEntityStorage extends 
AbstractJPAStorageFetcher<Stri
             pi.setCreatedBy(data.getEventUser());
         } else if (data.getEventType() == 
ProcessInstanceStateEventBody.EVENT_TYPE_ENDED) {
             pi.setEnd(toZonedDateTime(data.getEventDate()));
+        } else if (data.getEventType() == 
ProcessInstanceStateEventBody.EVENT_TYPE_RETRIGGERED) {
+            pi.setError(null);
         }
         pi.setBusinessKey(data.getBusinessKey());
         pi.setUpdatedBy(data.getEventUser());
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java
 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java
index f8f8c6674..9b7d736b0 100644
--- 
a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java
+++ 
b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java
@@ -109,7 +109,7 @@ public abstract class AbstractProcessInstanceStorageIT {
                 .hasSize(1);
 
         Assertions.assertThat(processInstance.getNodes().get(0))
-                .hasNoNullFieldsOrPropertiesExcept("exit", "slaDueDate")
+                .hasNoNullFieldsOrPropertiesExcept("exit", "slaDueDate", 
"errorMessage", "retrigger")
                 .hasFieldOrPropertyWithValue("name", "nodeName")
                 .hasFieldOrPropertyWithValue("type", "BoundaryEventNode")
                 .hasFieldOrPropertyWithValue("definitionId", nodeDefinitionId)
@@ -125,7 +125,7 @@ public abstract class AbstractProcessInstanceStorageIT {
                 .hasSize(1);
 
         Assertions.assertThat(processInstance.getNodes().get(0))
-                .hasNoNullFieldsOrPropertiesExcept("slaDueDate")
+                .hasNoNullFieldsOrPropertiesExcept("slaDueDate", 
"errorMessage", "retrigger")
                 .hasFieldOrPropertyWithValue("name", "nodeName")
                 .hasFieldOrPropertyWithValue("type", "BoundaryEventNode")
                 .hasFieldOrPropertyWithValue("definitionId", nodeDefinitionId)
diff --git 
a/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.1.1__retrigger.sql
 
b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.1.1__retrigger.sql
new file mode 100644
index 000000000..29ed23b06
--- /dev/null
+++ 
b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.1.1__retrigger.sql
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ALTER TABLE nodes ADD COLUMN retrigger boolean default false;
+ALTER TABLE nodes ADD COLUMN error_message varchar(4000);
+ALTER TABLE processes ADD COLUMN node_instance_id varchar(255);
diff --git 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java
 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java
index 5a66e6f29..ece0f99c9 100644
--- 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java
+++ 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java
@@ -283,6 +283,10 @@ public class ProcessInstanceEntity {
 
         Long slaDueDate;
 
+        private Boolean isRetrigger;
+
+        private String errorMessage;
+
         public String getId() {
             return id;
         }
@@ -363,6 +367,22 @@ public class ProcessInstanceEntity {
         public int hashCode() {
             return Objects.hash(id);
         }
+
+        public String getErrorMessage() {
+            return errorMessage;
+        }
+
+        public void setErrorMessage(String errorMessage) {
+            this.errorMessage = errorMessage;
+        }
+
+        public void setRetrigger(Boolean retrigger) {
+            this.isRetrigger = retrigger;
+        }
+
+        public Boolean isRetrigger() {
+            return isRetrigger;
+        }
     }
 
     public static class ProcessInstanceErrorEntity {
@@ -371,6 +391,8 @@ public class ProcessInstanceEntity {
 
         String message;
 
+        private String nodeInstanceId;
+
         public String getNodeDefinitionId() {
             return nodeDefinitionId;
         }
@@ -387,22 +409,30 @@ public class ProcessInstanceEntity {
             this.message = message;
         }
 
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-            ProcessInstanceErrorEntity that = (ProcessInstanceErrorEntity) o;
-            return Objects.equals(nodeDefinitionId, that.nodeDefinitionId) &&
-                    Objects.equals(message, that.message);
+        public String getNodeInstanceId() {
+            return nodeInstanceId;
+        }
+
+        public void setNodeInstanceId(String nodeInstanceId) {
+            this.nodeInstanceId = nodeInstanceId;
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(nodeDefinitionId, message);
+            return Objects.hash(message, nodeDefinitionId, nodeInstanceId);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            ProcessInstanceErrorEntity other = (ProcessInstanceErrorEntity) 
obj;
+            return Objects.equals(message, other.message) && 
Objects.equals(nodeDefinitionId, other.nodeDefinitionId)
+                    && Objects.equals(nodeInstanceId, other.nodeInstanceId);
         }
     }
 
diff --git 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java
 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java
index 18e674d57..cee3e65e8 100644
--- 
a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java
+++ 
b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java
@@ -149,6 +149,8 @@ public class ProcessInstanceEntityMapper implements 
MongoEntityMapper<ProcessIns
         instance.setExit(instantToZonedDateTime(entity.getExit()));
         instance.setDefinitionId(entity.getDefinitionId());
         instance.setSlaDueDate(instantToZonedDateTime(entity.getSlaDueDate()));
+        instance.setRetrigger(entity.isRetrigger());
+        instance.setErrorMessage(entity.getErrorMessage());
         return instance;
     }
 
@@ -166,6 +168,8 @@ public class ProcessInstanceEntityMapper implements 
MongoEntityMapper<ProcessIns
         entity.setExit(zonedDateTimeToInstant(instance.getExit()));
         entity.setDefinitionId(instance.getDefinitionId());
         entity.setSlaDueDate(zonedDateTimeToInstant(instance.getSlaDueDate()));
+        entity.setRetrigger(instance.isRetrigger());
+        entity.setErrorMessage(instance.getErrorMessage());
         return entity;
     }
 
@@ -176,6 +180,7 @@ public class ProcessInstanceEntityMapper implements 
MongoEntityMapper<ProcessIns
 
         ProcessInstanceError error = new ProcessInstanceError();
         error.setNodeDefinitionId(entity.getNodeDefinitionId());
+        error.setNodeInstanceId(entity.getNodeInstanceId());
         error.setMessage(entity.getMessage());
         return error;
     }
@@ -187,6 +192,7 @@ public class ProcessInstanceEntityMapper implements 
MongoEntityMapper<ProcessIns
 
         ProcessInstanceEntity.ProcessInstanceErrorEntity entity = new 
ProcessInstanceEntity.ProcessInstanceErrorEntity();
         entity.setNodeDefinitionId(error.getNodeDefinitionId());
+        entity.setNodeInstanceId(error.getNodeInstanceId());
         entity.setMessage(error.getMessage());
         return entity;
     }
diff --git 
a/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.1.1__retrigger.sql
 
b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.1.1__retrigger.sql
new file mode 100644
index 000000000..986203336
--- /dev/null
+++ 
b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.1.1__retrigger.sql
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ALTER TABLE nodes ADD COLUMN retrigger boolean default false, ADD COLUMN 
error_message VARCHAR(65535);
+ALTER TABLE processes ADD COLUMN node_instance_id VARCHAR(255);
diff --git 
a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
 
b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
index 3460ff5a2..c8d85199d 100644
--- 
a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
+++ 
b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto
@@ -179,6 +179,8 @@ message NodeInstance {
     /* @Field(store = Store.YES) */
     optional string nodeId = 7;
     optional int64 slaDueDate = 8;
+    optional bool retrigger = 9;
+    optional string errorMessage= 10;
 }
 
 /* @Indexed */
diff --git 
a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java
 
b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java
index f85043659..e4d43503d 100644
--- 
a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java
+++ 
b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java
@@ -94,7 +94,7 @@ public class KogitoAddonRuntimeClientImpl extends 
KogitoRuntimeCommonClient impl
             pInstance.abort();
 
             if (pInstance.status() == 
org.kie.kogito.process.ProcessInstance.STATE_ERROR) {
-                throw new ProcessInstanceExecutionException(pInstance.id(), 
pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage());
+                throw ProcessInstanceExecutionException.fromError(pInstance);
             } else {
                 return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "ABORT 
ProcessInstance with id: " + processInstance.getId());
             }
@@ -107,7 +107,7 @@ public class KogitoAddonRuntimeClientImpl extends 
KogitoRuntimeCommonClient impl
             pInstance.error().get().retrigger();
 
             if (pInstance.status() == 
org.kie.kogito.process.ProcessInstance.STATE_ERROR) {
-                throw new ProcessInstanceExecutionException(pInstance.id(), 
pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage());
+                throw ProcessInstanceExecutionException.fromError(pInstance);
             } else {
                 return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "RETRY 
ProcessInstance in error with id: " + processInstance.getId());
             }
@@ -120,7 +120,7 @@ public class KogitoAddonRuntimeClientImpl extends 
KogitoRuntimeCommonClient impl
             pInstance.error().get().skip();
 
             if (pInstance.status() == 
org.kie.kogito.process.ProcessInstance.STATE_ERROR) {
-                throw new ProcessInstanceExecutionException(pInstance.id(), 
pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage());
+                throw ProcessInstanceExecutionException.fromError(pInstance);
             } else {
                 return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "SKIP 
ProcessInstance in error with id: " + processInstance.getId());
             }
@@ -200,7 +200,7 @@ public class KogitoAddonRuntimeClientImpl extends 
KogitoRuntimeCommonClient impl
             pInstance.triggerNode(nodeDefinitionId);
 
             if (pInstance.status() == 
org.kie.kogito.process.ProcessInstance.STATE_ERROR) {
-                throw new ProcessInstanceExecutionException(pInstance.id(), 
pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage());
+                throw ProcessInstanceExecutionException.fromError(pInstance);
             } else {
                 return String.format(SUCCESSFULLY_OPERATION_MESSAGE,
                         "TRIGGER Node " + nodeDefinitionId + "from 
ProcessInstance with id: " + processInstance.getId());
@@ -214,7 +214,7 @@ public class KogitoAddonRuntimeClientImpl extends 
KogitoRuntimeCommonClient impl
             pInstance.retriggerNodeInstance(nodeInstanceId);
 
             if (pInstance.status() == 
org.kie.kogito.process.ProcessInstance.STATE_ERROR) {
-                throw new ProcessInstanceExecutionException(pInstance.id(), 
pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage());
+                throw ProcessInstanceExecutionException.fromError(pInstance);
             } else {
                 return String.format(SUCCESSFULLY_OPERATION_MESSAGE,
                         "RETRIGGER Node instance " + nodeInstanceId + "from 
ProcessInstance with id: " + processInstance.getId());
@@ -228,7 +228,7 @@ public class KogitoAddonRuntimeClientImpl extends 
KogitoRuntimeCommonClient impl
             pInstance.cancelNodeInstance(nodeInstanceId);
 
             if (pInstance.status() == 
org.kie.kogito.process.ProcessInstance.STATE_ERROR) {
-                throw new ProcessInstanceExecutionException(pInstance.id(), 
pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage());
+                throw ProcessInstanceExecutionException.fromError(pInstance);
             } else {
                 return String.format(SUCCESSFULLY_OPERATION_MESSAGE,
                         "CANCEL Node instance " + nodeInstanceId + "from 
ProcessInstance with id: " + processInstance.getId());
diff --git 
a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java
 
b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java
index 43f9846bd..5e7dbc9cd 100644
--- 
a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java
+++ 
b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java
@@ -212,7 +212,7 @@ public class KogitoAddonRuntimeClientImplTest {
         mockProcessInstanceStatusError().abort();
         assertThrows(ProcessInstanceExecutionException.class,
                 () -> client.abortProcessInstance(SERVICE_URL, pI));
-        verify(processInstance, times(2)).error();
+        verify(processInstance, times(1)).error();
         verify(processInstance, times(1)).abort();
     }
 


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


Reply via email to