Performance improvement for GET workflow-instances REST API.

Added "priority" and "dueDate" to WorkflowInstance object, which means a query for the workflow start task is no longer required to retrieve this information. A query was previously being done for every row in the results.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@22210 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gavin Cornwell
2010-09-02 21:17:57 +00:00
parent edc658958d
commit 5f2858c986
3 changed files with 19 additions and 34 deletions

View File

@@ -25,11 +25,9 @@ import java.util.List;
import java.util.Map;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowInstance;
import org.alfresco.service.cmr.workflow.WorkflowTask;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;
@@ -165,8 +163,7 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript
}
else if (key.equals(PARAM_DUE_BEFORE))
{
WorkflowTask startTask = modelBuilder.getStartTaskForWorkflow(workflowInstance);
Date dueDate = (Date)startTask.getProperties().get(WorkflowModel.PROP_WORKFLOW_DUE_DATE);
Date dueDate = workflowInstance.getDueDate();
if (!isDateMatchForFilter(dueDate, filterValue, true))
{
@@ -176,8 +173,7 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript
}
else if (key.equals(PARAM_DUE_AFTER))
{
WorkflowTask startTask = modelBuilder.getStartTaskForWorkflow(workflowInstance);
Date dueDate = (Date)startTask.getProperties().get(WorkflowModel.PROP_WORKFLOW_DUE_DATE);
Date dueDate = workflowInstance.getDueDate();
if (!isDateMatchForFilter(dueDate, filterValue, false))
{
@@ -246,9 +242,13 @@ public class WorkflowInstancesGet extends AbstractWorkflowWebscript
}
else if (key.equals(PARAM_PRIORITY))
{
WorkflowTask startTask = modelBuilder.getStartTaskForWorkflow(workflowInstance);
String priority = "0";
if (workflowInstance.getPriority() != null)
{
priority = workflowInstance.getPriority().toString();
}
if (startTask == null || !filterValue.equals(startTask.getProperties().get(WorkflowModel.PROP_WORKFLOW_PRIORITY).toString()))
if (!filterValue.equals(priority))
{
result = false;
break;

View File

@@ -22,7 +22,6 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -236,6 +235,7 @@ public class WorkflowModelBuilder
model.put(TASK_WORKFLOW_INSTANCE_TITLE, workflowInstance.getDefinition().getTitle());
model.put(TASK_WORKFLOW_INSTANCE_DESCRIPTION, workflowInstance.getDefinition().getDescription());
model.put(TASK_WORKFLOW_INSTANCE_IS_ACTIVE, workflowInstance.isActive());
model.put(TASK_WORKFLOW_INSTANCE_PRIORITY, workflowInstance.getPriority());
model.put(TASK_WORKFLOW_INSTANCE_DEFINITION_URL, getUrl(workflowInstance.getDefinition()));
if (workflowInstance.getWorkflowPackage() != null)
@@ -256,6 +256,15 @@ public class WorkflowModelBuilder
{
model.put(TASK_WORKFLOW_INSTANCE_START_DATE, ISO8601DateFormat.format(workflowInstance.getStartDate()));
}
if (workflowInstance.getDueDate() == null)
{
model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, workflowInstance.getDueDate());
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, ISO8601DateFormat.format(workflowInstance.getDueDate()));
}
if (workflowInstance.getEndDate() == null)
{
@@ -275,10 +284,6 @@ public class WorkflowModelBuilder
model.put(TASK_WORKFLOW_INSTANCE_INITIATOR, getPersonModel(nodeService.getProperty(workflowInstance.initiator, ContentModel.PROP_USERNAME)));
}
// TODO: Try and retrieve these from the workflow instance to save the need to
// do an extra query which makes things slow
model.put(TASK_WORKFLOW_INSTANCE_PRIORITY, 2);
model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, null);
String message = workflowInstance.getDescription();
if (message != null && message.length() > 0)
{
@@ -302,31 +307,11 @@ public class WorkflowModelBuilder
{
Map<String, Object> model = buildSimple(workflowInstance);
Serializable dueDate = null;
Serializable priority = null;
Serializable startTaskId = null;
WorkflowTask startTask = getStartTaskForWorkflow(workflowInstance);
if (startTask != null)
{
startTaskId = startTask.id;
dueDate = startTask.properties.get(WorkflowModel.PROP_WORKFLOW_DUE_DATE);
priority = startTask.properties.get(WorkflowModel.PROP_WORKFLOW_PRIORITY);
}
if (dueDate != null)
{
model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, ISO8601DateFormat.format((Date) dueDate));
}
else
{
model.put(TASK_WORKFLOW_INSTANCE_DUE_DATE, dueDate);
}
if (priority != null)
{
model.put(TASK_WORKFLOW_INSTANCE_PRIORITY, priority);
}
model.put(TASK_WORKFLOW_INSTANCE_START_TASK_INSTANCE_ID, startTaskId);