How to search task data quickly in Groovy script

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.