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-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 1125f99ab0 Fix for issue #4038 (#4039)
1125f99ab0 is described below

commit 1125f99ab0b2e322ac622f53d96a0fe92a65d1f5
Author: Yohann Puyhaubert <[email protected]>
AuthorDate: Tue Aug 26 12:52:03 2025 +0200

    Fix for issue #4038 (#4039)
    
    Provide findByBusinessKey implementation for MongoDB
    
    (cherry picked from commit 9fd624538c5801b2ee6bbd5b78a46629b9cb23e0)
---
 .../kogito/mongodb/MongoDBProcessInstances.java    | 21 ++++++++++++------
 .../kogito/mongodb/utils/DocumentConstants.java    |  2 ++
 .../kogito/mongodb/MongoDBProcessInstancesIT.java  | 25 ++++++++++++++++------
 3 files changed, 35 insertions(+), 13 deletions(-)

diff --git 
a/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
 
b/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
index bc5046b698..8e82ce0ccd 100644
--- 
a/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
+++ 
b/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/MongoDBProcessInstances.java
@@ -57,6 +57,8 @@ import com.mongodb.client.model.IndexOptions;
 import com.mongodb.client.model.Indexes;
 import com.mongodb.client.result.UpdateResult;
 
+import static 
org.kie.kogito.mongodb.utils.DocumentConstants.PROCESS_BUSINESS_KEY;
+import static 
org.kie.kogito.mongodb.utils.DocumentConstants.PROCESS_BUSINESS_KEY_INDEX;
 import static 
org.kie.kogito.mongodb.utils.DocumentConstants.PROCESS_INSTANCE_ID;
 import static 
org.kie.kogito.mongodb.utils.DocumentConstants.PROCESS_INSTANCE_ID_INDEX;
 
@@ -91,9 +93,12 @@ public class MongoDBProcessInstances<T extends Model> 
implements MutableProcessI
 
     @Override
     public Optional<ProcessInstance<T>> findById(String id, 
ProcessInstanceReadMode mode) {
-        return find(id).map(piDoc -> {
-            return (AbstractProcessInstance<T>) unmarshall(piDoc, mode);
-        });
+        return find(id, PROCESS_INSTANCE_ID).map(piDoc -> unmarshall(piDoc, 
mode));
+    }
+
+    @Override
+    public Optional<ProcessInstance<T>> findByBusinessKey(String id, 
ProcessInstanceReadMode mode) {
+        return find(id, PROCESS_BUSINESS_KEY).map(piDoc -> unmarshall(piDoc, 
mode));
     }
 
     @Override
@@ -193,14 +198,14 @@ public class MongoDBProcessInstances<T extends Model> 
implements MutableProcessI
         }
     }
 
-    private Optional<Document> find(String id) {
+    private Optional<Document> find(String id, String key) {
         ClientSession clientSession = transactionManager.getClientSession();
-        return Optional.ofNullable((clientSession != null ? 
collection.find(clientSession, Filters.eq(PROCESS_INSTANCE_ID, id)) : 
collection.find(Filters.eq(PROCESS_INSTANCE_ID, id))).first());
+        return Optional.ofNullable((clientSession != null ? 
collection.find(clientSession, Filters.eq(key, id)) : 
collection.find(Filters.eq(key, id))).first());
     }
 
     @Override
     public boolean exists(String id) {
-        return find(id).isPresent();
+        return find(id, PROCESS_INSTANCE_ID).isPresent();
     }
 
     @Override
@@ -216,7 +221,7 @@ public class MongoDBProcessInstances<T extends Model> 
implements MutableProcessI
     }
 
     private void connectProcessInstance(ProcessInstance<T> instance, String 
id) {
-        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(() -> 
find(id).map(reloaded -> {
+        ((AbstractProcessInstance<?>) 
instance).internalSetReloadSupplier(marshaller.createdReloadFunction(() -> 
find(id, PROCESS_INSTANCE_ID).map(reloaded -> {
             setVersion(instance, reloaded.getLong(VERSION));
             return reloaded.toJson().getBytes();
         }).orElseThrow(() -> new IllegalArgumentException("process instance id 
" + id + " does not exists in mongodb"))));
@@ -242,6 +247,8 @@ public class MongoDBProcessInstances<T extends Model> 
implements MutableProcessI
         //Index creation (if the index already exists it is a no-op)
         collection.createIndex(Indexes.ascending(PROCESS_INSTANCE_ID),
                 new 
IndexOptions().unique(true).name(PROCESS_INSTANCE_ID_INDEX).background(true));
+        collection.createIndex(Indexes.ascending(PROCESS_BUSINESS_KEY),
+                new 
IndexOptions().name(PROCESS_BUSINESS_KEY_INDEX).background(true));
         return collection;
     }
 }
diff --git 
a/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/utils/DocumentConstants.java
 
b/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/utils/DocumentConstants.java
index 6b5694f350..2b98302107 100644
--- 
a/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/utils/DocumentConstants.java
+++ 
b/addons/common/persistence/mongodb/src/main/java/org/kie/kogito/mongodb/utils/DocumentConstants.java
@@ -24,7 +24,9 @@ public class DocumentConstants {
     public static final String VALUE = "value";
     public static final String DOCUMENT_ID = "_id";
     public static final String PROCESS_INSTANCE_ID = "id";
+    public static final String PROCESS_BUSINESS_KEY = "businessKey";
     public static final String PROCESS_INSTANCE_ID_INDEX = 
"index_process_instance_id";
+    public static final String PROCESS_BUSINESS_KEY_INDEX = 
"index_process_instance_business_key";
     public static final String STRATEGIES = "strategies";
     public static final String NAME = "name";
     public static final String PROCESS_INSTANCE = "processInstance";
diff --git 
a/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/MongoDBProcessInstancesIT.java
 
b/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/MongoDBProcessInstancesIT.java
index a7f28c6fdf..694b98b371 100644
--- 
a/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/MongoDBProcessInstancesIT.java
+++ 
b/addons/common/persistence/mongodb/src/test/java/org/kie/kogito/mongodb/MongoDBProcessInstancesIT.java
@@ -199,27 +199,31 @@ class MongoDBProcessInstancesIT {
                 .map(Document.class::cast)
                 .filter(index -> ((Document) 
index).get("name").equals(DocumentConstants.PROCESS_INSTANCE_ID_INDEX))
                 .findFirst()).isPresent();
+        
assertThat(StreamSupport.stream(mongoDBProcessInstances.getCollection().listIndexes().spliterator(),
 false)
+                .map(Document.class::cast)
+                .filter(index -> ((Document) 
index).get("name").equals(DocumentConstants.PROCESS_BUSINESS_KEY_INDEX))
+                .findFirst()).isPresent();
     }
 
     @Test
-    void testFindByIdReadMode() {
+    void testFindByIdAndBusinessKeyReadMode() {
         AbstractTransactionManager transactionManager = new 
AbstractTransactionManager(mongoClient, false) {
         };
 
-        testFindByIdReadMode(transactionManager);
+        testFindByIdAndBusinessKeyReadMode(transactionManager);
     }
 
     @Test
-    void testFindByIdReadModeWithTransaction() {
+    void testFindByIdAndBusinessKeyReadModeWithTransaction() {
         AbstractTransactionManager transactionManager = new 
AbstractTransactionManager(mongoClient, true) {
         };
 
         transactionManager.onBeforeStartEvent(new UnitOfWorkStartEvent(null));
-        testFindByIdReadMode(transactionManager);
+        testFindByIdAndBusinessKeyReadMode(transactionManager);
         transactionManager.onAfterEndEvent(new UnitOfWorkEndEvent(null));
     }
 
-    void testFindByIdReadMode(AbstractTransactionManager transactionManager) {
+    void testFindByIdAndBusinessKeyReadMode(AbstractTransactionManager 
transactionManager) {
         BpmnProcess process = createProcess(transactionManager, 
"BPMN2-UserTask-Script.bpmn2");
         // workaround as BpmnProcess does not compile the scripts but just 
reads the xml
         for (Node node : ((WorkflowProcess) process.process()).getNodes()) {
@@ -232,7 +236,7 @@ class MongoDBProcessInstancesIT {
             }
         }
 
-        ProcessInstance<BpmnVariables> mutablePi = 
process.createInstance(BpmnVariables.create(Collections.singletonMap("var", 
"value")));
+        ProcessInstance<BpmnVariables> mutablePi = 
process.createInstance("bk-1", 
BpmnVariables.create(Collections.singletonMap("var", "value")));
         mutablePi.start();
         assertThat(mutablePi.status()).isEqualTo(STATE_ERROR);
         assertThat(mutablePi.error()).hasValueSatisfying(error -> {
@@ -255,6 +259,15 @@ class MongoDBProcessInstancesIT {
         
assertThat(readOnlyPi.variables().toMap()).containsExactly(entry("var", 
"value"));
         
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> 
readOnlyPi.abort());
 
+        ProcessInstance<BpmnVariables> readOnlyPiByBk = 
instances.findByBusinessKey(mutablePi.businessKey(), 
ProcessInstanceReadMode.READ_ONLY).get();
+        assertThat(readOnlyPiByBk.status()).isEqualTo(STATE_ERROR);
+        assertThat(readOnlyPiByBk.error()).hasValueSatisfying(error -> {
+            
assertThat(error.errorMessage()).contains("java.lang.NullPointerException");
+            assertThat(error.failedNodeId()).isEqualTo("ScriptTask_1");
+        });
+        
assertThat(readOnlyPiByBk.variables().toMap()).containsExactly(entry("var", 
"value"));
+        
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> 
readOnlyPiByBk.abort());
+
         instances.findById(mutablePi.id()).get().abort();
         assertEmpty(instances);
     }


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

Reply via email to