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

Commit 399da44

Browse files
Merge pull request #51 from Breeding-Insight/germ-importer-opts
[BI-2579] Optimize Germplasm Import and Post Endpoint
2 parents 828ed81 + e1051b1 commit 399da44

15 files changed

+662
-108
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,9 @@ public ResponseEntity<GermplasmListResponse> germplasmPost(@RequestBody List<Ger
199199
log.debug("Request: " + request.getRequestURI());
200200
validateSecurityContext(request, "ROLE_USER");
201201
validateAcceptHeader(request);
202+
202203
List<Germplasm> data = germplasmService.saveGermplasm(body);
203-
pedigreeService.updateGermplasmPedigree(data);
204+
pedigreeService.updateGermplasmPedigreeForPost(data);
204205
return responseOK(new GermplasmListResponse(), new GermplasmListResponseResult(), data);
205206
}
206207

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.springframework.data.domain.Page;
1111
import org.springframework.data.domain.Pageable;
1212
import org.springframework.data.jpa.repository.JpaRepository;
13+
import org.springframework.data.jpa.repository.Query;
1314
import org.springframework.data.repository.NoRepositoryBean;
1415

1516
@NoRepositoryBean
@@ -30,4 +31,6 @@ public interface BrAPIRepository<T extends BrAPIPrimaryEntity, ID extends Serial
3031
public <S extends T> void refresh(S entity);
3132

3233
public void fetchXrefs(Page<T> page, Class<T> searchClass) throws InvalidPagingException;
34+
35+
List<T> findByIdIn(List<ID> ids);
3336
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ public Optional<T> findById(ID id) {
119119
return response;
120120
}
121121

122+
public List<T> findByIdIn(List<ID> ids) {
123+
return super.findAllById(ids);
124+
}
125+
122126
public <S extends T> S save(S entity) {
123127
entity.setAuthUserId(SecurityUtils.getCurrentUserId());
124128
return super.save(entity);

src/main/java/org/brapi/test/BrAPITestServer/repository/core/CropRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import org.springframework.data.domain.Page;
66
import org.springframework.data.domain.Pageable;
77

8+
import java.util.List;
9+
810
public interface CropRepository extends BrAPIRepository<CropEntity, String>{
911
public Page<CropEntity> findByCropName(String cropName, Pageable pageRequest);
12+
13+
public List<CropEntity> findByCropNameIn(List<String> names);
1014
}

src/main/java/org/brapi/test/BrAPITestServer/repository/germ/BreedingMethodRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@
33
import org.brapi.test.BrAPITestServer.model.entity.germ.BreedingMethodEntity;
44
import org.brapi.test.BrAPITestServer.repository.BrAPIRepository;
55

6-
public interface BreedingMethodRepository extends BrAPIRepository<BreedingMethodEntity, String>{
7-
6+
public interface BreedingMethodRepository extends BrAPIRepository<BreedingMethodEntity, String> {
87
}

src/main/java/org/brapi/test/BrAPITestServer/repository/germ/CrossingProjectRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,4 @@
44
import org.brapi.test.BrAPITestServer.repository.BrAPIRepository;
55

66
public interface CrossingProjectRepository extends BrAPIRepository<CrossingProjectEntity, String> {
7-
87
}

src/main/java/org/brapi/test/BrAPITestServer/repository/germ/GermplasmRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ public interface GermplasmRepository extends BrAPIRepository<GermplasmEntity, St
1919
@Transactional
2020
@Query("UPDATE GermplasmEntity g SET g.softDeleted = :softDeleted WHERE g.id IN :germplasmIds")
2121
int updateSoftDeletedStatusBatch(@Param("germplasmIds") List<String> germplasmIds, @Param("softDeleted") boolean softDeleted);
22+
23+
List<GermplasmEntity> findByGermplasmNameIn(List<String> germplasmNames);
2224
}

src/main/java/org/brapi/test/BrAPITestServer/repository/germ/PedigreeRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@
77

88
public interface PedigreeRepository extends BrAPIRepository<PedigreeNodeEntity, String>, PedigreeRepositoryCustom {
99
public List<PedigreeNodeEntity> findByGermplasm_Id(String germplasmDbId);
10+
11+
public List<PedigreeNodeEntity> findByGermplasm_IdIn(List<String> germplasmDbIds);
1012
}

src/main/java/org/brapi/test/BrAPITestServer/service/UpdateUtility.java

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package org.brapi.test.BrAPITestServer.service;
22

33
import io.swagger.model.BrAPIDataModel;
4+
import io.swagger.model.ExternalReferences;
5+
import io.swagger.model.ExternalReferencesInner;
46
import org.brapi.test.BrAPITestServer.model.entity.BrAPIPrimaryEntity;
7+
import org.brapi.test.BrAPITestServer.model.entity.ExternalReferenceEntity;
58

6-
import java.util.Optional;
9+
import java.util.*;
10+
import java.util.stream.Collectors;
711

812
public class UpdateUtility {
913

@@ -34,12 +38,60 @@ public static <T extends BrAPIDataModel> T convertFromEntity(BrAPIPrimaryEntity
3438
}
3539

3640
public static <T extends BrAPIPrimaryEntity> T updateEntity(BrAPIDataModel model, T entity) {
41+
updateAdditionalInfo(model, entity);
42+
if (model.getExternalReferences() != null) {
43+
entity.setExternalReferences(model.getExternalReferences());
44+
}
45+
return entity;
46+
}
47+
48+
private static <T extends BrAPIPrimaryEntity> void updateAdditionalInfo(BrAPIDataModel model, T entity) {
3749
if (model.getAdditionalInfo() != null) {
3850
entity.setAdditionalInfo(model.getAdditionalInfo());
3951
}
52+
}
53+
54+
/*
55+
Call this method when external references are eagerly loaded for bulk updates to entities to ensure
56+
unnecessary deletions and insertions don't occur. This will improve performance in these use cases.
57+
58+
WARN: If refs aren't eagerly loaded, hibernate will generate a query on the entity.getReferences() call. This could slow performance.
59+
60+
This method will check if the external references in the model already exist in the entity, and will prevent setting
61+
the entity with the model's refs.
62+
63+
TODO: See if migrating all callers of updateEntity to this method can be done.
64+
*/
65+
public static <T extends BrAPIPrimaryEntity> T updateEntityCheckExRefs(BrAPIDataModel model, T entity) {
66+
updateAdditionalInfo(model, entity);
4067
if (model.getExternalReferences() != null) {
41-
entity.setExternalReferences(model.getExternalReferences());
68+
69+
ExternalReferences exRefs = model.getExternalReferences();
70+
71+
Map<String, List<ExternalReferenceEntity>> existingRefsById =
72+
entity.getExternalReferences() != null ?
73+
entity.getExternalReferences().stream().collect(Collectors.groupingBy(ExternalReferenceEntity::getExternalReferenceId))
74+
: Collections.emptyMap();
75+
76+
77+
List<ExternalReferencesInner> newExRefs = exRefs.stream().filter(exRef -> {
78+
List<ExternalReferenceEntity> existingEntityRefList = existingRefsById.get(exRef.getReferenceID());
79+
80+
if (existingEntityRefList == null || existingEntityRefList.isEmpty()) {
81+
return true;
82+
}
83+
84+
ExternalReferenceEntity existingEntityRef = existingEntityRefList.get(0);
85+
86+
return !existingEntityRef.getExternalReferenceSource().equals(exRef.getReferenceSource());
87+
}).collect(Collectors.toList());
88+
89+
if (!newExRefs.isEmpty()) {
90+
// Detected different ex refs than what is in the original entity. Updating entity exRefs.
91+
entity.setExternalReferences(model.getExternalReferences());
92+
}
93+
// If there are no new exRefs no update is made.
4294
}
4395
return entity;
4496
}
45-
}
97+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,16 @@ public CropEntity getCropEntity(String commonCropName) throws BrAPIServerExcepti
6363
return entity;
6464
}
6565

66+
public List<CropEntity> findCropsByNames(List<String> names) {
67+
return cropRepository.findByCropNameIn(names);
68+
}
69+
6670
public CropEntity saveCropEntity(String commonCropName) throws BrAPIServerException {
6771
CropEntity entity = null;
6872
if (commonCropName != null) {
6973
entity = new CropEntity();
7074
entity.setCropName(commonCropName);
71-
entity = cropRepository.saveAndFlush(entity);
75+
entity = cropRepository.save(entity);
7276
}
7377
return entity;
7478
}

0 commit comments

Comments
 (0)