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

@@ -111,8 +111,8 @@
"description": "${workflowInstance.description}", "description": "${workflowInstance.description}",
"message": "${workflowInstance.message}", "message": "${workflowInstance.message}",
"isActive": ${workflowInstance.isActive?string}, "isActive": ${workflowInstance.isActive?string},
"priority": ${workflowInstance.priority?c},
"startDate": "${workflowInstance.startDate}", "startDate": "${workflowInstance.startDate}",
"priority": <#if workflowInstance.priority??>${workflowInstance.priority?c}<#else>0</#if>,
"endDate": <#if workflowInstance.endDate??>"${workflowInstance.endDate}"<#else>null</#if>, "endDate": <#if workflowInstance.endDate??>"${workflowInstance.endDate}"<#else>null</#if>,
"dueDate": <#if workflowInstance.dueDate??>"${workflowInstance.dueDate}"<#else>null</#if>, "dueDate": <#if workflowInstance.dueDate??>"${workflowInstance.dueDate}"<#else>null</#if>,
"context": <#if workflowInstance.context??>"${workflowInstance.context}"<#else>null</#if>, "context": <#if workflowInstance.context??>"${workflowInstance.context}"<#else>null</#if>,

View File

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

View File

@@ -22,7 +22,6 @@ import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; 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_TITLE, workflowInstance.getDefinition().getTitle());
model.put(TASK_WORKFLOW_INSTANCE_DESCRIPTION, workflowInstance.getDefinition().getDescription()); model.put(TASK_WORKFLOW_INSTANCE_DESCRIPTION, workflowInstance.getDefinition().getDescription());
model.put(TASK_WORKFLOW_INSTANCE_IS_ACTIVE, workflowInstance.isActive()); 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())); model.put(TASK_WORKFLOW_INSTANCE_DEFINITION_URL, getUrl(workflowInstance.getDefinition()));
if (workflowInstance.getWorkflowPackage() != null) if (workflowInstance.getWorkflowPackage() != null)
@@ -256,6 +256,15 @@ public class WorkflowModelBuilder
{ {
model.put(TASK_WORKFLOW_INSTANCE_START_DATE, ISO8601DateFormat.format(workflowInstance.getStartDate())); 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) 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))); 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(); String message = workflowInstance.getDescription();
if (message != null && message.length() > 0) if (message != null && message.length() > 0)
{ {
@@ -302,31 +307,11 @@ public class WorkflowModelBuilder
{ {
Map<String, Object> model = buildSimple(workflowInstance); Map<String, Object> model = buildSimple(workflowInstance);
Serializable dueDate = null;
Serializable priority = null;
Serializable startTaskId = null; Serializable startTaskId = null;
WorkflowTask startTask = getStartTaskForWorkflow(workflowInstance); WorkflowTask startTask = getStartTaskForWorkflow(workflowInstance);
if (startTask != null) if (startTask != null)
{ {
startTaskId = startTask.id; 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); model.put(TASK_WORKFLOW_INSTANCE_START_TASK_INSTANCE_ID, startTaskId);