Hi, I am currently write a REST API to let user search task data using various condition.Some of them are:
- Task start time/ last update time
- Task name
- Process start time
- Process name
Currently, in order to filter task based on its process' values, I have to get all data and loop through them one by one to get process instance from each task, and then check the value. This obviously has bad performance. I wonder if there is any better way to do it?
My current code for finished data is as below:
private int startIndex = 0 private int maxResults = Integer.MAX_VALUE SearchOptionsBuilder archivedHumanTaskSearchOptionsBuilder = new SearchOptionsBuilder(startIndex, maxResults) SearchOptions archivedHumanTaskSearchOptions = archivedHumanTaskSearchOptionsBuilder.done() def archivedHumanTaskResult = processAPI.searchArchivedHumanTasks(archivedHumanTaskSearchOptions) def archivedHumanTask = archivedHumanTaskResult.result; for(def task in archivedHumanTask){ SearchOptionsBuilder archivedFlowNodeSearchOptionsBuilder = new SearchOptionsBuilder(startIndex, maxResults) .filter(ArchivedFlowNodeInstanceSearchDescriptor.ROOT_PROCESS_INSTANCE_ID, task.processInstanceId) .filter(ArchivedFlowNodeInstanceSearchDescriptor.NAME, task.name) .filter(ArchivedFlowNodeInstanceSearchDescriptor.STATE_NAME, "ready"); SearchOptions archivedFlowNodeSearchOptions = archivedFlowNodeSearchOptionsBuilder.done() def archivedFlowNodeResult = processAPI.searchArchivedFlowNodeInstances(archivedFlowNodeSearchOptions) def archivedFlowNodeInstance = archivedFlowNodeResult.result.find { it.getSourceObjectId() == task.getSourceObjectId()} if (!archivedFlowNodeInstance){ continue } def startDate = (((archivedFlowNodeResult.count > 0) ? archivedFlowNodeResult.result[0].getReachedStateDate() : task.getReachedStateDate())?.format(dateFormat2) ?: ""); def endDate = (task.getArchiveDate()?.format(dateFormat2) ?: ""); def lastDate = (task.getLastUpdateDate()?.format(dateFormat2) ?: ""); if ( startDate == "" && endDate == "" && lastDate == "" ) { continue } if(startDate > dateTo || (endDate == "" ? lastDate : endDate) < dateFrom) { continue } // Create Search Option SearchOptionsBuilder archivedProcessInstanceSearchOptionsBuilder = new SearchOptionsBuilder(startIndex, maxResults) .filter(ArchivedProcessInstancesSearchDescriptor.SOURCE_OBJECT_ID, task.getProcessInstanceId()) SearchOptions archivedProcessInstanceSearchOptions = archivedProcessInstanceSearchOptionsBuilder.done() def archivedProcessInstanceResult = processAPI.searchArchivedProcessInstances(archivedProcessInstanceSearchOptions) if(archivedProcessInstanceResult != null && archivedProcessInstanceResult.count > 0){ def processInstance = archivedProcessInstanceResult.result[0] def process = processAPI.getProcessDefinition(processInstance.getProcessDefinitionId()) if(processName?.trim() != "" && !processName?.trim().equalsIgnoreCase(process.getName())){ continue; } // Do something } }
dateFrom, dateTo, processName is search value.