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

Commit 0f9ec46

Browse files
committed
[BI-1909] Updating GermplasmService to eagerly fetch related date for searches
Also did some code cleanup, and added a logback.xml config file
1 parent 441814a commit 0f9ec46

File tree

6 files changed

+238
-53
lines changed

6 files changed

+238
-53
lines changed

src/main/java/org/brapi/test/BrAPITestServer/service/core/ServerInfoService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static List<Service> buildServices(){
2121
return new ServiceBuilder()
2222
.versions(VersionsEnum.V20, VersionsEnum.V21)
2323
//CORE
24-
.setBase("serviceinfo").GET().build()
24+
.setBase("serverinfo").GET().build()
2525
.setBase("commoncropnames").GET().build()
2626
.setBase("lists").GET().POST().addPath("{listDbId}").GET().PUT().withSearch()
2727
.setBase("locations").GET().POST().addPath("{locationDbId}").GET().PUT().withSearch()

src/main/java/org/brapi/test/BrAPITestServer/service/germ/GermplasmService.java

Lines changed: 173 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
11
package org.brapi.test.BrAPITestServer.service.germ;
22

33
import java.math.BigDecimal;
4-
import java.util.ArrayList;
5-
import java.util.Arrays;
6-
import java.util.List;
7-
import java.util.Optional;
4+
import java.util.*;
85
import java.util.stream.Collectors;
96

7+
import io.swagger.model.germ.*;
108
import jakarta.validation.Valid;
119

1210
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerDbIdNotFoundException;
1311
import org.brapi.test.BrAPITestServer.exceptions.BrAPIServerException;
12+
import org.brapi.test.BrAPITestServer.model.entity.AdditionalInfoEntity;
13+
import org.brapi.test.BrAPITestServer.model.entity.BrAPIBaseEntity;
14+
import org.brapi.test.BrAPITestServer.model.entity.ExternalReferenceEntity;
1415
import org.brapi.test.BrAPITestServer.model.entity.core.CropEntity;
15-
import org.brapi.test.BrAPITestServer.model.entity.germ.BreedingMethodEntity;
16-
import org.brapi.test.BrAPITestServer.model.entity.germ.DonorEntity;
17-
import org.brapi.test.BrAPITestServer.model.entity.germ.GermplasmEntity;
18-
import org.brapi.test.BrAPITestServer.model.entity.germ.GermplasmInstituteEntity;
16+
import org.brapi.test.BrAPITestServer.model.entity.germ.*;
1917
import org.brapi.test.BrAPITestServer.model.entity.germ.GermplasmInstituteEntity.InstituteTypeEnum;
20-
import org.brapi.test.BrAPITestServer.model.entity.germ.GermplasmOriginEntity;
21-
import org.brapi.test.BrAPITestServer.model.entity.germ.GermplasmSynonymEntity;
22-
import org.brapi.test.BrAPITestServer.model.entity.germ.PedigreeNodeEntity;
2318
import org.brapi.test.BrAPITestServer.model.entity.pheno.TaxonEntity;
2419
import org.brapi.test.BrAPITestServer.repository.germ.GermplasmDonorRepository;
2520
import org.brapi.test.BrAPITestServer.repository.germ.GermplasmRepository;
@@ -29,36 +24,23 @@
2924
import org.brapi.test.BrAPITestServer.service.SearchQueryBuilder;
3025
import org.brapi.test.BrAPITestServer.service.UpdateUtility;
3126
import org.brapi.test.BrAPITestServer.service.core.CropService;
27+
import org.slf4j.Logger;
28+
import org.slf4j.LoggerFactory;
3229
import org.springframework.beans.factory.annotation.Autowired;
3330
import org.springframework.data.domain.Page;
31+
import org.springframework.data.domain.PageRequest;
3432
import org.springframework.data.domain.Pageable;
3533
import org.springframework.http.HttpStatus;
3634
import org.springframework.stereotype.Service;
3735

3836
import io.swagger.model.IndexPagination;
3937
import io.swagger.model.Metadata;
40-
import io.swagger.model.germ.Germplasm;
41-
import io.swagger.model.germ.GermplasmMCPD;
4238
import io.swagger.model.germ.GermplasmMCPD.AcquisitionSourceCodeEnum;
4339
import io.swagger.model.germ.GermplasmMCPD.MlsStatusEnum;
44-
import io.swagger.model.germ.GermplasmMCPDBreedingInstitutes;
45-
import io.swagger.model.germ.GermplasmMCPDCollectingInfo;
46-
import io.swagger.model.germ.GermplasmMCPDCollectingInfoCollectingInstitutes;
47-
import io.swagger.model.germ.GermplasmMCPDCollectingInfoCollectingSite;
48-
import io.swagger.model.germ.GermplasmMCPDDonorInfo;
49-
import io.swagger.model.germ.GermplasmMCPDDonorInfoDonorInstitute;
50-
import io.swagger.model.germ.GermplasmMCPDSafetyDuplicateInstitutes;
51-
import io.swagger.model.germ.GermplasmNewRequest;
52-
import io.swagger.model.germ.GermplasmNewRequestDonors;
53-
import io.swagger.model.germ.GermplasmNewRequestSynonyms;
54-
import io.swagger.model.germ.GermplasmOrigin;
55-
import io.swagger.model.germ.GermplasmSearchRequest;
56-
import io.swagger.model.germ.GermplasmStorageTypes;
57-
import io.swagger.model.germ.TaxonID;
5840

5941
@Service
6042
public class GermplasmService {
61-
43+
private static final Logger log = LoggerFactory.getLogger(GermplasmService.class);
6244
private final GermplasmRepository germplasmRepository;
6345
private final GermplasmDonorRepository donorRepository;
6446
private final BreedingMethodService breedingMethodService;
@@ -118,16 +100,24 @@ public List<Germplasm> findGermplasm(String germplasmPUI, String germplasmDbId,
118100
}
119101

120102
public List<Germplasm> findGermplasm(@Valid GermplasmSearchRequest request, Metadata metadata) {
103+
log.debug("starting germplasm search");
121104
Page<GermplasmEntity> page = findGermplasmEntities(request, metadata);
105+
log.debug("germplasm search complete, converting germplasm entities");
122106
List<Germplasm> germplasms = page.map(this::convertFromEntity).getContent();
123107
PagingUtility.calculateMetaData(metadata, page);
108+
log.debug("done converting");
124109
return germplasms;
125110
}
126111

127112
public Page<GermplasmEntity> findGermplasmEntities(@Valid GermplasmSearchRequest request, Metadata metadata) {
128113
Pageable pageReq = PagingUtility.getPageRequest(metadata);
129114
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
130115
GermplasmEntity.class);
116+
searchQuery.leftJoinFetch("synonyms", "synonyms")
117+
.leftJoinFetch("breedingMethod", "breedingMethod")
118+
.leftJoinFetch("crop", "crop")
119+
.leftJoinFetch("pedigree", "pedigree")
120+
.leftJoinFetch("*pedigree.crossingProject", "crossingProject");
131121

132122
if (request.getProgramDbIds() != null || request.getProgramNames() != null || request.getTrialDbIds() != null
133123
|| request.getTrialNames() != null || request.getStudyDbIds() != null
@@ -161,9 +151,164 @@ public Page<GermplasmEntity> findGermplasmEntities(@Valid GermplasmSearchRequest
161151
.appendList(request.getFamilyCodes(), "familyCode");
162152

163153
Page<GermplasmEntity> page = germplasmRepository.findAllBySearch(searchQuery, pageReq);
154+
155+
if(!page.isEmpty()) {
156+
log.debug("fetching xrefs");
157+
fetchXrefs(page);
158+
log.debug("fetching additionalInfo");
159+
fetchAdditionalInfo(page);
160+
log.debug("fetching attributes");
161+
fetchAttributes(page);
162+
log.debug("fetching donors");
163+
fetchDonors(page);
164+
log.debug("fetching origins");
165+
fetchOrigin(page);
166+
log.debug("fetching institutes");
167+
fetchInstitutes(page);
168+
log.debug("fetching taxons");
169+
fetchTaxons(page);
170+
log.debug("fetching storage codes");
171+
fetchStorageCodes(page);
172+
log.debug("fetching pedigree edges");
173+
fetchPedigreeEdges(page);
174+
}
175+
164176
return page;
165177
}
166178

179+
private void fetchXrefs(Page<GermplasmEntity> page) {
180+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(GermplasmEntity.class);
181+
searchQuery.leftJoinFetch("externalReferences", "externalReferences")
182+
.leftJoinFetch("pedigree", "pedigree")
183+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
184+
185+
Page<GermplasmEntity> xrefs = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
186+
187+
Map<String, List<ExternalReferenceEntity>> xrefByEntity = new HashMap<>();
188+
xrefs.forEach(entity -> xrefByEntity.put(entity.getId(), entity.getExternalReferences()));
189+
190+
page.forEach(entity -> entity.setExternalReferences(xrefByEntity.get(entity.getId())));
191+
}
192+
193+
private void fetchAdditionalInfo(Page<GermplasmEntity> page) {
194+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(GermplasmEntity.class);
195+
searchQuery.leftJoinFetch("additionalInfo", "additionalInfo")
196+
.leftJoinFetch("pedigree", "pedigree")
197+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
198+
199+
Page<GermplasmEntity> additionalInfo = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
200+
201+
Map<String, List<AdditionalInfoEntity>> infoByEntity = new HashMap<>();
202+
additionalInfo.forEach(entity -> infoByEntity.put(entity.getId(), entity.getAdditionalInfo()));
203+
204+
page.forEach(entity -> entity.setAdditionalInfo(infoByEntity.get(entity.getId())));
205+
}
206+
207+
private void fetchAttributes(Page<GermplasmEntity> page) {
208+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
209+
GermplasmEntity.class);
210+
searchQuery.leftJoinFetch("attributes", "attributes")
211+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
212+
213+
Page<GermplasmEntity> attributes = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
214+
215+
Map<String, List<GermplasmAttributeValueEntity>> attributesByGerm = new HashMap<>();
216+
attributes.forEach(germ -> attributesByGerm.put(germ.getId(), germ.getAttributes()));
217+
218+
page.forEach(germ -> germ.setAttributes(attributesByGerm.get(germ.getId())));
219+
}
220+
221+
private void fetchDonors(Page<GermplasmEntity> page) {
222+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
223+
GermplasmEntity.class);
224+
searchQuery.leftJoinFetch("donors", "donors")
225+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
226+
227+
Page<GermplasmEntity> donors = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
228+
229+
Map<String, List<DonorEntity>> donorsByGerm = new HashMap<>();
230+
donors.forEach(germ -> donorsByGerm.put(germ.getId(), germ.getDonors()));
231+
232+
page.forEach(germ -> germ.setDonors(donorsByGerm.get(germ.getId())));
233+
}
234+
235+
private void fetchOrigin(Page<GermplasmEntity> page) {
236+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
237+
GermplasmEntity.class);
238+
searchQuery.leftJoinFetch("germplasmOrigin", "germplasmOrigin")
239+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
240+
241+
Page<GermplasmEntity> origins = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
242+
243+
Map<String, List<GermplasmOriginEntity>> originsByGerm = new HashMap<>();
244+
origins.forEach(germ -> originsByGerm.put(germ.getId(), germ.getGermplasmOrigin()));
245+
246+
page.forEach(germ -> germ.setGermplasmOrigin(originsByGerm.get(germ.getId())));
247+
}
248+
249+
private void fetchInstitutes(Page<GermplasmEntity> page) {
250+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
251+
GermplasmEntity.class);
252+
searchQuery.leftJoinFetch("institutes", "institutes")
253+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
254+
255+
Page<GermplasmEntity> institutes = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
256+
257+
Map<String, List<GermplasmInstituteEntity>> institutesByGerm = new HashMap<>();
258+
institutes.forEach(germ -> institutesByGerm.put(germ.getId(), germ.getInstitutes()));
259+
260+
page.forEach(germ -> germ.setInstitutes(institutesByGerm.get(germ.getId())));
261+
}
262+
263+
private void fetchTaxons(Page<GermplasmEntity> page) {
264+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
265+
GermplasmEntity.class);
266+
searchQuery.leftJoinFetch("taxonIds", "taxonIds")
267+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
268+
269+
Page<GermplasmEntity> taxonIds = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
270+
271+
Map<String, List<TaxonEntity>> taxonIdsByGerm = new HashMap<>();
272+
taxonIds.forEach(germ -> taxonIdsByGerm.put(germ.getId(), germ.getTaxonIds()));
273+
274+
page.forEach(germ -> germ.setTaxonIds(taxonIdsByGerm.get(germ.getId())));
275+
}
276+
277+
private void fetchStorageCodes(Page<GermplasmEntity> page) {
278+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
279+
GermplasmEntity.class);
280+
searchQuery.leftJoinFetch("typeOfGermplasmStorageCode", "typeOfGermplasmStorageCode")
281+
.appendList(page.stream().map(BrAPIBaseEntity::getId).collect(Collectors.toList()), "id");
282+
283+
Page<GermplasmEntity> storageCodes = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
284+
285+
Map<String, List<GermplasmStorageTypesEnum>> storageCodesByGerm = new HashMap<>();
286+
storageCodes.forEach(germ -> storageCodesByGerm.put(germ.getId(), germ.getTypeOfGermplasmStorageCode()));
287+
288+
page.forEach(germ -> germ.setTypeOfGermplasmStorageCode(storageCodesByGerm.get(germ.getId())));
289+
}
290+
291+
private void fetchPedigreeEdges(Page<GermplasmEntity> page) {
292+
SearchQueryBuilder<GermplasmEntity> searchQuery = new SearchQueryBuilder<GermplasmEntity>(
293+
GermplasmEntity.class);
294+
searchQuery.leftJoinFetch("pedigree", "pedigree")
295+
.leftJoinFetch("*pedigree.crossingProject", "crossingProject")
296+
.leftJoinFetch("*pedigree.edges", "pedigreeEdges")
297+
.leftJoinFetch("*pedigreeEdges.conncetedNode", "connectedNode")
298+
.appendList(page.stream()
299+
.map(BrAPIBaseEntity::getId)
300+
.collect(Collectors.toList()), "id");
301+
302+
Page<GermplasmEntity> pedigree = germplasmRepository.findAllBySearch(searchQuery, PageRequest.of(0, page.getSize()));
303+
304+
Map<String, PedigreeNodeEntity> pedigreeByGerm = new HashMap<>();
305+
pedigree.forEach(germ -> pedigreeByGerm.put(germ.getId(), germ.getPedigree()));
306+
307+
page.forEach(germ -> {
308+
germ.setPedigree(pedigreeByGerm.get(germ.getId()));
309+
});
310+
}
311+
167312
public Germplasm getGermplasm(String germplasmDbId) throws BrAPIServerException {
168313
return convertFromEntity(getGermplasmEntity(germplasmDbId, HttpStatus.NOT_FOUND));
169314
}

src/main/java/org/brapi/test/BrAPITestServer/service/pheno/ObservationService.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,9 @@ public ObservationTable findObservationsTable(ObservationSearchRequest obsReques
174174

175175
public List<Observation> findObservations(@Valid ObservationSearchRequest request, Metadata metadata) {
176176
Page<ObservationEntity> page = findObservationEntities(request, metadata);
177-
log.debug(new Date() + ": converting "+page.getSize()+" entities");
177+
log.debug("converting "+page.getSize()+" entities");
178178
List<Observation> observations = page.map(this::convertFromEntity).getContent();
179-
log.debug(new Date() + ": done converting entities");
179+
log.debug("done converting entities");
180180
PagingUtility.calculateMetaData(metadata, page);
181181
return observations;
182182
}
@@ -254,11 +254,13 @@ public Page<ObservationEntity> findObservationEntities(@Valid ObservationSearchR
254254
.appendList(request.getStudyDbIds(), "study.id").appendList(request.getStudyNames(), "study.studyName")
255255
.appendList(request.getTrialDbIds(), "trial.id").appendList(request.getTrialNames(), "trial.trialName");
256256

257-
log.debug(new Date() + ": starting search");
257+
log.debug("starting search");
258258
Page<ObservationEntity> page = observationRepository.findAllBySearch(searchQuery, pageReq);
259-
log.debug(new Date() + ": search complete");
259+
log.debug("search complete");
260260

261-
observationRepository.fetchXrefs(page, ObservationEntity.class);
261+
if(!page.isEmpty()) {
262+
observationRepository.fetchXrefs(page, ObservationEntity.class);
263+
}
262264
return page;
263265
}
264266

@@ -329,7 +331,7 @@ public Observation updateObservation(String observationDbId, ObservationNewReque
329331
}
330332

331333
public Observation convertFromEntity(ObservationEntity entity) {
332-
log.trace(new Date() + ": converting obs: " + entity.getId());
334+
log.trace("converting obs: " + entity.getId());
333335
Observation observation = new Observation();
334336
if (entity != null) {
335337
UpdateUtility.convertFromEntity(entity, observation);

src/main/java/org/brapi/test/BrAPITestServer/service/pheno/ObservationUnitService.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,9 @@ public List<ObservationUnit> findObservationUnits(@Valid ObservationUnitSearchRe
208208
}
209209
}
210210

211-
log.debug(new Date() + ": converting "+page.getSize()+" entities");
211+
log.debug("converting "+page.getSize()+" entities");
212212
List<ObservationUnit> observationUnits = page.map(observationUnitEntity -> this.convertFromEntity(observationUnitEntity, includeObservations)).getContent();
213-
log.debug(new Date() + ": done converting entities");
213+
log.debug("done converting entities");
214214
PagingUtility.calculateMetaData(metadata, page);
215215

216216
return observationUnits;
@@ -287,13 +287,15 @@ public Page<ObservationUnitEntity> findObservationUnitEntities(@Valid Observatio
287287
.appendList(request.getStudyNames(), "study.studyName").appendList(request.getTrialDbIds(), "trial.id")
288288
.appendList(request.getTrialNames(), "trial.trailName");
289289

290-
log.debug("Starting search: " + new Date());
290+
log.debug("Starting search");
291291
Page<ObservationUnitEntity> page = observationUnitRepository.findAllBySearch(searchQuery, pageReq);
292-
log.debug("Search complete: " + new Date());
292+
log.debug("Search complete");
293293

294-
observationUnitRepository.fetchXrefs(page, ObservationUnitEntity.class);
295-
fetchTreatments(page);
296-
fetchObsUnitLevelRelationships(page);
294+
if(!page.isEmpty()) {
295+
observationUnitRepository.fetchXrefs(page, ObservationUnitEntity.class);
296+
fetchTreatments(page);
297+
fetchObsUnitLevelRelationships(page);
298+
}
297299
return page;
298300
}
299301

@@ -451,7 +453,7 @@ private ObservationUnit convertFromEntity(ObservationUnitEntity entity) {
451453
}
452454

453455
private ObservationUnit convertFromEntity(ObservationUnitEntity entity, boolean convertObservations) {
454-
log.trace(new Date() + ": converting ou: " + entity.getId());
456+
log.trace("converting ou: " + entity.getId());
455457
ObservationUnit unit = new ObservationUnit();
456458
UpdateUtility.convertFromEntity(entity, unit);
457459

src/main/java/org/brapi/test/BrAPITestServer/service/pheno/ObservationVariableService.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,16 +144,18 @@ public List<ObservationVariable> findObservationVariables(ObservationVariableSea
144144
log.debug("Starting variable search: " + new Date());
145145
Page<ObservationVariableEntity> page = observationVariableRepository.findAllBySearch(searchQuery, pageReq);
146146
log.debug("Search variable complete: " + new Date());
147-
observationVariableRepository.fetchXrefs(page, ObservationVariableEntity.class);
148-
observationVariableRepository.fetchAdditionalInfo(page, ObservationVariableEntity.class);
149-
fetchSynonyms(page);
150-
fetchMethodXrefs(page);
151-
fetchMethodAdditionalInfo(page);
152-
fetchScaleXrefs(page);
153-
fetchScaleAdditionalInfo(page);
154-
fetchScaleValidValueCategories(page);
155-
fetchTraitXrefs(page);
156-
fetchTraitAdditionalInfo(page);
147+
if(!page.isEmpty()) {
148+
observationVariableRepository.fetchXrefs(page, ObservationVariableEntity.class);
149+
observationVariableRepository.fetchAdditionalInfo(page, ObservationVariableEntity.class);
150+
fetchSynonyms(page);
151+
fetchMethodXrefs(page);
152+
fetchMethodAdditionalInfo(page);
153+
fetchScaleXrefs(page);
154+
fetchScaleAdditionalInfo(page);
155+
fetchScaleValidValueCategories(page);
156+
fetchTraitXrefs(page);
157+
fetchTraitAdditionalInfo(page);
158+
}
157159

158160
log.debug(new Date() + ": converting "+page.getSize()+" entities");
159161
List<ObservationVariable> observationVariables = page.map(this::convertFromEntity).getContent();

0 commit comments

Comments
 (0)