Skip to content

Commit

Permalink
WM-1351 Enhance /api/projects (#21)
Browse files Browse the repository at this point in the history
Implement WM-1351 enhance /api/projects
  • Loading branch information
yoyama committed Jan 24, 2022
1 parent 4b657a1 commit e999615
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,6 @@ public DatabaseProjectStore(int siteId)
this.siteId = siteId;
}

//public List<StoredProject> getAllProjects()
//{
// return dao.getProjects(siteId, Integer.MAX_VALUE, 0);
//}

@DigdagTimed(value = "dpst_", category = "db", appendMethodName = true)
@Override
public List<StoredProjectWithRevision> getProjectsWithLatestRevision(int pageSize, Optional<Integer> lastId, AccessController.ListFilter acFilter)
Expand All @@ -139,9 +134,9 @@ public List<StoredProjectWithRevision> getProjectsWithLatestRevision(int pageSiz

@DigdagTimed(value = "dpst_", category = "db", appendMethodName = true)
@Override
public List<StoredProject> getProjects(int pageSize, Optional<Integer> lastId, AccessController.ListFilter acFilter)
public List<StoredProject> getProjects(int pageSize, Optional<Integer> lastId, Optional<String> namePattern, AccessController.ListFilter acFilter)
{
return autoCommit((handle, dao) -> dao.getProjects(siteId, pageSize, lastId.or(0), acFilter.getSql()));
return autoCommit((handle, dao) -> dao.getProjects(siteId, pageSize, lastId.or(0), generatePartialMatchPattern(namePattern), acFilter.getSql()));
}

@DigdagTimed(value = "dpst_", category = "db", appendMethodName = true)
Expand Down Expand Up @@ -710,13 +705,15 @@ public interface Dao
" where proj.site_id = :siteId" +
" and proj.name is not null" +
" and proj.id \\> :lastId" +
" and proj.name like :namePattern" +
" and <acFilter>" +
" order by proj.id asc" +
" limit :limit")
List<StoredProject> getProjects(
@Bind("siteId") int siteId,
@Bind("limit") int limit,
@Bind("lastId") int lastId,
@Bind("namePattern") String namePattern,
@Define("acFilter") String acFilter);

List<StoredProjectWithRevision> getProjectsWithLatestRevision(@Bind("siteId") int siteId, @Bind("limit") int limit, @Bind("lastId") int lastId, @Define("acFilter") String acFilter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

public interface ProjectStore
{
List<StoredProject> getProjects(int pageSize, Optional<Integer> lastId, AccessController.ListFilter acFilter);
List<StoredProject> getProjects(int pageSize, Optional<Integer> lastId, Optional<String> namePattern, AccessController.ListFilter acFilter);

List<StoredProjectWithRevision> getProjectsWithLatestRevision(int pageSize, Optional<Integer> lastId, AccessController.ListFilter acFilter);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
import io.digdag.core.repository.ProjectMap;
import io.digdag.core.repository.ProjectStore;
import io.digdag.core.repository.ProjectStoreManager;
import io.digdag.core.repository.ResourceConflictException;
import io.digdag.core.repository.Revision;
import io.digdag.core.repository.StoredProject;
import io.digdag.core.repository.StoredProjectWithRevision;
import io.digdag.core.repository.StoredRevision;
import io.digdag.core.repository.StoredWorkflowDefinition;
import io.digdag.core.repository.StoredWorkflowDefinitionWithProject;
Expand All @@ -26,6 +28,7 @@
import java.time.Instant;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;

import static io.digdag.core.database.DatabaseTestingUtils.assertConflict;
import static io.digdag.core.database.DatabaseTestingUtils.assertEmpty;
Expand Down Expand Up @@ -225,10 +228,10 @@ public void testGetAndNotFounds()
////
// public simple listings
//
assertEquals(ImmutableList.of(proj1, proj2), store.getProjects(100, Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(proj1), store.getProjects(1, Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(proj2), store.getProjects(100, Optional.of(proj1.getId()), () -> "true"));
assertEmpty(anotherSite.getProjects(100, Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(proj1, proj2), store.getProjects(100, Optional.absent(), Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(proj1), store.getProjects(1, Optional.absent(), Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(proj2), store.getProjects(100, Optional.of(proj1.getId()), Optional.absent(), () -> "true"));
assertEmpty(anotherSite.getProjects(100, Optional.absent(), Optional.absent(), () -> "true"));

assertEquals(ImmutableList.of(proj1Rev1, proj2Rev3), store.getProjectsWithLatestRevision(100, Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(proj1Rev1), store.getProjectsWithLatestRevision(1, Optional.absent(), () -> "true"));
Expand Down Expand Up @@ -428,7 +431,7 @@ public void testDeleteProject()
assertNotFound(() -> store.getProjectByName(deletingProject.getName()));

// listing doesn't include deleted projects
assertEquals(ImmutableList.of(), store.getProjects(100, Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(), store.getProjects(100, Optional.absent(), Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(), store.getProjectsWithLatestRevision(100, Optional.absent(), () -> "true"));
assertEquals(ImmutableList.of(), store.getLatestActiveWorkflowDefinitions(100, Optional.absent(), Optional.absent(), () -> "true"));

Expand All @@ -455,4 +458,58 @@ public void testDeleteProject()
assertNotEquals(sameName.getId(), deletingProject.getId());
});
}

@Test
public void testGetProjects()
throws Exception
{
factory.begin(() -> {
StoredProject proj1 = createTestProject("proj1abc", "proj1_rev1", "proj1_wf1");
StoredProject proj2 = createTestProject("proj2def", "proj2_rev1", "proj2_wf1");
StoredProject proj3 = createTestProject("proj3ghi", "proj3_rev1", "proj3_wf1");
StoredProject proj4 = createTestProject("other4jkl", "other4_rev1", "other4_wf1");
List<StoredProject> projects;

projects = store.getProjects(100, Optional.absent(), Optional.absent(), () -> "true");
assertEquals(ImmutableList.of("proj1abc", "proj2def", "proj3ghi", "other4jkl"), projects.stream().map( (x) -> x.getName()).collect(Collectors.toList()));

// Check pageSize
projects = store.getProjects(2, Optional.absent(), Optional.absent(), () -> "true");
assertEquals(ImmutableList.of("proj1abc", "proj2def"), projects.stream().map( (x) -> x.getName()).collect(Collectors.toList()));

// Check lastId
projects = store.getProjects(2, Optional.of(proj2.getId()), Optional.absent(), () -> "true");
assertEquals(ImmutableList.of("proj3ghi", "other4jkl"), projects.stream().map( (x) -> x.getName()).collect(Collectors.toList()));

// Check namePattern
projects = store.getProjects(100, Optional.absent(), Optional.of("proj"), () -> "true");
assertEquals(ImmutableList.of("proj1abc", "proj2def", "proj3ghi"), projects.stream().map( (x) -> x.getName()).collect(Collectors.toList()));

// Check namePattern
projects = store.getProjects(100, Optional.absent(), Optional.of("ghi"), () -> "true");
assertEquals(ImmutableList.of("proj3ghi"), projects.stream().map( (x) -> x.getName()).collect(Collectors.toList()));

// Check combination
projects = store.getProjects(100, Optional.of(proj1.getId()), Optional.of("proj"), () -> "true");
assertEquals(ImmutableList.of("proj2def", "proj3ghi"), projects.stream().map( (x) -> x.getName()).collect(Collectors.toList()));
});
}

private StoredProject createTestProject(String projectName, String revision, String workflowName)
throws ResourceConflictException
{
Project srcProj1 = Project.of(projectName);
Revision srcRev1 = createRevision(revision);
WorkflowDefinition srcWf1 = createWorkflow(workflowName);
return store.putAndLockProject(
srcProj1,
(store, stored) -> {
ProjectControl lock = new ProjectControl(store, stored);
assertNotConflict(() -> {
StoredRevision rev1 = lock.insertRevision(srcRev1);
lock.insertWorkflowDefinitions(rev1, ImmutableList.of(srcWf1), sm, Instant.now());
});
return lock.get();
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,13 @@ public RestProject getProject(@QueryParam("name") String name)
@ApiOperation("List projects with filters")
public RestProjectCollection getProjects(
@ApiParam(value="exact matching filter on project name", required=false)
@QueryParam("name") String name)
@QueryParam("name") String name,
@ApiParam(value="list projects whose id is grater than this id for pagination", required=false)
@QueryParam("last_id") Integer lastId,
@ApiParam(value="number of projects to return", required=false)
@QueryParam("count") Integer count,
@ApiParam(value="name pattern to be partially matched", required=false)
@QueryParam("name_pattern") String namePattern)
{
return tm.begin(() -> {
ProjectStore ps = rm.getProjectStore(getSiteId());
Expand Down

0 comments on commit e999615

Please sign in to comment.