mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-07 01:54:22 +00:00
[Task 72498] implemented the Sort option for the Process Search and added tests
This commit is contained in:
@@ -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.
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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()) {
|
||||
|
@@ -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 =
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user