[Task 72498] implemented the Sort option for the Process Search and added tests

This commit is contained in:
Raf Ponsaerts
2020-08-14 15:26:04 +02:00
parent 4c605cfff3
commit 67d04b2254
5 changed files with 280 additions and 1 deletions

View File

@@ -16,6 +16,7 @@ import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.commons.lang3.StringUtils;
import org.dspace.content.dao.ProcessDAO;
import org.dspace.core.AbstractHibernateDAO;
import org.dspace.core.Context;
@@ -84,11 +85,24 @@ public class ProcessDAOImpl extends AbstractHibernateDAO<Process> implements Pro
Root<Process> processRoot = criteriaQuery.from(Process.class);
criteriaQuery.select(processRoot);
addProcessQueryParameters(processQueryParameterContainer, criteriaBuilder, criteriaQuery, processRoot);
handleProcessQueryParameters(processQueryParameterContainer, criteriaBuilder, criteriaQuery, processRoot);
return list(context, criteriaQuery, false, Process.class, limit, offset);
}
private void handleProcessQueryParameters(ProcessQueryParameterContainer processQueryParameterContainer,
CriteriaBuilder criteriaBuilder, CriteriaQuery criteriaQuery,
Root<Process> processRoot) {
addProcessQueryParameters(processQueryParameterContainer, criteriaBuilder, criteriaQuery, processRoot);
if (StringUtils.equalsIgnoreCase(processQueryParameterContainer.getSortOrder(), "asc")) {
criteriaQuery
.orderBy(criteriaBuilder.asc(processRoot.get(processQueryParameterContainer.getSortProperty())));
} else if (StringUtils.equalsIgnoreCase(processQueryParameterContainer.getSortOrder(), "desc")) {
criteriaQuery
.orderBy(criteriaBuilder.desc(processRoot.get(processQueryParameterContainer.getSortProperty())));
}
}
/**
* This method will apply the variables in the {@link ProcessQueryParameterContainer} as criteria for the
* {@link Process} objects to the given CriteriaQuery.

View File

@@ -27,6 +27,8 @@ public class ProcessQueryParameterContainer {
return queryParameterMap;
}
private String sortProperty = "startTime";
private String sortOrder = "desc";
/**
* Generic setter for the queryParameterMap
* @param queryParameterMap The queryParameterMap to be set on this ProcessQueryParameterContainer
@@ -41,4 +43,36 @@ public class ProcessQueryParameterContainer {
}
queryParameterMap.put(key, object);
}
/**
* Generic getter for the sortProperty
* @return the sortProperty value of this ProcessQueryParameterContainer
*/
public String getSortProperty() {
return sortProperty;
}
/**
* Generic setter for the sortProperty
* @param sortProperty The sortProperty to be set on this ProcessQueryParameterContainer
*/
public void setSortProperty(String sortProperty) {
this.sortProperty = sortProperty;
}
/**
* Generic getter for the sortOrder
* @return the sortOrder value of this ProcessQueryParameterContainer
*/
public String getSortOrder() {
return sortOrder;
}
/**
* Generic setter for the sortOrder
* @param sortOrder The sortOrder to be set on this ProcessQueryParameterContainer
*/
public void setSortOrder(String sortOrder) {
this.sortOrder = sortOrder;
}
}

View File

@@ -9,6 +9,8 @@ package org.dspace.builder;
import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import org.dspace.authorize.AuthorizeException;
@@ -48,6 +50,13 @@ public class ProcessBuilder extends AbstractBuilder<Process, ProcessService> {
return this;
}
public ProcessBuilder withStartAndEndTime(String startTime, String endTime) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
process.setStartTime(simpleDateFormat.parse(startTime));
process.setFinishedTime(simpleDateFormat.parse(endTime));
return this;
}
@Override
public void cleanup() throws Exception {
try (Context c = new Context()) {

View File

@@ -9,6 +9,7 @@ package org.dspace.app.rest.repository;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -37,6 +38,7 @@ import org.dspace.scripts.service.ProcessService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
@@ -184,6 +186,7 @@ public class ProcessRestRepository extends DSpaceRestRepository<ProcessRest, Int
}
ProcessQueryParameterContainer processQueryParameterContainer = createProcessQueryParameterContainer(scriptName,
ePerson, processStatus);
handleSearchSort(pageable, processQueryParameterContainer);
List<Process> processes = processService.search(context, processQueryParameterContainer, pageable.getPageSize(),
Math.toIntExact(pageable.getOffset()));
return converterService.toRestPage(processes, pageable,
@@ -193,6 +196,26 @@ public class ProcessRestRepository extends DSpaceRestRepository<ProcessRest, Int
}
private void handleSearchSort(Pageable pageable, ProcessQueryParameterContainer processQueryParameterContainer) {
Sort sort = pageable.getSort();
if (sort != null) {
Iterator<Sort.Order> iterator = sort.iterator();
if (iterator.hasNext()) {
Sort.Order order = iterator.next();
if (StringUtils.equalsIgnoreCase(order.getProperty(), "startTime")) {
processQueryParameterContainer.setSortProperty(Process_.START_TIME);
processQueryParameterContainer.setSortOrder(order.getDirection().name());
} else if (StringUtils.equalsIgnoreCase(order.getProperty(), "endTime")) {
processQueryParameterContainer.setSortProperty(Process_.FINISHED_TIME);
processQueryParameterContainer.setSortOrder(order.getDirection().name());
}
if (iterator.hasNext()) {
throw new DSpaceBadRequestException("Only one sort method is supported, can't give multiples");
}
}
}
}
private ProcessQueryParameterContainer createProcessQueryParameterContainer(String scriptName, EPerson ePerson,
ProcessStatus processStatus) {
ProcessQueryParameterContainer processQueryParameterContainer =

View File

@@ -7,6 +7,7 @@
*/
package org.dspace.app.rest;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -566,6 +567,204 @@ public class ProcessRestRepositoryIT extends AbstractControllerIntegrationTest {
.andExpect(status().isBadRequest());
}
@Test
public void searchProcessTestByUserSortedOnStartTimeAsc() throws Exception {
Process newProcess1 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("10/01/1990", "20/01/1990").build();
Process newProcess2 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("11/01/1990", "19/01/1990").build();
Process newProcess3 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("12/01/1990", "18/01/1990").build();
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(get("/api/system/processes/search/byProperty")
.param("userId", eperson.getID().toString())
.param("sort", "startTime,asc"))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.processes", contains(
ProcessMatcher.matchProcess(newProcess1.getName(),
String.valueOf(eperson.getID().toString()),
newProcess1.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess2.getName(),
String.valueOf(eperson.getID().toString()),
newProcess2.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess3.getName(),
String.valueOf(eperson.getID().toString()),
newProcess3.getID(), parameters, ProcessStatus.SCHEDULED)
)))
.andExpect(jsonPath("$.page", is(
PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 3))));
}
@Test
public void searchProcessTestByUserSortedOnStartTimeDesc() throws Exception {
Process newProcess1 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("10/01/1990", "20/01/1990").build();
Process newProcess2 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("11/01/1990", "19/01/1990").build();
Process newProcess3 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("12/01/1990", "18/01/1990").build();
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(get("/api/system/processes/search/byProperty")
.param("userId", eperson.getID().toString())
.param("sort", "startTime,desc"))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.processes", contains(
ProcessMatcher.matchProcess(newProcess3.getName(),
String.valueOf(eperson.getID().toString()),
newProcess3.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess2.getName(),
String.valueOf(eperson.getID().toString()),
newProcess2.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess1.getName(),
String.valueOf(eperson.getID().toString()),
newProcess1.getID(), parameters, ProcessStatus.SCHEDULED)
)))
.andExpect(jsonPath("$.page", is(
PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 3))));
}
@Test
public void searchProcessTestByUserSortedOnEndTimeAsc() throws Exception {
Process newProcess1 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("10/01/1990", "20/01/1990").build();
Process newProcess2 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("11/01/1990", "19/01/1990").build();
Process newProcess3 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("12/01/1990", "18/01/1990").build();
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(get("/api/system/processes/search/byProperty")
.param("userId", eperson.getID().toString())
.param("sort", "endTime,asc"))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.processes", contains(
ProcessMatcher.matchProcess(newProcess3.getName(),
String.valueOf(eperson.getID().toString()),
newProcess3.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess2.getName(),
String.valueOf(eperson.getID().toString()),
newProcess2.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess1.getName(),
String.valueOf(eperson.getID().toString()),
newProcess1.getID(), parameters, ProcessStatus.SCHEDULED)
)))
.andExpect(jsonPath("$.page", is(
PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 3))));
}
@Test
public void searchProcessTestByUserSortedOnEndTimeDesc() throws Exception {
Process newProcess1 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("10/01/1990", "20/01/1990").build();
Process newProcess2 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("11/01/1990", "19/01/1990").build();
Process newProcess3 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("12/01/1990", "18/01/1990").build();
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(get("/api/system/processes/search/byProperty")
.param("userId", eperson.getID().toString())
.param("sort", "endTime,desc"))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.processes", contains(
ProcessMatcher.matchProcess(newProcess1.getName(),
String.valueOf(eperson.getID().toString()),
newProcess1.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess2.getName(),
String.valueOf(eperson.getID().toString()),
newProcess2.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess3.getName(),
String.valueOf(eperson.getID().toString()),
newProcess3.getID(), parameters, ProcessStatus.SCHEDULED)
)))
.andExpect(jsonPath("$.page", is(
PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 3))));
}
@Test
public void searchProcessTestByUserSortedOnMultipleBadRequest() throws Exception {
Process newProcess1 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("10/01/1990", "20/01/1990").build();
Process newProcess2 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("11/01/1990", "19/01/1990").build();
Process newProcess3 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("12/01/1990", "18/01/1990").build();
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(get("/api/system/processes/search/byProperty")
.param("userId", eperson.getID().toString())
.param("sort", "endTime,desc")
.param("sort", "startTime,desc"))
.andExpect(status().isBadRequest());
}
@Test
public void searchProcessTestByUserSortedOnDefault() throws Exception {
Process newProcess1 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("10/01/1990", "20/01/1990").build();
Process newProcess2 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("11/01/1990", "19/01/1990").build();
Process newProcess3 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("12/01/1990", "18/01/1990").build();
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(get("/api/system/processes/search/byProperty")
.param("userId", eperson.getID().toString())
.param("sort", "startTime,desc"))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.processes", contains(
ProcessMatcher.matchProcess(newProcess3.getName(),
String.valueOf(eperson.getID().toString()),
newProcess3.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess2.getName(),
String.valueOf(eperson.getID().toString()),
newProcess2.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess1.getName(),
String.valueOf(eperson.getID().toString()),
newProcess1.getID(), parameters, ProcessStatus.SCHEDULED)
)))
.andExpect(jsonPath("$.page", is(
PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 3))));
}
@Test
public void searchProcessTestByUserSortedOnNonExistingIsSortedAsDefault() throws Exception {
Process newProcess1 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("10/01/1990", "20/01/1990").build();
Process newProcess2 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("11/01/1990", "19/01/1990").build();
Process newProcess3 = ProcessBuilder.createProcess(context, eperson, "mock-script", parameters)
.withStartAndEndTime("12/01/1990", "18/01/1990").build();
String token = getAuthToken(admin.getEmail(), password);
getClient(token).perform(get("/api/system/processes/search/byProperty")
.param("userId", eperson.getID().toString())
.param("sort", "eaz,desc"))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.processes", contains(
ProcessMatcher.matchProcess(newProcess3.getName(),
String.valueOf(eperson.getID().toString()),
newProcess3.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess2.getName(),
String.valueOf(eperson.getID().toString()),
newProcess2.getID(), parameters, ProcessStatus.SCHEDULED),
ProcessMatcher.matchProcess(newProcess1.getName(),
String.valueOf(eperson.getID().toString()),
newProcess1.getID(), parameters, ProcessStatus.SCHEDULED)
)))
.andExpect(jsonPath("$.page", is(
PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 3))));
}
@After
@Override
public void destroy() throws Exception {