Skip to content

Commit 595771f

Browse files
vzicknerfiliphr
authored andcommitted
Add support for querying by scopeIds and elementIds to JobQuery (#4251)
(cherry picked from commit 627f574)
1 parent 0ca3ed2 commit 595771f

13 files changed

Lines changed: 666 additions & 1 deletion

File tree

modules/flowable-engine/src/test/java/org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.java

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525

2626
import org.flowable.common.engine.api.FlowableException;
27+
import org.flowable.common.engine.api.FlowableIllegalArgumentException;
2728
import org.flowable.common.engine.api.scope.ScopeTypes;
2829
import org.flowable.common.engine.impl.interceptor.Command;
2930
import org.flowable.common.engine.impl.interceptor.CommandContext;
@@ -198,6 +199,102 @@ public void testQueryByElementId() {
198199

199200
}
200201

202+
@Test
203+
@Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml")
204+
public void testQueryByElementIds() {
205+
ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest");
206+
ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest");
207+
208+
// both element ids -> all four jobs (two per instance)
209+
assertThat(managementService.createExternalWorkerJobQuery()
210+
.elementIds(List.of("externalOrder", "externalCustomer1")).count()).isEqualTo(4);
211+
212+
// single element id -> one per instance
213+
assertThat(managementService.createExternalWorkerJobQuery()
214+
.elementIds(List.of("externalOrder")).list())
215+
.extracting(ExternalWorkerJob::getProcessInstanceId)
216+
.containsExactlyInAnyOrder(processInstance1.getId(), processInstance2.getId());
217+
218+
assertThat(managementService.createExternalWorkerJobQuery()
219+
.elementIds(List.of("invalid")).count()).isZero();
220+
221+
// empty collection is ignored (the filter is not applied)
222+
assertThat(managementService.createExternalWorkerJobQuery()
223+
.elementIds(Collections.emptyList()).count())
224+
.isEqualTo(managementService.createExternalWorkerJobQuery().count());
225+
226+
assertThatThrownBy(() -> managementService.createExternalWorkerJobQuery().elementIds(null))
227+
.isExactlyInstanceOf(FlowableIllegalArgumentException.class);
228+
}
229+
230+
@Test
231+
@Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml")
232+
public void testOrQueryByElementIds() {
233+
ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest");
234+
ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("externalWorkerJobQueryTest");
235+
236+
// AND (processInstanceId) + OR (elementIds): only processInstance1's two jobs
237+
List<ExternalWorkerJob> jobs = managementService.createExternalWorkerJobQuery()
238+
.processInstanceId(processInstance1.getId())
239+
.or()
240+
.elementIds(List.of("externalOrder", "externalCustomer1"))
241+
.endOr()
242+
.list();
243+
assertThat(jobs).hasSize(2);
244+
assertThat(jobs).extracting(ExternalWorkerJob::getProcessInstanceId)
245+
.containsOnly(processInstance1.getId());
246+
247+
// OR (jobId OR elementIds): orderJob1 by id, plus every "externalCustomer1" job by element
248+
ExternalWorkerJob orderJob1 = managementService.createExternalWorkerJobQuery()
249+
.processInstanceId(processInstance1.getId())
250+
.elementId("externalOrder")
251+
.singleResult();
252+
jobs = managementService.createExternalWorkerJobQuery()
253+
.or()
254+
.jobId(orderJob1.getId())
255+
.elementIds(List.of("externalCustomer1"))
256+
.endOr()
257+
.list();
258+
assertThat(jobs).extracting(ExternalWorkerJob::getElementId)
259+
.containsExactlyInAnyOrder("externalOrder", "externalCustomer1", "externalCustomer1");
260+
assertThat(jobs).extracting(ExternalWorkerJob::getProcessInstanceId)
261+
.contains(processInstance1.getId(), processInstance2.getId());
262+
}
263+
264+
@Test
265+
public void testQueryByScopeIds() {
266+
// covers the SCOPE_ID_ block of ExternalWorkerJob.xml, which the elementIds tests do not exercise
267+
ExternalWorkerJobEntity job1 = createExternalWorkerJobWithScope("agent", "scope1", "element1");
268+
ExternalWorkerJobEntity job2 = createExternalWorkerJobWithScope("agent", null, "element2");
269+
270+
assertThat(managementService.createExternalWorkerJobQuery().scopeIds(List.of("scope1")).count()).isEqualTo(1);
271+
assertThat(managementService.createExternalWorkerJobQuery().scopeIds(List.of("scope1", "scope2")).count()).isEqualTo(1);
272+
assertThat(managementService.createExternalWorkerJobQuery().scopeIds(List.of("unknown")).count()).isZero();
273+
274+
// scopeIds OR elementIds inside an or()
275+
assertThat(managementService.createExternalWorkerJobQuery().or()
276+
.scopeIds(List.of("scope1"))
277+
.elementIds(List.of("element2"))
278+
.endOr().list())
279+
.extracting(Job::getId)
280+
.containsExactlyInAnyOrder(job1.getId(), job2.getId());
281+
282+
// empty collection is ignored (the filter is not applied)
283+
assertThat(managementService.createExternalWorkerJobQuery().scopeIds(new ArrayList<>()).count())
284+
.isEqualTo(managementService.createExternalWorkerJobQuery().count());
285+
286+
assertThatThrownBy(() -> managementService.createExternalWorkerJobQuery().scopeIds(null))
287+
.isExactlyInstanceOf(FlowableIllegalArgumentException.class);
288+
289+
managementService.executeCommand(commandContext -> {
290+
ExternalWorkerJobEntityManager externalWorkerJobEntityManager = CommandContextUtil.getProcessEngineConfiguration(commandContext)
291+
.getJobServiceConfiguration().getExternalWorkerJobEntityManager();
292+
externalWorkerJobEntityManager.delete(job1.getId());
293+
externalWorkerJobEntityManager.delete(job2.getId());
294+
return null;
295+
});
296+
}
297+
201298
@Test
202299
@Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml")
203300
public void testQueryByElementName() {
@@ -700,6 +797,20 @@ public Void execute(CommandContext commandContext) {
700797
});
701798
}
702799

800+
private ExternalWorkerJobEntity createExternalWorkerJobWithScope(String scopeType, String scopeId, String elementId) {
801+
return managementService.executeCommand(commandContext -> {
802+
JobService jobService = CommandContextUtil.getJobService(commandContext);
803+
ExternalWorkerJobEntity jobEntity = jobService.createExternalWorkerJob();
804+
jobEntity.setJobType(Job.JOB_TYPE_EXTERNAL_WORKER);
805+
jobEntity.setScopeType(scopeType);
806+
jobEntity.setScopeId(scopeId);
807+
jobEntity.setElementId(elementId);
808+
jobService.insertExternalWorkerJob(jobEntity);
809+
assertThat(jobEntity.getId()).isNotNull();
810+
return jobEntity;
811+
});
812+
}
813+
703814
@Test
704815
@Deployment(resources = "org/flowable/engine/test/api/mgmt/ExternalWorkerJobQueryTest.bpmn20.xml")
705816
public void testOrQuery() {

0 commit comments

Comments
 (0)