Skip to content

Commit c832864

Browse files
authored
Add GET /api/v1/jobs (#2930)
Signed-off-by: Willy Lulciuc <willy.lulciuc@gmail.com>
1 parent 1e831fa commit c832864

3 files changed

Lines changed: 55 additions & 10 deletions

File tree

api/src/main/java/marquez/api/JobResource.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.ArrayList;
1616
import java.util.Collections;
1717
import java.util.List;
18+
import java.util.Optional;
1819
import javax.validation.Valid;
1920
import javax.validation.constraints.Min;
2021
import javax.validation.constraints.NotNull;
@@ -159,6 +160,19 @@ public Response listJobVersions(
159160
return Response.ok(new JobVersions(jobVersions)).build();
160161
}
161162

163+
@Timed
164+
@ResponseMetered
165+
@ExceptionMetered
166+
@GET
167+
@Path("/jobs")
168+
@Produces(APPLICATION_JSON)
169+
public Response list(
170+
@QueryParam("lastRunStates") List<RunState> lastRunStates,
171+
@QueryParam("limit") @DefaultValue("100") @Min(value = 0) int limit,
172+
@QueryParam("offset") @DefaultValue("0") @Min(value = 0) int offset) {
173+
return list(null, lastRunStates, limit, offset);
174+
}
175+
162176
@Timed
163177
@ResponseMetered
164178
@ExceptionMetered
@@ -170,17 +184,17 @@ public Response list(
170184
@QueryParam("lastRunStates") List<RunState> lastRunStates,
171185
@QueryParam("limit") @DefaultValue("100") @Min(value = 0) int limit,
172186
@QueryParam("offset") @DefaultValue("0") @Min(value = 0) int offset) {
173-
throwIfNotExists(namespaceName);
187+
final Optional<NamespaceName> namespaceOrNull = Optional.ofNullable(namespaceName);
188+
final String namespace = namespaceOrNull.map(NamespaceName::getValue).orElse(null);
174189

175190
// default to all run states if not specified
176191
if (lastRunStates.isEmpty()) {
177192
lastRunStates = new ArrayList<>();
178193
Collections.addAll(lastRunStates, RunState.values());
179194
}
180195

181-
final List<Job> jobs =
182-
jobService.findAllWithRun(namespaceName.getValue(), lastRunStates, limit, offset);
183-
final int totalCount = jobService.countFor(namespaceName.getValue());
196+
final List<Job> jobs = jobService.findAllWithRun(namespace, lastRunStates, limit, offset);
197+
final int totalCount = jobService.countFor(namespace);
184198
return Response.ok(new ResultsPage<>("jobs", jobs, totalCount)).build();
185199
}
186200

api/src/main/java/marquez/db/JobDao.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ default Optional<Job> findWithDatasetsAndRun(String namespaceName, String jobNam
143143
Optional<Job> job = findJobByName(namespaceName, jobName);
144144
job.ifPresent(
145145
j -> {
146-
List<Run> runs = createRunDao().findByLatestJob(namespaceName, jobName, 1, 0);
146+
List<Run> runs = createRunDao().findByLatestJob(namespaceName, jobName, 10, 0);
147147
this.setJobData(runs, j);
148148
this.setJobDataset(
149149
createJobVersionDao().findCurrentInputOutputDatasetsFor(namespaceName, jobName), j);
@@ -179,15 +179,15 @@ default Optional<Job> findWithDatasetsAndRun(String namespaceName, String jobNam
179179
FROM
180180
jobs_view AS j
181181
WHERE
182-
j.namespace_name = :namespaceName
182+
(:namespaceName IS NULL OR j.namespace_name = :namespaceName)
183183
),
184184
job_versions_temp AS (
185185
SELECT
186186
*
187187
FROM
188188
job_versions AS j
189189
WHERE
190-
j.namespace_name = :namespaceName
190+
(:namespaceName IS NULL OR j.namespace_name = :namespaceName)
191191
),
192192
facets_temp AS (
193193
SELECT
@@ -219,7 +219,7 @@ job_tags as (
219219
ON
220220
jtm.job_uuid = j.uuid
221221
AND
222-
j.namespace_name = :namespaceName
222+
(:namespaceName IS NULL OR j.namespace_name = :namespaceName)
223223
INNER JOIN
224224
tags t
225225
ON
@@ -271,7 +271,7 @@ List<Job> findAll(
271271
int countJobRuns(String namespaceName, String job);
272272

273273
@SqlQuery(
274-
"SELECT count(*) FROM jobs_view AS j WHERE j.namespace_name = :namespaceName\n"
274+
"SELECT count(*) FROM jobs_view AS j WHERE (:namespaceName IS NULL OR j.namespace_name = :namespaceName)\n"
275275
+ "AND symlink_target_uuid IS NULL")
276276
int countFor(String namespaceName);
277277

@@ -281,7 +281,9 @@ default List<Job> findAllWithRun(
281281
return findAll(namespaceName, lastRunStates, limit, offset).stream()
282282
.peek(
283283
j -> {
284-
List<Run> runs = runDao.findByLatestJob(namespaceName, j.getName().getValue(), 10, 0);
284+
List<Run> runs =
285+
runDao.findByLatestJob(
286+
j.getNamespace().getValue(), j.getName().getValue(), 10, 0);
285287
this.setJobData(runs, j);
286288
})
287289
.toList();

api/src/test/java/marquez/db/JobDaoTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
package marquez.db;
77

8+
import static marquez.common.models.CommonModelGenerator.newJobName;
89
import static marquez.db.DbTestUtils.createJobWithSymlinkTarget;
910
import static marquez.db.DbTestUtils.createJobWithoutSymlinkTarget;
11+
import static marquez.db.DbTestUtils.newJob;
1012
import static org.assertj.core.api.Assertions.assertThat;
1113
import static org.junit.Assert.assertNull;
1214
import static org.mockito.ArgumentMatchers.any;
@@ -22,6 +24,7 @@
2224
import java.util.List;
2325
import java.util.Optional;
2426
import java.util.UUID;
27+
import marquez.common.models.JobName;
2528
import marquez.common.models.JobType;
2629
import marquez.common.models.RunState;
2730
import marquez.db.models.DbModelGenerator;
@@ -124,6 +127,32 @@ public void testFindAll() {
124127
DbModelGenerator.jobIdFor(namespace.getName(), anotherJobSameNamespace.getName()));
125128
}
126129

130+
@Test
131+
public void testFindAllWithNoNamespace() {
132+
String nullNamespace = null;
133+
134+
List<RunState> runStates = new ArrayList<>();
135+
Collections.addAll(runStates, RunState.values());
136+
137+
final List<Job> jobsWillBeEmpty = jobDao.findAll(nullNamespace, runStates, 10, 0);
138+
assertThat(jobsWillBeEmpty).isEmpty();
139+
140+
JobName jobName0 = newJobName();
141+
JobName jobName1 = newJobName();
142+
JobName jobName2 = newJobName();
143+
144+
JobRow job0 = newJob(jdbi, jobName0.getValue());
145+
JobRow job1 = newJob(jdbi, jobName1.getValue());
146+
JobRow job2 = newJob(jdbi, jobName2.getValue());
147+
148+
final List<Job> jobsWillNotBeEmpty = jobDao.findAll(nullNamespace, runStates, 10, 0);
149+
assertThat(jobsWillNotBeEmpty)
150+
.isNotEmpty()
151+
.hasSize(3)
152+
.extracting(Job::getName)
153+
.containsExactlyInAnyOrder(jobName0, jobName1, jobName2);
154+
}
155+
127156
@Test
128157
public void testCountFor() {
129158
JobRow targetJob =

0 commit comments

Comments
 (0)