### Eclipse Workspace Patch 1.0 #P jbpm4 Index: modules/pvm/src/main/java/org/jbpm/pvm/internal/query/JobQueryImpl.java =================================================================== --- modules/pvm/src/main/java/org/jbpm/pvm/internal/query/JobQueryImpl.java (revision 6478) +++ modules/pvm/src/main/java/org/jbpm/pvm/internal/query/JobQueryImpl.java (working copy) @@ -25,6 +25,7 @@ import org.hibernate.Query; import org.jbpm.api.JobQuery; +import org.jbpm.api.QueryOperand; import org.jbpm.api.job.Job; import org.jbpm.pvm.internal.job.JobImpl; import org.jbpm.pvm.internal.job.MessageImpl; @@ -43,6 +44,8 @@ protected boolean timersOnly = false; protected String processInstanceId = null; protected Boolean exception; + + public String hql() { StringBuilder hql = new StringBuilder(); @@ -65,8 +68,14 @@ hql.append(" j "); if (processInstanceId!=null) { - appendWhereClause("j.processInstance.id = '"+processInstanceId+"' ", hql); - } + QueryOperand operand = getOperand(processInstanceId); + if (operand == QueryOperand.IN || operand == QueryOperand.NOT_IN) { + appendWhereClause("j.processInstance.id "+operand+" "+processInstanceId+" ", hql); + } else { + appendWhereClause("j.processInstance.id "+operand+" '"+processInstanceId+"' ", hql); + } + } + if (exception!=null) { if (exception) { @@ -126,4 +135,10 @@ this.processInstanceId = processInstanceId; return this; } + + public String operand(String parameter, QueryOperand operand) { + parameterOperands.put(parameter, operand); + + return parameter; + } } Index: modules/api/src/main/java/org/jbpm/api/QueryOperand.java =================================================================== --- modules/api/src/main/java/org/jbpm/api/QueryOperand.java (revision 0) +++ modules/api/src/main/java/org/jbpm/api/QueryOperand.java (revision 0) @@ -0,0 +1,25 @@ +package org.jbpm.api; + + +public enum QueryOperand { + + EQUALS(0, "="), + LIKE(1, "like"), + IN(2, "in"), + NOT_IN(3, "not in"); + + private int id; + private String value; + + QueryOperand(int id, String value) { + this.id = id; + this.value = value; + } + + @Override + public String toString() { + return this.value; + } + + +} Property changes on: modules\api\src\main\java\org\jbpm\api\QueryOperand.java ___________________________________________________________________ Added: svn:keywords + Id Revision Added: svn:eol-style + LF Index: modules/test-db/src/test/java/org/jbpm/test/query/JobQueryTest.java =================================================================== --- modules/test-db/src/test/java/org/jbpm/test/query/JobQueryTest.java (revision 6403) +++ modules/test-db/src/test/java/org/jbpm/test/query/JobQueryTest.java (working copy) @@ -26,6 +26,7 @@ import java.util.List; import org.jbpm.api.JobQuery; +import org.jbpm.api.QueryOperand; import org.jbpm.api.job.Job; import org.jbpm.test.JbpmTestCase; import org.jbpm.test.assertion.QueryAssertions; @@ -143,6 +144,38 @@ } + public void testProcessIdLike() { + startTestProcessInstances(6); + + JobQuery query = managementService.createJobQuery(); + assertEquals(6, query.processInstanceId(query.operand("TimerQueryTest%", QueryOperand.LIKE)).count()); + + } + + public void testProcessIdEquals() { + List procInstIds = startTestProcessInstances(6); + + JobQuery query = managementService.createJobQuery(); + assertEquals(1, query.processInstanceId(query.operand(procInstIds.get(0), QueryOperand.EQUALS)).count()); + + } + + public void testProcessIdIn() { + List procInstIds = startTestProcessInstances(6); + + JobQuery query = managementService.createJobQuery(); + assertEquals(2, query.processInstanceId(query.operand("('"+procInstIds.get(0)+"','"+procInstIds.get(1)+"' )", QueryOperand.IN)).count()); + + } + + public void testProcessIdNotIn() { + List procInstIds = startTestProcessInstances(6); + + JobQuery query = managementService.createJobQuery(); + assertEquals(4, query.processInstanceId(query.operand("('"+procInstIds.get(0)+"','"+procInstIds.get(1)+"' )", QueryOperand.NOT_IN)).count()); + + } + private List startTestProcessInstances(int nrOfInstances) { deployJpdlXmlString( "" + Index: modules/pvm/src/main/java/org/jbpm/pvm/internal/query/AbstractQuery.java =================================================================== --- modules/pvm/src/main/java/org/jbpm/pvm/internal/query/AbstractQuery.java (revision 6426) +++ modules/pvm/src/main/java/org/jbpm/pvm/internal/query/AbstractQuery.java (working copy) @@ -22,12 +22,14 @@ package org.jbpm.pvm.internal.query; import java.io.ObjectStreamException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.hibernate.Query; import org.hibernate.Session; - import org.jbpm.api.JbpmException; +import org.jbpm.api.QueryOperand; import org.jbpm.api.cmd.Command; import org.jbpm.api.cmd.Environment; import org.jbpm.pvm.internal.cmd.CommandService; @@ -47,6 +49,8 @@ protected boolean count; protected boolean uniqueResult; + protected Map parameterOperands = new HashMap(); + protected abstract void applyParameters(Query query); public abstract String hql(); @@ -155,6 +159,13 @@ this.commandService = null; return this; } + + protected QueryOperand getOperand(String param) { + if (parameterOperands.containsKey(param)) { + return parameterOperands.get(param); + } + return QueryOperand.EQUALS; + } public void setCommandService(CommandService commandService) { this.commandService = commandService; Index: modules/api/src/main/java/org/jbpm/api/JobQuery.java =================================================================== --- modules/api/src/main/java/org/jbpm/api/JobQuery.java (revision 6478) +++ modules/api/src/main/java/org/jbpm/api/JobQuery.java (working copy) @@ -49,6 +49,9 @@ /** only select jobs related to the given process instance */ JobQuery processInstanceId(String processInstanceId); + + /** allows to specify query operand for given parameter value*/ + String operand(String parameter, QueryOperand operand); /** only select jobs that were rolled back due to an exception */ JobQuery exception(boolean hasException);