Skip to content

Commit

Permalink
Added bulk remove for all related entities in PROCESS_DELETED event h…
Browse files Browse the repository at this point in the history
…andler
  • Loading branch information
igdianov committed Oct 2, 2024
1 parent 2561d12 commit db33b4c
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,15 @@
import org.activiti.cloud.api.process.model.events.CloudProcessDeletedEvent;
import org.activiti.cloud.services.query.model.BPMNActivityEntity;
import org.activiti.cloud.services.query.model.BPMNSequenceFlowEntity;
import org.activiti.cloud.services.query.model.IntegrationContextEntity;
import org.activiti.cloud.services.query.model.ProcessInstanceEntity;
import org.activiti.cloud.services.query.model.ProcessVariableEntity;
import org.activiti.cloud.services.query.model.QueryException;
import org.activiti.cloud.services.query.model.ServiceTaskEntity;
import org.activiti.cloud.services.query.model.TaskCandidateGroupEntity;
import org.activiti.cloud.services.query.model.TaskCandidateUserEntity;
import org.activiti.cloud.services.query.model.TaskEntity;
import org.activiti.cloud.services.query.model.TaskVariableEntity;

public class ProcessDeletedEventHandler implements QueryEventHandler {

Expand Down Expand Up @@ -60,8 +64,28 @@ public void handle(CloudRuntimeEvent<?, ?> event) {
);

if (ALLOWED_STATUS.contains(processInstanceEntity.getStatus())) {
remove(
TaskCandidateUserEntity.class,
"taskId",
TaskEntity.class,
"id",
"processInstanceId",
eventProcessInstanceId
);

remove(
TaskCandidateGroupEntity.class,
"taskId",
TaskEntity.class,
"id",
"processInstanceId",
eventProcessInstanceId
);

remove(TaskVariableEntity.class, "processInstanceId", eventProcessInstanceId);
remove(TaskEntity.class, "processInstanceId", eventProcessInstanceId);
remove(ProcessVariableEntity.class, "processInstanceId", eventProcessInstanceId);
remove(IntegrationContextEntity.class, "processInstanceId", eventProcessInstanceId);
remove(ServiceTaskEntity.class, "processInstanceId", eventProcessInstanceId);
remove(BPMNActivityEntity.class, "processInstanceId", eventProcessInstanceId);
remove(BPMNSequenceFlowEntity.class, "processInstanceId", eventProcessInstanceId);
Expand All @@ -88,6 +112,33 @@ <T> void remove(Class<T> entityClass, String attributeName, Object attributeValu
entityManager.createQuery(delete).executeUpdate();
}

<P, T> void remove(
Class<T> entityClass,
String attributeName,
Class<P> parentClass,
String parentIdAttribute,
String parentAttributeName,
Object parentAttributeValue
) {
var criteriaBuilder = entityManager.getCriteriaBuilder();

var parentQuery = criteriaBuilder.createQuery(Object.class);
var parentFrom = parentQuery.from(parentClass);
parentQuery.select(parentFrom.get(parentIdAttribute));
parentQuery.where(criteriaBuilder.equal(parentFrom.get(parentAttributeName), parentAttributeValue));

var parentIds = entityManager.createQuery(parentQuery).getResultList();

if (!parentIds.isEmpty()) {
var delete = criteriaBuilder.createCriteriaDelete(entityClass);
var from = delete.from(entityClass);

delete.where(from.get(attributeName).in(parentIds));

entityManager.createQuery(delete).executeUpdate();
}
}

@Override
public String getHandledEvent() {
return ProcessRuntimeEvent.ProcessEvents.PROCESS_DELETED.name();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ public void shouldGetAdminProcessInfo() {
@Test
public void shouldDeleteProcessInfo() {
//given
ProcessInstance process = processInstanceBuilder.aRunningProcessInstance("running");
ProcessInstance process = processInstanceBuilder.startSimpleProcessInstance("simple");

eventsAggregator.sendAll();

Expand Down

0 comments on commit db33b4c

Please # to comment.