Skip to content
This repository was archived by the owner on Aug 1, 2025. It is now read-only.

Commit 828ed81

Browse files
Merge pull request #49 from Breeding-Insight/germ-search-opts
Germplasm Search Optimizations
2 parents 3fb4a47 + 38cf473 commit 828ed81

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+727
-256
lines changed

src/main/java/org/brapi/test/BrAPITestServer/controller/core/BrAPIController.java

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import io.swagger.model.core.BatchDeletesListResponseResult;
1212
import org.brapi.test.BrAPITestServer.auth.AuthDetails;
1313
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
14-
import org.brapi.test.BrAPITestServer.exceptions.InvalidPagingException;
14+
import org.brapi.test.BrAPITestServer.service.PagingUtility;
1515
import org.slf4j.Logger;
1616
import org.slf4j.LoggerFactory;
1717
import org.springframework.http.HttpStatus;
@@ -33,29 +33,14 @@
3333

3434
public class BrAPIController {
3535
private static final Logger log = LoggerFactory.getLogger(ServerInfoApiController.class);
36-
37-
protected Metadata generateMetaDataTemplateForSearch(Integer originalRequestedPage, Integer newRequestedPage,
38-
Integer originalRequestedPageSize, Integer newRequestedPageSize) throws BrAPIServerException {
39-
Integer page = newRequestedPage;
40-
Integer pageSize = newRequestedPageSize;
41-
42-
if (page == null) {
43-
page = originalRequestedPage;
44-
}
45-
if (pageSize == null) {
46-
pageSize = originalRequestedPageSize;
47-
}
48-
49-
return generateMetaDataTemplate(page, pageSize);
50-
}
5136

5237
protected Metadata generateMetaDataTemplate(SearchRequest request) throws BrAPIServerException {
5338
return generateMetaDataTemplate(request.getPage(), request.getPageSize());
5439
}
5540

5641
protected Metadata generateMetaDataTemplate(String pageToken, Integer pageSize) {
5742
if (pageSize == null) {
58-
pageSize = 1000;
43+
pageSize = PagingUtility.getDefaultPageSize();
5944
}
6045

6146
Metadata metaData = generateEmptyMetadataToken();
@@ -65,14 +50,14 @@ protected Metadata generateMetaDataTemplate(String pageToken, Integer pageSize)
6550
}
6651

6752
protected Metadata generateMetaDataTemplate(Integer page, Integer pageSize) throws BrAPIServerException {
68-
validatePaging(page, pageSize);
53+
PagingUtility.validatePaging(page, pageSize);
6954

7055
// defaults
7156
if (page == null) {
7257
page = 0;
7358
}
7459
if (pageSize == null) {
75-
pageSize = 1000;
60+
pageSize = PagingUtility.getDefaultPageSize();
7661
}
7762

7863
Metadata metaData = generateEmptyMetadata();
@@ -81,16 +66,6 @@ protected Metadata generateMetaDataTemplate(Integer page, Integer pageSize) thro
8166
return metaData;
8267
}
8368

84-
private void validatePaging(Integer page, Integer pageSize) throws BrAPIServerException {
85-
boolean pageValid = (page == null) || (page >= 0);
86-
if (!pageValid)
87-
throw new InvalidPagingException("page");
88-
boolean pageSizeValid = (pageSize == null) || (pageSize >= 1);
89-
if (!pageSizeValid)
90-
throw new InvalidPagingException("pageSize");
91-
92-
}
93-
9469
protected Metadata generateEmptyMetadata() {
9570
Metadata metaData = new Metadata();
9671
metaData.setDatafiles(new ArrayList<>());

src/main/java/org/brapi/test/BrAPITestServer/controller/germ/GermplasmApiController.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,37 @@ public ResponseEntity<? extends BrAPIResponse> searchGermplasmPost(@RequestBody
213213
log.debug("Request: " + request.getRequestURI());
214214
validateSecurityContext(request, "ROLE_ANONYMOUS", "ROLE_USER");
215215
validateAcceptHeader(request);
216-
Metadata metadata = generateMetaDataTemplate(body);
217216

218217
String searchReqDbId = searchService.saveSearchRequest(body, SearchRequestTypes.GERMPLASM);
219218
if (searchReqDbId != null) {
220219
return responseAccepted(searchReqDbId);
220+
}
221+
222+
// WARN: This code was introduced to deal with a specific use case from BI which requires all data associated with
223+
// a particular program to be retreived at once. This method of data retreival is highly unadvised and can come
224+
// with serious performance deficits, such as slow response times and exhausted memory allocation.
225+
// Benchmarking suggests that at around 245-275k germplasm records returned 8GB of allocated memory will fail to
226+
// be enough to return a result.
227+
228+
// This code is a stop-gap to allow BI to continue to do this improper retreival in a way that will be efficient
229+
// for their specific use case.
230+
231+
// To get the data in this ill-advised way, forgo sending a page or pageSize attribute in the germplasm search request
232+
// to this endpoint. This will trigger the findGermplasmWithoutPaging code, which will grab all of the data without regard
233+
// to data size.
234+
235+
// To use the endpoint the right way, ensure one or both of the aforementioned attributes are set and the germplasm
236+
// records will be retrieved and returned paginated to limit resource consumption. This way is much more fine tuned
237+
// and will result in fast retrieval times with minimal memory allocation.
238+
if (body.getPage() == null && body.getPageSize() == null) {
239+
log.debug("Retrieving germs without pagination");
240+
List<Germplasm> data = germplasmService.findGermplasmWithoutPaging(body);
241+
Metadata metadata = generateEmptyMetadata();
242+
metadata.getPagination().setTotalCount(data.size());
243+
return responseOK(new GermplasmListResponse(), new GermplasmListResponseResult(), data, metadata);
221244
} else {
245+
log.debug("Retrieving germs with pagination");
246+
Metadata metadata = generateMetaDataTemplate(body);
222247
List<Germplasm> data = germplasmService.findGermplasm(body, metadata);
223248
return responseOK(new GermplasmListResponse(), new GermplasmListResponseResult(), data, metadata);
224249
}

src/main/java/org/brapi/test/BrAPITestServer/exceptions/InvalidPagingException.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,18 @@
44

55
public class InvalidPagingException extends BrAPIServerException {
66
private static final long serialVersionUID = 6250184179200451757L;
7+
8+
private static final String pageNumExceedsTotalPages =
9+
"A page was requested which exceeds total amount of data available. Please make a RQ with page < totalPages - 1. " +
10+
"Page numbers start at 0, and you can find out totalPages by making a RQ with \"page\": 0";
711

812
public InvalidPagingException(String field) {
913
super(HttpStatus.BAD_REQUEST, "\'" + field + "\' value is invalid");
1014
}
15+
16+
// This constructor should only be used when the pageNum of the RQ exceeds the total number of pages available.
17+
public InvalidPagingException() {
18+
super(HttpStatus.BAD_REQUEST, pageNumExceedsTotalPages);
19+
}
1120

1221
}

src/main/java/org/brapi/test/BrAPITestServer/factory/BrAPIComponent.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import io.swagger.model.SearchRequest;
55
import io.swagger.model.core.BatchDeleteTypes;
66
import jakarta.validation.Valid;
7+
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
78

89
import java.util.List;
910

1011
public interface BrAPIComponent<T, R extends SearchRequest> {
11-
List<T> findEntities(@Valid R request, Metadata metadata);
12+
List<T> findEntities(@Valid R request, Metadata metadata) throws BrAPIServerException;
1213
BatchDeleteTypes getBatchDeleteType();
1314
List<String> collectDbIds(List<T> entities);
1415
void deleteBatchDeleteData(List<String> dbIds);

src/main/java/org/brapi/test/BrAPITestServer/factory/core/ListComponent.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.swagger.model.core.ListSearchRequest;
66
import io.swagger.model.core.ListSummary;
77
import jakarta.validation.Valid;
8+
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
89
import org.brapi.test.BrAPITestServer.factory.BrAPIComponent;
910
import org.brapi.test.BrAPITestServer.service.core.ListService;
1011
import org.springframework.beans.factory.annotation.Autowired;
@@ -23,7 +24,8 @@ public ListComponent(ListService listService) {
2324
}
2425

2526
@Override
26-
public List<ListSummary> findEntities(@Valid ListSearchRequest request, Metadata metadata) {
27+
public List<ListSummary> findEntities(@Valid ListSearchRequest request, Metadata metadata)
28+
throws BrAPIServerException {
2729
return listService.findLists(request, metadata);
2830
}
2931

src/main/java/org/brapi/test/BrAPITestServer/factory/core/TrialComponent.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.swagger.model.core.BatchDeleteTypes;
55
import io.swagger.model.core.Trial;
66
import io.swagger.model.core.TrialSearchRequest;
7+
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
78
import org.brapi.test.BrAPITestServer.factory.BrAPIComponent;
89
import org.brapi.test.BrAPITestServer.service.core.TrialService;
910
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,7 +23,8 @@ public TrialComponent(TrialService trialService) {
2223
}
2324

2425
@Override
25-
public List<Trial> findEntities(TrialSearchRequest request, Metadata metadata) {
26+
public List<Trial> findEntities(TrialSearchRequest request, Metadata metadata)
27+
throws BrAPIServerException {
2628
return trialService.findTrials(request, metadata);
2729
}
2830

src/main/java/org/brapi/test/BrAPITestServer/factory/geno/PlateComponent.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.swagger.model.geno.Plate;
66
import io.swagger.model.geno.PlateSearchRequest;
77
import org.apache.commons.lang3.NotImplementedException;
8+
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
89
import org.brapi.test.BrAPITestServer.factory.BrAPIComponent;
910
import org.brapi.test.BrAPITestServer.service.geno.PlateService;
1011
import org.springframework.beans.factory.annotation.Autowired;
@@ -23,7 +24,8 @@ public PlateComponent(PlateService plateService) {
2324
}
2425

2526
@Override
26-
public List<Plate> findEntities(PlateSearchRequest request, Metadata metadata) {
27+
public List<Plate> findEntities(PlateSearchRequest request, Metadata metadata)
28+
throws BrAPIServerException {
2729
return plateService.findPlates(request, metadata);
2830
}
2931

src/main/java/org/brapi/test/BrAPITestServer/factory/geno/SampleComponent.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.swagger.model.core.BatchDeleteTypes;
55
import io.swagger.model.geno.Sample;
66
import io.swagger.model.geno.SampleSearchRequest;
7+
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
78
import org.brapi.test.BrAPITestServer.factory.BrAPIComponent;
89
import org.brapi.test.BrAPITestServer.service.geno.SampleService;
910
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,7 +23,8 @@ public SampleComponent(SampleService sampleService) {
2223
}
2324

2425
@Override
25-
public List<Sample> findEntities(SampleSearchRequest request, Metadata metadata) {
26+
public List<Sample> findEntities(SampleSearchRequest request, Metadata metadata)
27+
throws BrAPIServerException {
2628
return sampleService.findSamples(request, metadata);
2729
}
2830

src/main/java/org/brapi/test/BrAPITestServer/factory/germ/GermplasmComponent.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.swagger.model.germ.Germplasm;
66
import io.swagger.model.germ.GermplasmSearchRequest;
77
import jakarta.validation.Valid;
8+
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
89
import org.brapi.test.BrAPITestServer.factory.BrAPIComponent;
910
import org.brapi.test.BrAPITestServer.service.germ.GermplasmService;
1011
import org.springframework.beans.factory.annotation.Autowired;
@@ -23,7 +24,8 @@ public GermplasmComponent(GermplasmService germplasmService) {
2324
}
2425

2526
@Override
26-
public List<Germplasm> findEntities(@Valid GermplasmSearchRequest request, Metadata metadata) {
27+
public List<Germplasm> findEntities(@Valid GermplasmSearchRequest request, Metadata metadata)
28+
throws BrAPIServerException {
2729
return germplasmService.findGermplasm(request, metadata);
2830
}
2931

src/main/java/org/brapi/test/BrAPITestServer/repository/BrAPIRepository.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.List;
55
import java.util.Optional;
66

7+
import org.brapi.test.BrAPITestServer.exceptions.InvalidPagingException;
78
import org.brapi.test.BrAPITestServer.model.entity.BrAPIPrimaryEntity;
89
import org.brapi.test.BrAPITestServer.service.SearchQueryBuilder;
910
import org.springframework.data.domain.Page;
@@ -14,7 +15,11 @@
1415
@NoRepositoryBean
1516
public interface BrAPIRepository<T extends BrAPIPrimaryEntity, ID extends Serializable> extends JpaRepository<T, ID> {
1617

17-
public Page<T> findAllBySearch(SearchQueryBuilder<T> searchQuery, Pageable pageReq);
18+
public Page<T> findAllBySearchAndPaginate(SearchQueryBuilder<T> searchQuery, Pageable pageReq) throws InvalidPagingException;
19+
20+
public Page<T> findAllBySearchPaginatingWithFetches(SearchQueryBuilder<T> searchQuery, Pageable pageReq) throws InvalidPagingException;
21+
22+
public List<T> findAllBySearch(SearchQueryBuilder<T> searchQuery);
1823

1924
public Optional<T> findById(ID id);
2025

@@ -24,5 +29,5 @@ public interface BrAPIRepository<T extends BrAPIPrimaryEntity, ID extends Serial
2429

2530
public <S extends T> void refresh(S entity);
2631

27-
public void fetchXrefs(Page<T> page, Class<T> searchClass);
32+
public void fetchXrefs(Page<T> page, Class<T> searchClass) throws InvalidPagingException;
2833
}

0 commit comments

Comments
 (0)