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]