Skip to content

Commit

Permalink
Added API to get job executions filtered by task execution id (spring…
Browse files Browse the repository at this point in the history
  • Loading branch information
siddhantsorann authored Oct 30, 2020
1 parent 04da1b0 commit fedfefb
Show file tree
Hide file tree
Showing 13 changed files with 176 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public void index() throws Exception {
linkWithRel("jobs/executions/status").description("Retrieve Job Executions by Job status"),
linkWithRel("jobs/thinexecutions/name").description("Retrieve Job Executions by Job name with no step executions included"),
linkWithRel("jobs/thinexecutions/jobInstanceId").description("Retrieve Job Executions by Job Instance Id with no step executions included"),
linkWithRel("jobs/thinexecutions/taskExecutionId").description("Retrieve Job Executions by Task Execution Id with no step executions included"),
linkWithRel("jobs/instances/instance").description("Provides the job instance resource for a specific job instance"),
linkWithRel("jobs/instances/name").description("Provides the Job instance resource for a specific job name"),

Expand Down Expand Up @@ -222,6 +223,8 @@ public void index() throws Exception {
fieldWithPath("_links.jobs/thinexecutions/name.templated").type(JsonFieldType.BOOLEAN).optional().description("Link jobs/executions/name is templated"),
fieldWithPath("_links.jobs/thinexecutions/jobInstanceId.href").description("Link to the jobs/thinexecutions/jobInstanceId"),
fieldWithPath("_links.jobs/thinexecutions/jobInstanceId.templated").type(JsonFieldType.BOOLEAN).optional().description("Link jobs/executions/jobInstanceId is templated"),
fieldWithPath("_links.jobs/thinexecutions/taskExecutionId.href").description("Link to the jobs/thinexecutions/taskExecutionId"),
fieldWithPath("_links.jobs/thinexecutions/taskExecutionId.templated").type(JsonFieldType.BOOLEAN).optional().description("Link jobs/executions/taskExecutionId is templated"),

fieldWithPath("_links.jobs/executions/execution.href").description("Link to the jobs/executions/execution"),
fieldWithPath("_links.jobs/executions/execution.templated").type(JsonFieldType.BOOLEAN).optional().description("Link jobs/executions/execution is templated"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,30 @@ public void listThinJobExecutionsByJobInstanceId() throws Exception {
)));
}

@Test
public void listThinJobExecutionsByTaskExecutionId() throws Exception {
this.mockMvc.perform(
get("/jobs/thinexecutions")
.param("page", "0")
.param("size", "10")
.param("taskExecutionId", "1"))
.andDo(print())
.andExpect(status().isOk()).andDo(this.documentationHandler.document(
requestParameters(
parameterWithName("page")
.description("The zero-based page number (optional)"),
parameterWithName("size")
.description("The requested page size (optional)"),
parameterWithName("taskExecutionId")
.description("Filter result by the task execution id")),
responseFields(
subsectionWithPath("_embedded.jobExecutionThinResourceList")
.description("Contains a collection of Job Executions without step executions included/"),
subsectionWithPath("_links.self").description("Link to the job execution resource"),
subsectionWithPath("page").description("Pagination properties")
)));
}

@Test
public void listThinJobExecutionsByDate() throws Exception {
this.mockMvc.perform(
Expand Down
40 changes: 40 additions & 0 deletions spring-cloud-dataflow-docs/src/main/asciidoc/api-guide.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2093,6 +2093,7 @@ The following topics provide more details:
* <<api-guide-resources-job-executions-thin-job-execution-info-only-list-by-name>>
* <<api-guide-resources-job-executions-thin-job-execution-info-only-list-by-date>>
* <<api-guide-resources-job-executions-thin-job-execution-info-only-list-by-job-instance-id>>
* <<api-guide-resources-job-executions-thin-job-execution-info-only-list-by-task-execution-id>>
* <<api-guide-resources-job-executions-detail>>
* <<api-guide-resources-job-executions-stop>>
* <<api-guide-resources-job-executions-restart>>
Expand Down Expand Up @@ -2333,6 +2334,45 @@ include::{snippets}/job-executions-documentation/list-thin-job-executions-by-job

include::{snippets}/job-executions-documentation/list-thin-job-executions-by-job-instance-id/http-response.adoc[]

[[api-guide-resources-job-executions-thin-job-execution-info-only-list-by-task-execution-id]]
==== List All Job Executions For A Specified Task Execution Id Without Step Executions Included

The job executions endpoint lets you list all job executions.
The following topics provide more details:

* <<api-guide-resources-job-executions-thin-list-by-task-execution-id-request-structure>>
* <<api-guide-resources-job-executions-thin-list-by-task-execution-id-request-parameters>>
* <<api-guide-resources-job-executions-thin-list-by-task-execution-id-example-request>>
* <<api-guide-resources-job-executions-thin-list-by-task-execution-id-response-structure>>



[[api-guide-resources-job-executions-thin-list-by-task-execution-id-request-structure]]
===== Request Structure

include::{snippets}/job-executions-documentation/list-thin-job-executions-by-task-execution-id/http-request.adoc[]



[[api-guide-resources-job-executions-thin-list-by-task-execution-id-request-parameters]]
===== Request Parameters

include::{snippets}/job-executions-documentation/list-thin-job-executions-by-task-execution-id/request-parameters.adoc[]



[[api-guide-resources-job-executions-thin-list-by-task-execution-id-example-request]]
===== Example Request

include::{snippets}/job-executions-documentation/list-thin-job-executions-by-task-execution-id/curl-request.adoc[]



[[api-guide-resources-job-executions-thin-list-by-task-execution-id-response-structure]]
===== Response Structure

include::{snippets}/job-executions-documentation/list-thin-job-executions-by-task-execution-id/http-response.adoc[]

[[api-guide-resources-job-executions-detail]]
==== Job Execution Detail

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ public class JdbcSearchableJobExecutionDao extends JdbcJobExecutionDao implement

private static final String NAME_AND_STATUS_FILTER = "I.JOB_NAME LIKE ? AND E.STATUS = ?";

private static final String TASK_EXECUTION_ID_FILTER =
"B.JOB_EXECUTION_ID = E.JOB_EXECUTION_ID AND B.TASK_EXECUTION_ID = ?";

private static final String FROM_CLAUSE_TASK_TASK_BATCH = "TASK_TASK_BATCH B";

private PagingQueryProvider allExecutionsPagingQueryProvider;

private PagingQueryProvider byJobNamePagingQueryProvider;
Expand All @@ -97,6 +102,8 @@ public class JdbcSearchableJobExecutionDao extends JdbcJobExecutionDao implement

private PagingQueryProvider byJobInstanceIdWithStepCountPagingQueryProvider;

private PagingQueryProvider byTaskExecutionIdWithStepCountPagingQueryProvider;

private DataSource dataSource;

/**
Expand Down Expand Up @@ -134,6 +141,8 @@ protected long getNextKey() {
DATE_RANGE_FILTER);
byJobInstanceIdWithStepCountPagingQueryProvider = getPagingQueryProvider(FIELDS_WITH_STEP_COUNT, null,
JOB_INSTANCE_ID_FILTER);
byTaskExecutionIdWithStepCountPagingQueryProvider = getPagingQueryProvider(FIELDS_WITH_STEP_COUNT,
FROM_CLAUSE_TASK_TASK_BATCH, TASK_EXECUTION_ID_FILTER);

super.afterPropertiesSet();

Expand Down Expand Up @@ -262,6 +271,25 @@ public List<JobExecutionWithStepCount> getJobExecutionsWithStepCountFilteredByJo
}
}

@Override
public List<JobExecutionWithStepCount> getJobExecutionsWithStepCountFilteredByTaskExecutionId(
int taskExecutionId, int start, int count) {
if (start <= 0) {
return getJdbcTemplate().query(byTaskExecutionIdWithStepCountPagingQueryProvider.generateFirstPageQuery(count),
new JobExecutionStepCountRowMapper(), taskExecutionId);
}
try {
Long startAfterValue = getJdbcTemplate().queryForObject(
byTaskExecutionIdWithStepCountPagingQueryProvider.generateJumpToItemQuery(start, count), Long.class,
taskExecutionId);
return getJdbcTemplate().query(byTaskExecutionIdWithStepCountPagingQueryProvider.generateRemainingPagesQuery(count),
new JobExecutionStepCountRowMapper(), taskExecutionId, startAfterValue);
}
catch (IncorrectResultSizeDataAccessException e) {
return Collections.emptyList();
}
}

/**
* @see SearchableJobExecutionDao#getRunningJobExecutions()
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,4 +374,15 @@ Collection<JobExecutionWithStepCount> listJobExecutionsForJobWithStepCount(Date
* @return a collection of {@link JobExecutionWithStepCount}
*/
Collection<JobExecutionWithStepCount> listJobExecutionsForJobWithStepCountFilteredByJobInstanceId(int jobInstanceId, int start, int count);

/**
* List the {@link JobExecutionWithStepCount job executions} filtered by task execution id in
* descending order of creation (usually close to execution order).
*
* @param taskExecutionId the task execution id associated with the execution.
* @param start the start index of the first job execution
* @param count the maximum number of executions to return
* @return a collection of {@link JobExecutionWithStepCount}
*/
Collection<JobExecutionWithStepCount> listJobExecutionsForJobWithStepCountFilteredByTaskExecutionId(int taskExecutionId, int start, int count);
}
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,15 @@ public interface SearchableJobExecutionDao extends JobExecutionDao {
* @return the {@link JobExecutionWithStepCount} instances requested
*/
List<JobExecutionWithStepCount> getJobExecutionsWithStepCountFilteredByJobInstanceId(int jobInstanceId, int start, int count);

/**
* Get the {@link JobExecutionWithStepCount JobExecutions} for a specific task execution id in
* reverse order of creation (so normally of execution).
*
* @param taskExecutionId the task execution id associated with the execution.
* @param start the start index of the instances
* @param count the maximum number of instances to return
* @return the {@link JobExecutionWithStepCount} instances requested
*/
List<JobExecutionWithStepCount> getJobExecutionsWithStepCountFilteredByTaskExecutionId(int taskExecutionId, int start, int count);
}
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,12 @@ public Collection<JobExecutionWithStepCount> listJobExecutionsForJobWithStepCoun
return jobExecutionDao.getJobExecutionsWithStepCountFilteredByJobInstanceId(jobInstanceId, start, count);
}

@Override
public Collection<JobExecutionWithStepCount> listJobExecutionsForJobWithStepCountFilteredByTaskExecutionId(
int taskExecutionId, int start, int count) {
return jobExecutionDao.getJobExecutionsWithStepCountFilteredByTaskExecutionId(taskExecutionId, start, count);
}

private List<JobExecution> getJobExecutions(String jobName, BatchStatus status, int pageOffset, int pageSize) {
if (StringUtils.isEmpty(jobName)) {
if (status != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,25 @@ public PagedModel<JobExecutionThinResource> retrieveJobsByJobInstanceId(
return assembler.toModel(page, jobAssembler);
}


/**
* Retrieve all task job executions filtered with the task execution id specified
*
* @param taskExecutionId the task execution id associated with the execution.
* @param pageable page-able collection of {@code TaskJobExecution}s.
* @param assembler for the {@link TaskJobExecution}s
* @return list task/job executions with the specified jobName.
* @throws NoSuchJobException if the job with the given name does not exist.
*/
@RequestMapping(value = "", method = RequestMethod.GET, params = "taskExecutionId", produces = "application/json")
@ResponseStatus(HttpStatus.OK)
public PagedModel<JobExecutionThinResource> retrieveJobsByTaskExecutionId(
@RequestParam("taskExecutionId") int taskExecutionId, Pageable pageable,
PagedResourcesAssembler<TaskJobExecution> assembler) throws NoSuchJobException {
List<TaskJobExecution> jobExecutions = taskJobService
.listJobExecutionsForJobWithStepCountFilteredByTaskExecutionId(pageable, taskExecutionId);
Page<TaskJobExecution> page = new PageImpl<>(jobExecutions, pageable, jobExecutions.size());
return assembler.toModel(page, jobAssembler);
}

/**
* {@link org.springframework.hateoas.server.ResourceAssembler} implementation that converts
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ public RootResource info() {
root.add(Link.of(taskTemplated).withRel("jobs/thinexecutions/name"));
taskTemplated = entityLinks.linkToCollectionResource(JobExecutionThinResource.class).getHref() + "{?jobInstanceId}";
root.add(Link.of(taskTemplated).withRel("jobs/thinexecutions/jobInstanceId"));
taskTemplated = entityLinks.linkToCollectionResource(JobExecutionThinResource.class).getHref() + "{?taskExecutionId}";
root.add(Link.of(taskTemplated).withRel("jobs/thinexecutions/taskExecutionId"));

}
root.add(entityLinks.linkToCollectionResource(AppRegistrationResource.class).withRel("apps"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,4 +201,16 @@ List<TaskJobExecution> listJobExecutionsForJobWithStepCount(Pageable pageable, D
*/
List<TaskJobExecution> listJobExecutionsForJobWithStepCountFilteredByJobInstanceId(Pageable pageable, int jobInstanceId)
throws NoSuchJobException;

/**
* Retrieves Pageable list of {@link JobExecutionWithStepCount} from the JobRepository
* filtered by the task execution id.
*
* @param pageable enumerates the data to be returned.
* @param taskExecutionId the task execution id associated with the execution.
* @return List containing {@link JobExecutionWithStepCount}s.
* @throws NoSuchJobException if the job with the given name does not exist.
*/
List<TaskJobExecution> listJobExecutionsForJobWithStepCountFilteredByTaskExecutionId(Pageable pageable, int taskExecutionId)
throws NoSuchJobException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,15 @@ public List<TaskJobExecution> listJobExecutionsForJobWithStepCountFilteredByJobI
pageable.getPageSize()));
}

@Override
public List<TaskJobExecution> listJobExecutionsForJobWithStepCountFilteredByTaskExecutionId(
Pageable pageable, int taskExecutionId) throws NoSuchJobException {
Assert.notNull(pageable, "pageable must not be null");
return getTaskJobExecutionsWithStepCountForList(
jobService.listJobExecutionsForJobWithStepCountFilteredByTaskExecutionId(taskExecutionId, getPageOffset(pageable),
pageable.getPageSize()));
}

@Override
public List<TaskJobExecution> listJobExecutionsForJobWithStepCount(Pageable pageable, String jobName) throws NoSuchJobException {
Assert.notNull(pageable, "pageable must not be null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,14 @@ public void testGetExecutionsByJobInstanceId() throws Exception {
.andExpect(jsonPath("$.content", hasSize(1)));
}

@Test
public void testGetExecutionsByTaskExecutionId() throws Exception {
mockMvc.perform(get("/jobs/thinexecutions/").param("taskExecutionId", "4")
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.content[0].taskExecutionId", is(4)))
.andExpect(jsonPath("$.content", hasSize(1)));
}

}
Loading

0 comments on commit fedfefb

Please sign in to comment.