From 09543aa6c8c4e2a76d5d47a3bea2e0be9818f2f9 Mon Sep 17 00:00:00 2001 From: Jason Loux Date: Fri, 21 Aug 2026 18:09:52 -0400 Subject: [PATCH 1/7] Initial changes to remove cache get, address mass unit test failures --- .../brapi/v2/dao/BrAPIGermplasmDAO.java | 59 ++++++++++++++++++- .../brapps/importer/model/base/Germplasm.java | 10 +++- .../germplasm/GermplasmProcessor.java | 15 +++-- ...eedingMethodControllerIntegrationTest.java | 5 ++ .../ExperimentControllerIntegrationTest.java | 15 +++-- ...leSubmissionControllerIntegrationTest.java | 10 +++- ...vationLevelsControllerIntegrationTest.java | 9 ++- ...ervationUnitControllerIntegrationTest.java | 9 ++- ...ObservationsControllerIntegrationTest.java | 9 ++- .../brapi/v2/BrAPITestUtils.java | 10 +++- ...tionVariableControllerIntegrationTest.java | 9 ++- .../importer/ExperimentFileImportTest.java | 57 ++++++++++-------- .../SampleSubmissionFileImportTest.java | 22 ++++--- .../BrAPIGermplasmServiceUnitTest.java | 21 +++++-- 14 files changed, 198 insertions(+), 62 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java index 478c99bcf..572a6ba4c 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -25,8 +25,10 @@ import lombok.extern.slf4j.Slf4j; import org.brapi.client.v2.ApiResponse; import org.brapi.client.v2.model.exceptions.ApiException; +import org.brapi.client.v2.model.queryParams.germplasm.GermplasmQueryParams; import org.brapi.client.v2.modules.germplasm.GermplasmApi; import org.brapi.v2.model.BrAPIExternalReference; +import org.brapi.v2.model.core.BrAPIProgram; import org.brapi.v2.model.germ.BrAPIGermplasm; import org.brapi.v2.model.germ.BrAPIGermplasmSynonyms; import org.brapi.v2.model.germ.request.BrAPIGermplasmSearchRequest; @@ -72,13 +74,21 @@ public class BrAPIGermplasmDAO { private final BrAPIEndpointProvider brAPIEndpointProvider; + private final int brapiMaxPageSize; + @Inject - public BrAPIGermplasmDAO(ProgramDAO programDAO, ImportDAO importDAO, BrAPIDAOUtil brAPIDAOUtil, ProgramCacheProvider programCacheProvider, BrAPIEndpointProvider brAPIEndpointProvider) { + public BrAPIGermplasmDAO(ProgramDAO programDAO, + ImportDAO importDAO, + BrAPIDAOUtil brAPIDAOUtil, + ProgramCacheProvider programCacheProvider, + BrAPIEndpointProvider brAPIEndpointProvider, + @Property(name = "brapi.cache.fetch-page-size") int brapiFetchPageSize) { this.programDAO = programDAO; this.importDAO = importDAO; this.brAPIDAOUtil = brAPIDAOUtil; this.programGermplasmCache = programCacheProvider.getProgramCache(this::fetchProgramGermplasm, BrAPIGermplasm.class); this.brAPIEndpointProvider = brAPIEndpointProvider; + this.brapiMaxPageSize = brapiFetchPageSize; } @Scheduled(initialDelay = "${startup.delay.germplasm}") @@ -101,7 +111,29 @@ public void setup() { * @throws ApiException */ public List getGermplasm(UUID programId) throws ApiException { - return new ArrayList<>(programGermplasmCache.get(programId).values()); + Program program = programDAO.get(programId) + .stream() + .findFirst() + .orElseThrow(); + + if (program.getId() == null) { + throw new InternalServerException("BI-API Program or Program ID is null"); + } + + String brapiProgramDbId = Optional.of(program) + .map(Program::getBrapiProgram) + .map(BrAPIProgram::getProgramDbId) + .orElse(null); + + if (brapiProgramDbId == null) { + brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); + } + + GermplasmQueryParams germplasmQueryParams = GermplasmQueryParams.builder() + .programDbId(brapiProgramDbId) + .build(); + + return getBrAPIGermplasmUsingBrAPIProgramId(germplasmQueryParams, program); } /** @@ -281,6 +313,29 @@ private Map processGermplasmForDisplay(List getBrAPIGermplasmUsingBrAPIProgramId(GermplasmQueryParams germplasmQueryParams, Program program) throws ApiException { + + + if (germplasmQueryParams.page() == null) { + germplasmQueryParams.setPage(0); + } + + if (germplasmQueryParams.pageSize() == null) { + germplasmQueryParams.setPageSize(brapiMaxPageSize); + } + + GermplasmApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(program.getId()), GermplasmApi.class); + + List result = brAPIDAOUtil.get(api::germplasmGet, germplasmQueryParams); + + // TODO: Once cache is removed for this class, fix processGermplasmForDisplay to return List [BI-2906] + return new ArrayList<>(processGermplasmForDisplay(result, program.getKey()).values()); + } + // TODO: hack for now, probably should update breedbase // Made a JIRA card BI-1883 for this // Breedbase will return NA/NA for no pedigree or NA/father, mother/NA diff --git a/src/main/java/org/breedinginsight/brapps/importer/model/base/Germplasm.java b/src/main/java/org/breedinginsight/brapps/importer/model/base/Germplasm.java index e3691d5be..ca87fae6f 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/model/base/Germplasm.java +++ b/src/main/java/org/breedinginsight/brapps/importer/model/base/Germplasm.java @@ -365,12 +365,20 @@ private void setBrAPIGermplasmCommitFields(BrAPIGermplasm germplasm, String prog } } - public BrAPIGermplasm constructBrAPIGermplasm(Program program, ProgramBreedingMethodEntity breedingMethod, User user, boolean commit, String referenceSource, Supplier nextVal, UUID listId) { + public BrAPIGermplasm constructBrAPIGermplasm(Program program, + ProgramBreedingMethodEntity breedingMethod, + User user, + boolean commit, + String referenceSource, + Supplier nextVal, + UUID listId, + String brapiProgramDbId) { BrAPIGermplasm germplasm = constructBrAPIGermplasm(breedingMethod, user, listId); if (commit) { setBrAPIGermplasmCommitFields(germplasm, program.getKey(), referenceSource, nextVal); } germplasm.setCommonCropName(program.getBrapiProgram().getCommonCropName()); + germplasm.setProgramDbId(brapiProgramDbId); // Set program id in external references BrAPIExternalReference newReference = new BrAPIExternalReference(); diff --git a/src/main/java/org/breedinginsight/brapps/importer/services/processors/germplasm/GermplasmProcessor.java b/src/main/java/org/breedinginsight/brapps/importer/services/processors/germplasm/GermplasmProcessor.java index 899924f4b..e0eaf3c53 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/services/processors/germplasm/GermplasmProcessor.java +++ b/src/main/java/org/breedinginsight/brapps/importer/services/processors/germplasm/GermplasmProcessor.java @@ -43,8 +43,10 @@ import org.breedinginsight.brapps.importer.model.response.ImportPreviewStatistics; import org.breedinginsight.brapps.importer.model.response.PendingImportObject; import org.breedinginsight.brapps.importer.services.processors.Processor; +import org.breedinginsight.dao.db.tables.daos.ProgramDao; import org.breedinginsight.dao.db.tables.pojos.ProgramBreedingMethodEntity; import org.breedinginsight.daos.BreedingMethodDAO; +import org.breedinginsight.daos.impl.ProgramDAOImpl; import org.breedinginsight.model.Program; import org.breedinginsight.model.User; import org.breedinginsight.services.exceptions.ValidatorException; @@ -64,6 +66,7 @@ public class GermplasmProcessor implements Processor { private static final String NAME = "Germplasm"; + private final ProgramDAOImpl programDAOImpl; @Property(name = "brapi.server.reference-source") private String BRAPI_REFERENCE_SOURCE; @@ -109,13 +112,14 @@ public class GermplasmProcessor implements Processor { }; @Inject - public GermplasmProcessor(BrAPIGermplasmService brAPIGermplasmService, DSLContext dsl, BreedingMethodDAO breedingMethodDAO, BrAPIListDAO brAPIListDAO, BrAPIGermplasmDAO brAPIGermplasmDAO) { + public GermplasmProcessor(BrAPIGermplasmService brAPIGermplasmService, DSLContext dsl, BreedingMethodDAO breedingMethodDAO, BrAPIListDAO brAPIListDAO, BrAPIGermplasmDAO brAPIGermplasmDAO, ProgramDAOImpl programDAOImpl) { this.brAPIGermplasmService = brAPIGermplasmService; this.dsl = dsl; this.breedingMethodDAO = breedingMethodDAO; this.brAPIGermplasmDAO = brAPIGermplasmDAO; this.brAPIListDAO = brAPIListDAO; this.brAPIGermplasmService = brAPIGermplasmService; + this.programDAOImpl = programDAOImpl; } public void getExistingBrapiData(List importRows, Program program) throws ApiException { @@ -289,6 +293,8 @@ public Map process(ImportUpload upload, List
userProvidedEntryNumbers = new ArrayList<>(); ValidationErrors validationErrors = new ValidationErrors(); + String brapiProgramDbId = programDAOImpl.getProgramBrAPI(program).getProgramDbId(); + for (int i = 0; i < importRows.size(); i++) { log.debug("processing germplasm row: {}", i + 1); BrAPIImport brapiImport = importRows.get(i); @@ -315,7 +321,7 @@ public Map process(ImportUpload upload, List
process(ImportUpload upload, List
breedingMethods, List badBreedingMethods, - Program program, UUID importListId, boolean commit, PendingImport mappedImportRow, int i, User user, Supplier nextVal) { + Program program, UUID importListId, boolean commit, PendingImport mappedImportRow, int i, User user, Supplier nextVal, + String brapiProgramDbId) { germplasm = removeBreedingMethodBlanks(germplasm); //Validating if Breeding Method exists for valid parent entries validateGermplasmBreedingMethod(germplasm, i + 2, validationErrors); @@ -361,7 +368,7 @@ private void processNewGermplasm(Germplasm germplasm, ValidationErrors validatio numNewPedigreeConnections++; } - BrAPIGermplasm newGermplasm = germplasm.constructBrAPIGermplasm(program, breedingMethod, user, commit, BRAPI_REFERENCE_SOURCE, nextVal, importListId); + BrAPIGermplasm newGermplasm = germplasm.constructBrAPIGermplasm(program, breedingMethod, user, commit, BRAPI_REFERENCE_SOURCE, nextVal, importListId, brapiProgramDbId); newGermplasmList.add(newGermplasm); // Assign status of the germplasm diff --git a/src/test/java/org/breedinginsight/api/v1/controller/BreedingMethodControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/BreedingMethodControllerIntegrationTest.java index c3ba499c4..cb379596e 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/BreedingMethodControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/BreedingMethodControllerIntegrationTest.java @@ -355,6 +355,7 @@ public void deleteProgramMethod() { @Test public void createGermplasmWithProgramMethod() throws ApiException { Program program = createProgram("createGermProgBM", "CGBM", "CGERBM"); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); ProgramBreedingMethodEntity method = ProgramBreedingMethodEntity.builder() .programId(program.getId()) @@ -401,6 +402,8 @@ public void createGermplasmWithProgramMethod() throws ApiException { .externalReferences(List.of(programRef, germIdRef)) .accessionNumber(accessionNum); + germplasm.setProgramDbId(brapiProgramDbId); + assertDoesNotThrow(() -> germplasmService.createBrAPIGermplasm(List.of(germplasm), program.getId(), null)); String germplasmUrl = String.format("/programs/%s/brapi/v2/germplasm", program.getId()); @@ -427,6 +430,7 @@ public void createGermplasmWithProgramMethod() throws ApiException { @Test public void tryDeleteProgramMethodInUse() throws ApiException { Program program = createProgram("tryDeleteProgramBM", "TDBM", "TRYDBM"); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); ProgramBreedingMethodEntity method = ProgramBreedingMethodEntity.builder() .programId(program.getId()) @@ -472,6 +476,7 @@ public void tryDeleteProgramMethodInUse() throws ApiException { .putAdditionalInfoItem(BrAPIAdditionalInfoFields.CREATED_DATE, formatter.format(now)) .externalReferences(List.of(programRef, germIdRef)) .accessionNumber(accessionNum); + germplasm.setProgramDbId(brapiProgramDbId); assertDoesNotThrow(() -> germplasmService.createBrAPIGermplasm(List.of(germplasm), program.getId(), null)); diff --git a/src/test/java/org/breedinginsight/api/v1/controller/ExperimentControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/ExperimentControllerIntegrationTest.java index d95270d27..c09bf9a97 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/ExperimentControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/ExperimentControllerIntegrationTest.java @@ -24,7 +24,6 @@ import org.breedinginsight.api.model.v1.request.ProgramRequest; import org.breedinginsight.api.model.v1.request.SpeciesRequest; import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO; -import org.breedinginsight.brapi.v2.model.request.query.ExperimentQuery; import org.breedinginsight.brapi.v2.services.BrAPITrialService; import org.breedinginsight.brapps.importer.ImportTestUtils; import org.breedinginsight.brapps.importer.model.exports.FileType; @@ -34,6 +33,7 @@ import org.breedinginsight.dao.db.tables.pojos.ProgramUserRoleEntity; import org.breedinginsight.dao.db.tables.pojos.RoleEntity; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.ProgramUserDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; @@ -107,6 +107,8 @@ public class ExperimentControllerIntegrationTest extends BrAPITest { private final Gson gson = new GsonBuilder().registerTypeAdapter(OffsetDateTime.class, (JsonDeserializer) (json, type, context) -> OffsetDateTime.parse(json.getAsString())) .create(); + @Inject + private ProgramDAO programDAO; @BeforeAll void setup() throws Exception { @@ -166,8 +168,10 @@ void setup() throws Exception { throw e; } + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); + // Add germplasm to program - List germplasm = createGermplasm(1); + List germplasm = createGermplasm(1, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceID(program.getId().toString()); @@ -1043,7 +1047,9 @@ private Program createSeededProgram(String prefix) throws Exception { AuthenticatedUser user = new AuthenticatedUser(testUser.getName(), new ArrayList<>(), testUser.getId(), new ArrayList<>()); ontologyService.createTraits(seededProgram.getId(), createTraits(2), user, false); - List germplasm = createGermplasm(1); + String brapiProgramDbId = programDAO.getProgramBrAPI(seededProgram).getProgramDbId(); + + List germplasm = createGermplasm(1, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceID(seededProgram.getId().toString()); @@ -1109,7 +1115,7 @@ private List createTraits(int numToCreate) { return traits; } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -1128,6 +1134,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/api/v1/controller/SampleSubmissionControllerIntegrationTest.java b/src/test/java/org/breedinginsight/api/v1/controller/SampleSubmissionControllerIntegrationTest.java index 79c8095cb..3517b5832 100644 --- a/src/test/java/org/breedinginsight/api/v1/controller/SampleSubmissionControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/api/v1/controller/SampleSubmissionControllerIntegrationTest.java @@ -43,6 +43,7 @@ import org.breedinginsight.brapps.importer.model.imports.sample.SampleSubmissionImport.Columns; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.*; @@ -91,6 +92,8 @@ public class SampleSubmissionControllerIntegrationTest extends BrAPITest { private String newExperimentWorkflowId; private final Gson gson = new BrAPIClient().getJSON().getGson(); + @Inject + private ProgramDAO programDao; @BeforeAll void setup() throws Exception { @@ -126,7 +129,9 @@ void setup() throws Exception { dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId()); dsl.execute(securityFp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); - List germplasm = createGermplasm(96); + String brapiProgramDbId = programDao.getProgramBrAPI(program).getProgramDbId(); + + List germplasm = createGermplasm(96, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceID(program.getId().toString()); @@ -461,7 +466,7 @@ public File writeSubmissionToFile(List> data) throws IOExcep return file; } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -480,6 +485,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java index 4f15c553d..f74caa597 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationLevelsControllerIntegrationTest.java @@ -41,6 +41,7 @@ import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.*; @@ -87,6 +88,8 @@ public class BrAPIObservationLevelsControllerIntegrationTest extends BrAPITest { private OntologyService ontologyService; @Inject private BrAPIGermplasmDAO germplasmDAO; + @Inject + private ProgramDAO programDAO; @Inject @Client("/${micronaut.bi.api.version}") @@ -127,6 +130,7 @@ void setup() throws Exception { .key("TEST") .build(); program = TestUtils.insertAndFetchTestProgram(gson, client, programRequest); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId()); dsl.execute(securityFp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); @@ -154,7 +158,7 @@ void setup() throws Exception { } // Add germplasm to program - List germplasm = createGermplasm(1); + List germplasm = createGermplasm(1, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceID(program.getId().toString()); @@ -255,7 +259,7 @@ private String getEnvId(JsonObject result, int index) { .get("referenceId").getAsString(); } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -274,6 +278,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java index de876c626..0076fda95 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationUnitControllerIntegrationTest.java @@ -48,6 +48,7 @@ import org.breedinginsight.brapps.importer.services.processors.experiment.service.TrialService; import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.*; @@ -96,6 +97,8 @@ public class BrAPIObservationUnitControllerIntegrationTest extends BrAPITest { private BrAPIGermplasmDAO germplasmDAO; @Inject private BrAPITrialDAO brapiTrialDAO; + @Inject + private ProgramDAO programDAO; @Inject @Client("/${micronaut.bi.api.version}") @@ -136,6 +139,7 @@ void setup() throws Exception { .key("TEST") .build(); program = TestUtils.insertAndFetchTestProgram(gson, client, programRequest); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId()); dsl.execute(securityFp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); @@ -163,7 +167,7 @@ void setup() throws Exception { } // Add germplasm to program - List germplasm = createGermplasm(1); + List germplasm = createGermplasm(1, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceID(program.getId().toString()); @@ -388,7 +392,7 @@ private String getEnvId(JsonObject result, int index) { .get("referenceId").getAsString(); } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -407,6 +411,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java index 59cd33630..8159e2bba 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIObservationsControllerIntegrationTest.java @@ -44,6 +44,7 @@ import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.*; @@ -92,6 +93,8 @@ public class BrAPIObservationsControllerIntegrationTest extends BrAPITest { private OntologyService ontologyService; @Inject private BrAPIGermplasmDAO germplasmDAO; + @Inject + private ProgramDAO programDAO; @Inject @Client("/${micronaut.bi.api.version}") @@ -132,6 +135,7 @@ void setup() throws Exception { .key("TEST") .build(); program = TestUtils.insertAndFetchTestProgram(gson, client, programRequest); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId()); dsl.execute(securityFp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); @@ -159,7 +163,7 @@ void setup() throws Exception { } // Add germplasm to program - List germplasm = createGermplasm(1); + List germplasm = createGermplasm(1, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceID(program.getId().toString()); @@ -434,7 +438,7 @@ private String getEnvId(JsonObject result, int index) { .get("referenceId").getAsString(); } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -453,6 +457,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPITestUtils.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPITestUtils.java index 6af62c7cf..756d66db3 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPITestUtils.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPITestUtils.java @@ -38,12 +38,12 @@ import org.breedinginsight.api.model.v1.request.SpeciesRequest; import org.breedinginsight.api.v1.controller.TestTokenValidator; import org.breedinginsight.brapi.v2.dao.BrAPIGermplasmDAO; -import org.breedinginsight.brapi.v2.model.request.query.ExperimentQuery; import org.breedinginsight.brapi.v2.services.BrAPITrialService; import org.breedinginsight.brapps.importer.ImportTestUtils; import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.*; @@ -81,6 +81,8 @@ public class BrAPITestUtils { private BrAPIGermplasmDAO germplasmDAO; @Inject private BrAPITrialService brAPITrialService; + @Inject + ProgramDAO programDAO; @Inject @Client("/${micronaut.bi.api.version}") @@ -122,6 +124,7 @@ public Tuple2> setupTestProgram(DSLContext brAPIDslContext .key("TEST") .build(); Program program = TestUtils.insertAndFetchTestProgram(gson, client, programRequest); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); // Add Program Administrator user. dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId()); @@ -153,7 +156,7 @@ public Tuple2> setupTestProgram(DSLContext brAPIDslContext } // Add germplasm to program - List germplasm = createGermplasm(1, BRAPI_REFERENCE_SOURCE); + List germplasm = createGermplasm(1, BRAPI_REFERENCE_SOURCE, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceId(program.getId().toString()); @@ -249,7 +252,7 @@ public String getEnvId(JsonObject result, int index) { .get("referenceId").getAsString(); } - public List createGermplasm(int numToCreate, String referenceSource) { + public List createGermplasm(int numToCreate, String referenceSource, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -268,6 +271,7 @@ public List createGermplasm(int numToCreate, String referenceSou testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java index f8a99ac35..50227f0e0 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/BrAPIV2ObservationVariableControllerIntegrationTest.java @@ -47,6 +47,7 @@ import org.breedinginsight.brapps.importer.model.imports.experimentObservation.ExperimentObservation; import org.breedinginsight.dao.db.enums.DataType; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.*; @@ -93,6 +94,8 @@ public class BrAPIV2ObservationVariableControllerIntegrationTest extends BrAPITe private BrAPIGermplasmDAO germplasmDAO; @Inject BrAPITrialService brAPITrialService; + @Inject + ProgramDAO programDAO; @Inject @Client("/${micronaut.bi.api.version}") @@ -134,6 +137,7 @@ void setup() throws Exception { .key("TEST") .build(); program = TestUtils.insertAndFetchTestProgram(gson, client, programRequest); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId()); dsl.execute(securityFp.get("InsertSystemRoleAdmin"), testUser.getId().toString()); @@ -161,7 +165,7 @@ void setup() throws Exception { } // Add germplasm to program - List germplasm = createGermplasm(1); + List germplasm = createGermplasm(1, brapiProgramDbId); BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", BRAPI_REFERENCE_SOURCE)); newReference.setReferenceId(program.getId().toString()); @@ -359,7 +363,7 @@ private String getEnvId(JsonObject result, int index) { .get("referenceId").getAsString(); } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -378,6 +382,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceId(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java b/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java index c8028150e..30240f5fb 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java +++ b/src/test/java/org/breedinginsight/brapps/importer/ExperimentFileImportTest.java @@ -204,7 +204,7 @@ public void appendExperimentWithObsVarFromPriorDataset() { // Create a plot-level dataset that includes observation variable tt_test_1 List traits = importTestUtils.createTraits(1); - Program program = createProgram("Append Exp with Prior Observations Vars", "EXPPRI", "EXPPRI", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("Append Exp with Prior Observations Vars", "EXPPRI", "EXPPRI", BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -310,7 +310,7 @@ public void appendExperimentMultipleDatasets() { // Create a plot-level dataset List traits = importTestUtils.createTraits(1); - Program program = createProgram("Append Exp with Multiple Datasets", "MULSET", "MULSET", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("Append Exp with Multiple Datasets", "MULSET", "MULSET", BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -441,7 +441,7 @@ public void appendExperimentMultipleDatasets() { @SneakyThrows public void importNewExpNewLocNoObsSuccess() { log.debug("importNewExpNewLocNoObsSuccess"); - Program program = createProgram("New Exp and Loc", "NEXPL", "NEXPL", BRAPI_REFERENCE_SOURCE, createGermplasm(1), null); + Program program = createProgram("New Exp and Loc", "NEXPL", "NEXPL", BRAPI_REFERENCE_SOURCE, 1, null); Map validRow = new HashMap<>(); validRow.put(Columns.GERMPLASM_GID, "1"); validRow.put(Columns.TEST_CHECK, "T"); @@ -476,7 +476,7 @@ public void importNewExpNewLocNoObsSuccess() { @SneakyThrows public void importNewExpMultiNewEnvSuccess() { log.debug("importNewExpMultiNewEnvSucces"); - Program program = createProgram("New Exp and Multi New Env", "MULENV", "MULENV", BRAPI_REFERENCE_SOURCE, createGermplasm(1), null); + Program program = createProgram("New Exp and Multi New Env", "MULENV", "MULENV", BRAPI_REFERENCE_SOURCE, 1, null); Map firstEnv = new HashMap<>(); firstEnv.put(Columns.GERMPLASM_GID, "1"); firstEnv.put(Columns.TEST_CHECK, "T"); @@ -536,7 +536,7 @@ public void importNewExpMultiNewEnvSuccess() { @SneakyThrows public void importExistingExpAndEnvErrorMessage() { log.debug("importExistingExpAndEnvErrorMessage"); - Program program = createProgram("New Env Existing Exp", "DUPENV", "DUPENV", BRAPI_REFERENCE_SOURCE, createGermplasm(1), null); + Program program = createProgram("New Env Existing Exp", "DUPENV", "DUPENV", BRAPI_REFERENCE_SOURCE, 1, null); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -579,7 +579,7 @@ public void importExistingExpAndEnvErrorMessage() { @SneakyThrows public void importNewEnvNoObsSuccess() { log.debug("importNewEnvNoObsSuccess"); - Program program = createProgram("New Env", "NEWENV", "NEWENV", BRAPI_REFERENCE_SOURCE, createGermplasm(1), null); + Program program = createProgram("New Env", "NEWENV", "NEWENV", BRAPI_REFERENCE_SOURCE, 1, null); Map newEnv = new HashMap<>(); newEnv.put(Columns.GERMPLASM_GID, "1"); @@ -614,7 +614,7 @@ public void importNewEnvNoObsSuccess() { @SneakyThrows public void verifyMissingDataThrowsError(boolean commit) { log.debug("verifyMissingDataThrowsError"); - Program program = createProgram("Missing Req Cols "+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), null); + Program program = createProgram("Missing Req Cols "+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, null); Map base = new HashMap<>(); base.put(Columns.GERMPLASM_GID, "1"); @@ -685,7 +685,7 @@ public void verifyMissingDataThrowsError(boolean commit) { public void importNewExpWithObsVar() { log.debug("importNewExpWithObsVar"); List traits = importTestUtils.createTraits(1); - Program program = createProgram("New Exp with Observations Vars", "EXPVRR", "EXPVRR", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New Exp with Observations Vars", "EXPVRR", "EXPVRR", BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -723,7 +723,7 @@ public void importNewExpWithObsVar() { @SneakyThrows public void verifyDiffYearSameEnvThrowsError(boolean commit) { log.debug("verifyDiffYEarSameEnvThrowsError"); - Program program = createProgram("Diff Years "+(commit ? "C" : "P"), "YEARS"+(commit ? "C" : "P"), "YEARS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(2), null); + Program program = createProgram("Diff Years "+(commit ? "C" : "P"), "YEARS"+(commit ? "C" : "P"), "YEARS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 2, null); List> rows = new ArrayList<>(); Map row = new HashMap<>(); @@ -763,7 +763,7 @@ public void verifyDiffYearSameEnvThrowsError(boolean commit) { @SneakyThrows public void verifyDiffLocSameEnvThrowsError(boolean commit) { log.debug("verifyDiffLocSameEnvThrowsError"); - Program program = createProgram("Diff Locations "+(commit ? "C" : "P"), "LOCS"+(commit ? "C" : "P"), "LOCS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(2), null); + Program program = createProgram("Diff Locations "+(commit ? "C" : "P"), "LOCS"+(commit ? "C" : "P"), "LOCS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 2, null); List> rows = new ArrayList<>(); Map row = new HashMap<>(); @@ -803,7 +803,7 @@ public void verifyDiffLocSameEnvThrowsError(boolean commit) { public void importNewExpWithObs(boolean commit) { log.debug("importNewExpWithObs"); List traits = importTestUtils.createTraits(1); - Program program = createProgram("New Exp with Observations "+(commit ? "C" : "P"), "NEXOB"+(commit ? "C" : "P"), "NEXOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New Exp with Observations "+(commit ? "C" : "P"), "NEXOB"+(commit ? "C" : "P"), "NEXOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -844,7 +844,7 @@ public void importNewExpWithObs(boolean commit) { public void verifyFailureImportNewExpWithInvalidObs(boolean commit) { log.debug("verifyFailureImportNewExpWithInvalidObs"); List traits = importTestUtils.createTraits(1); - Program program = createProgram("Invalid Observations "+(commit ? "C" : "P"), "INVOB"+(commit ? "C" : "P"), "INVOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("Invalid Observations "+(commit ? "C" : "P"), "INVOB"+(commit ? "C" : "P"), "INVOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -870,7 +870,7 @@ public void verifyFailureImportNewExpWithInvalidObs(boolean commit) { @SneakyThrows public void verifyFailureNewOuExistingEnv(boolean commit) { log.debug("verifyFailureNewOuExistingEnv"); - Program program = createProgram("New OU Existing Env "+(commit ? "C" : "P"), "FLOU"+(commit ? "C" : "P"), "FLOU"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), null); + Program program = createProgram("New OU Existing Env "+(commit ? "C" : "P"), "FLOU"+(commit ? "C" : "P"), "FLOU"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, null); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -904,7 +904,7 @@ public void verifyFailureNewOuExistingEnv(boolean commit) { public void importNewObsVarExistingOu() { log.debug("importNewObsVarExistingOu"); List traits = importTestUtils.createTraits(2); - Program program = createProgram("New ObsVar Existing OU", "OUVAR", "OUVAR", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New ObsVar Existing OU", "OUVAR", "OUVAR", BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -968,7 +968,7 @@ public void importNewObsVarExistingOu() { public void importNewObsVarByObsUnitId() { log.debug("importNewObsVarByObsUnitId"); List traits = importTestUtils.createTraits(2); - Program program = createProgram("New ObsVar Referring to OU by ID", "OUVAR", "VAROU", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New ObsVar Referring to OU by ID", "OUVAR", "VAROU", BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1020,7 +1020,7 @@ public void importNewObsVarByObsUnitId() { public void importNewObservationDataByObsUnitId(boolean commit) { log.debug("importNewObservationDataByObsUnitId"); List traits = importTestUtils.createTraits(1); - Program program = createProgram("New Observation Referring to OU by ID"+(commit ? "C" : "P"), "OUDAT"+(commit ? "C" : "P"), "DATOU"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New Observation Referring to OU by ID"+(commit ? "C" : "P"), "OUDAT"+(commit ? "C" : "P"), "DATOU"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1094,7 +1094,7 @@ public void importNewObservationDataByObsUnitId(boolean commit) { @SneakyThrows public void verifyBlankObsInOverwriteIsNoOp(boolean commit) { List traits = importTestUtils.createTraits(1); - Program program = createProgram("Overwrite Attempt With Blank Obs"+(commit ? "C" : "P"), "NOOP"+(commit ? "C" : "P"), "NOOP"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("Overwrite Attempt With Blank Obs"+(commit ? "C" : "P"), "NOOP"+(commit ? "C" : "P"), "NOOP"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1163,7 +1163,7 @@ public void verifyBlankObsInOverwriteIsNoOp(boolean commit) { public void importNewObsExistingOu(boolean commit) { log.debug("importNewObsExistingOu"); List traits = importTestUtils.createTraits(1); - Program program = createProgram("New Obs Existing OU "+(commit ? "C" : "P"), "OUOBS"+(commit ? "C" : "P"), "OUOBS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New Obs Existing OU "+(commit ? "C" : "P"), "OUOBS"+(commit ? "C" : "P"), "OUOBS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1228,7 +1228,7 @@ public void importNewObsExistingOu(boolean commit) { public void verifyFailureImportNewObsExistingOuWithExistingObs(boolean commit) { log.debug("verifyFailureImportNewObsExistingOuWithExistingObs"); List traits = importTestUtils.createTraits(1); - Program program = createProgram("New Obs Existing Obs "+(commit ? "C" : "P"), "FEXOB"+(commit ? "C" : "P"), "FEXOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New Obs Existing Obs "+(commit ? "C" : "P"), "FEXOB"+(commit ? "C" : "P"), "FEXOB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1285,7 +1285,7 @@ public void verifyFailureImportNewObsExistingOuWithExistingObs(boolean commit) { public void importSecondExpAfterFirstExpWithObs() { log.debug("importSecondExpAfterFirstExpWithObs"); List traits = importTestUtils.createTraits(1); - Program program = createProgram("New Exp After First", "NEAF", "NEAF", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("New Exp After First", "NEAF", "NEAF", BRAPI_REFERENCE_SOURCE, 1, traits); Map newExpA = new HashMap<>(); newExpA.put(Columns.GERMPLASM_GID, "1"); newExpA.put(Columns.TEST_CHECK, "T"); @@ -1355,7 +1355,7 @@ public void importSecondExpAfterFirstExpWithObs() { public void importNewObsAfterFirstExpWithObs(boolean commit) { log.debug("importNewObsAfterFirstExpWithObs"); List traits = importTestUtils.createTraits(2); - Program program = createProgram("Exp with additional Uploads "+(commit ? "C" : "P"), "EXAU"+(commit ? "C" : "P"), "EXAU"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("Exp with additional Uploads "+(commit ? "C" : "P"), "EXAU"+(commit ? "C" : "P"), "EXAU"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1427,7 +1427,7 @@ public void importNewObsAfterFirstExpWithObs(boolean commit) { public void importNewObsAfterFirstExpWithObsAndTimestamps() { log.debug("importNewObsAfterFirstExpWithObsAndTimestamps"); List traits = importTestUtils.createTraits(2); - Program program = createProgram("Exp with TS and additional Uploads ", "EXTSAU", "EXTSAU", BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("Exp with TS and additional Uploads ", "EXTSAU", "EXTSAU", BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1502,7 +1502,7 @@ public void importNewObsAfterFirstExpWithObsAndTimestamps() { public void importNewObsAfterFirstExpWithObs_blank(boolean commit) { log.debug("importNewObsAfterFirstExpWithObs_blank"); List traits = importTestUtils.createTraits(3); - Program program = createProgram("Exp with additional Uploads (blank) "+(commit ? "C" : "P"), "EXAUB"+(commit ? "C" : "P"), "EXAUB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(1), traits); + Program program = createProgram("Exp with additional Uploads (blank) "+(commit ? "C" : "P"), "EXAUB"+(commit ? "C" : "P"), "EXAUB"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 1, traits); Map newExp = new HashMap<>(); newExp.put(Columns.GERMPLASM_GID, "1"); newExp.put(Columns.TEST_CHECK, "T"); @@ -1859,7 +1859,7 @@ private String yearToSeasonDbId(String year, UUID programId) throws ApiException return null; } - private Program createProgram(String name, String abbv, String key, String referenceSource, List germplasm, List traits) throws ApiException, DoesNotExistException, ValidatorException, BadRequestException { + private Program createProgram(String name, String abbv, String key, String referenceSource, int numGermplasmToCreate, List traits) throws ApiException, DoesNotExistException, ValidatorException, BadRequestException { SpeciesEntity validSpecies = speciesDAO.findAll().get(0); SpeciesRequest speciesRequest = SpeciesRequest.builder() .commonName(validSpecies.getCommonName()) @@ -1879,10 +1879,14 @@ private Program createProgram(String name, String abbv, String key, String refer // Get main program Program program = programService.getByKey(key).get(); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId().toString()); - if(germplasm != null && !germplasm.isEmpty()) { + if(numGermplasmToCreate > 0) { + + List germplasm = createGermplasm(numGermplasmToCreate, brapiProgramDbId); + BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", referenceSource)); newReference.setReferenceID(program.getId().toString()); @@ -1905,7 +1909,7 @@ private Program createProgram(String name, String abbv, String key, String refer return program; } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -1924,6 +1928,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/brapps/importer/SampleSubmissionFileImportTest.java b/src/test/java/org/breedinginsight/brapps/importer/SampleSubmissionFileImportTest.java index 0f9feafb9..7217b5542 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/SampleSubmissionFileImportTest.java +++ b/src/test/java/org/breedinginsight/brapps/importer/SampleSubmissionFileImportTest.java @@ -51,6 +51,7 @@ import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.breedinginsight.dao.db.tables.pojos.SpeciesEntity; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.SpeciesDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.Column; @@ -146,6 +147,9 @@ public class SampleSubmissionFileImportTest extends BrAPITest { @Inject BrAPITrialService brAPITrialService; + @Inject + private ProgramDAO programDAO; + private Gson gson = new GsonBuilder().registerTypeAdapter(OffsetDateTime.class, (JsonDeserializer) (json, type, context) -> OffsetDateTime.parse(json.getAsString())) .registerTypeAdapter(BrAPIPagination.class, new PaginationTypeAdapter()) @@ -177,7 +181,7 @@ public void setup() { @SneakyThrows public void importGIDSuccess() { log.debug("importGIDSuccess"); - Program program = createProgram("Import GID Success", "GIDS", "GIDS", BRAPI_REFERENCE_SOURCE, createGermplasm(96), null); + Program program = createProgram("Import GID Success", "GIDS", "GIDS", BRAPI_REFERENCE_SOURCE, 96, null); List> validFile = new ArrayList<>(); int germGidCounter = 1; @@ -224,7 +228,7 @@ public void importGIDSuccess() { @SneakyThrows public void importObsUnitIdSuccess() { log.debug("importObsUnitIdSuccess"); - Program program = createProgram("Import ObsUnitID success", "OBSID", "OBSID", BRAPI_REFERENCE_SOURCE, createGermplasm(1), null); + Program program = createProgram("Import ObsUnitID success", "OBSID", "OBSID", BRAPI_REFERENCE_SOURCE, 1, null); var experimentId = createExperiment(program); @@ -298,7 +302,7 @@ public void importMissingGIDAndObsUnitIdFailure(boolean commit) { @SneakyThrows public void verifyMissingDataThrowsError(boolean commit) { log.debug("verifyMissingDataThrowsError"); - Program program = createProgram("Missing Req Cols "+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(96), null); + Program program = createProgram("Missing Req Cols "+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), "MISS"+(commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 96, null); Map base = new HashMap<>(); base.put(Columns.PLATE_ID, "valid_1"); base.put(Columns.ROW, "A"); @@ -371,7 +375,7 @@ public void importInvalidObsUnitIdFailure(boolean commit) { @SneakyThrows public void importConflictingWellsFailure(boolean commit) { log.debug("importConflictingWellsFailure"); - Program program = createProgram("Conflicting Wells " + (commit ? "C" : "P"), "WELL"+ (commit ? "C" : "P"), "WELL"+ (commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, createGermplasm(2), null); + Program program = createProgram("Conflicting Wells " + (commit ? "C" : "P"), "WELL"+ (commit ? "C" : "P"), "WELL"+ (commit ? "C" : "P"), BRAPI_REFERENCE_SOURCE, 2, null); List> validFile = new ArrayList<>(); Map validRow = new HashMap<>(); @@ -438,7 +442,7 @@ private Map assertRowSaved(Map expected, Program return ret; } - private Program createProgram(String name, String abbv, String key, String referenceSource, List germplasm, List traits) throws ApiException, DoesNotExistException, ValidatorException, BadRequestException { + private Program createProgram(String name, String abbv, String key, String referenceSource, Integer numGermplasmToCreate, List traits) throws ApiException, DoesNotExistException, ValidatorException, BadRequestException { SpeciesEntity validSpecies = speciesDAO.findAll().get(0); SpeciesRequest speciesRequest = SpeciesRequest.builder() .commonName(validSpecies.getCommonName()) @@ -458,10 +462,13 @@ private Program createProgram(String name, String abbv, String key, String refer // Get main program Program program = programService.getByKey(key).get(); + String brapiProgramDbId = programDAO.getProgramBrAPI(program).getProgramDbId(); dsl.execute(securityFp.get("InsertProgramRolesBreeder"), testUser.getId().toString(), program.getId().toString()); - if(germplasm != null && !germplasm.isEmpty()) { + if(numGermplasmToCreate != null && numGermplasmToCreate > 0) { + List germplasm = createGermplasm(numGermplasmToCreate, brapiProgramDbId); + BrAPIExternalReference newReference = new BrAPIExternalReference(); newReference.setReferenceSource(String.format("%s/programs", referenceSource)); newReference.setReferenceID(program.getId().toString()); @@ -484,7 +491,7 @@ private Program createProgram(String name, String abbv, String key, String refer return program; } - private List createGermplasm(int numToCreate) { + private List createGermplasm(int numToCreate, String brapiProgramDbId) { List germplasm = new ArrayList<>(); for (int i = 0; i < numToCreate; i++) { String gid = ""+(i+1); @@ -503,6 +510,7 @@ private List createGermplasm(int numToCreate) { testReference.setReferenceID(UUID.randomUUID().toString()); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); } diff --git a/src/test/java/org/breedinginsight/services/BrAPIGermplasmServiceUnitTest.java b/src/test/java/org/breedinginsight/services/BrAPIGermplasmServiceUnitTest.java index 9d5f7b792..a47a3eebb 100644 --- a/src/test/java/org/breedinginsight/services/BrAPIGermplasmServiceUnitTest.java +++ b/src/test/java/org/breedinginsight/services/BrAPIGermplasmServiceUnitTest.java @@ -4,7 +4,9 @@ import io.reactivex.functions.Function; import io.reactivex.functions.Function3; import lombok.SneakyThrows; +import org.brapi.client.v2.model.queryParams.germplasm.GermplasmQueryParams; import org.brapi.v2.model.BrAPIExternalReference; +import org.brapi.v2.model.core.BrAPIProgram; import org.brapi.v2.model.core.response.BrAPIListDetails; import org.brapi.v2.model.core.response.BrAPIListsSingleResponse; import org.brapi.v2.model.germ.BrAPIGermplasm; @@ -60,7 +62,7 @@ void setup() { programDAO = mock(ProgramDAO.class); brAPIDAOUtil = mock(BrAPIDAOUtil.class); cacheProvider = new ProgramCacheProvider(super.getRedisConnection()); - germplasmDAO = new BrAPIGermplasmDAO(programDAO, mock(ImportDAO.class), brAPIDAOUtil, cacheProvider, new BrAPIEndpointProvider()); + germplasmDAO = new BrAPIGermplasmDAO(programDAO, mock(ImportDAO.class), brAPIDAOUtil, cacheProvider, new BrAPIEndpointProvider(), 65000); programService = mock(ProgramService.class); Field externalReferenceSource = BrAPIGermplasmDAO.class.getDeclaredField("referenceSource"); @@ -78,6 +80,14 @@ public void getGermplasmListExport() { testProgram.setKey("TEST"); testProgram.setId(testProgramId); + + BrAPIProgram brapiProgram = new BrAPIProgram(); + String brapiProgramDbId = UUID.randomUUID().toString(); + brapiProgram.setProgramDbId(brapiProgramDbId); + brapiProgram.setProgramName("Test Program [TEST]"); + + testProgram.setBrapiProgram(brapiProgram); + //Create List BrAPIListsSingleResponse listResponse = new BrAPIListsSingleResponse(); String listId = "1"; @@ -100,6 +110,7 @@ public void getGermplasmListExport() { testGermplasm.setSeedSource("Wild"); testGermplasm.setAccessionNumber("1"); testGermplasm.setDefaultDisplayName("Germplasm A"); + testGermplasm.setProgramDbId(brapiProgramDbId); JsonObject additionalInfo = new JsonObject(); additionalInfo.addProperty(GERMPLASM_IMPORT_ENTRY_NUMBER, "2"); additionalInfo.addProperty(GERMPLASM_BREEDING_METHOD, "Allopolyploid"); @@ -129,6 +140,7 @@ public void getGermplasmListExport() { externalRef = new ArrayList<>(); externalRef.add(testReference); testGermplasm.setExternalReferences(externalRef); + testGermplasm.setProgramDbId(brapiProgramDbId); germplasm.add(testGermplasm); //Stub out the spies @@ -138,12 +150,11 @@ public void getGermplasmListExport() { doReturn(Optional.of(testProgram)).when(programSpy).getById(testProgramId); //Stub out the mocks - when(programDAO.getAll()).thenReturn(Arrays.asList(Program.builder().id(testProgramId).name("Test Program").active(true).build())); when(programDAO.fetchOneById(any(UUID.class))).thenReturn(testProgram); when(programDAO.get(any(UUID.class))).thenReturn(Arrays.asList(testProgram)); - when(brAPIDAOUtil.searchNoPaging(any(Function.class), - any(Function3.class), - any(BrAPIGermplasmSearchRequest.class))).thenReturn(germplasm); + when(programDAO.getProgramBrAPI(any())).thenReturn(brapiProgram); + when(brAPIDAOUtil.get(any(Function.class), + any(GermplasmQueryParams.class))).thenReturn(germplasm); //Create germplasm cache of stub data Method setupMethod = BrAPIGermplasmDAO.class.getDeclaredMethod("setup"); From 219b6709733028d1c559348d7f8f940a934ce741 Mon Sep 17 00:00:00 2001 From: Jason Loux Date: Mon, 24 Aug 2026 17:16:24 -0400 Subject: [PATCH 2/7] Remove cache get for rawGermplasm, fix unit tests --- .../org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java | 6 ++---- .../brapps/importer/GermplasmFileImportTest.java | 5 +++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java index 572a6ba4c..395b868ac 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -144,8 +144,8 @@ public List getGermplasm(UUID programId) throws ApiException { */ public List getRawGermplasm(UUID programId) throws ApiException { Program program = new Program(programDAO.fetchOneById(programId)); - List cacheList = new ArrayList<>(programGermplasmCache.get(programId).values()); - return cacheList.stream().map(germplasm -> { + List programGermplasm = getGermplasm(programId); + return programGermplasm.stream().map(germplasm -> { germplasm.setGermplasmName(Utilities.appendProgramKey(germplasm.getDefaultDisplayName(), program.getKey(), germplasm.getAccessionNumber())); if(germplasm.getAdditionalInfo() != null && germplasm.getAdditionalInfo().has(BrAPIAdditionalInfoFields.GERMPLASM_RAW_PEDIGREE) && !(germplasm.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_RAW_PEDIGREE).isJsonNull())) { @@ -318,8 +318,6 @@ private Map processGermplasmForDisplay(List getBrAPIGermplasmUsingBrAPIProgramId(GermplasmQueryParams germplasmQueryParams, Program program) throws ApiException { - - if (germplasmQueryParams.page() == null) { germplasmQueryParams.setPage(0); } diff --git a/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java b/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java index cbcea3e0c..2673b0353 100644 --- a/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java +++ b/src/test/java/org/breedinginsight/brapps/importer/GermplasmFileImportTest.java @@ -27,6 +27,7 @@ import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; import org.breedinginsight.dao.db.tables.pojos.ProgramBreedingMethodEntity; import org.breedinginsight.daos.BreedingMethodDAO; +import org.breedinginsight.daos.ProgramDAO; import org.breedinginsight.daos.UserDAO; import org.breedinginsight.model.Program; import org.breedinginsight.services.SpeciesService; @@ -75,6 +76,8 @@ public class GermplasmFileImportTest extends BrAPITest { private DSLContext dsl; @Inject private BrAPIGermplasmDAO germplasmDAO; + @Inject + private ProgramDAO programDAO; private ImportTestUtils importTestUtils; @@ -1217,11 +1220,13 @@ private String getPreviewState(JsonObject result, int index) { } private void seedExistingGermplasm(String accessionNumber, String displayName, String source, String breedingMethodCode) { + String brapiProgramDbId = programDAO.getProgramBrAPI(validProgram).getProgramDbId(); BrAPIGermplasm germplasm = new BrAPIGermplasm(); germplasm.setAccessionNumber(accessionNumber); germplasm.setDefaultDisplayName(displayName); germplasm.setGermplasmName(String.format("%s [%s-%s]", displayName, validProgram.getKey(), accessionNumber)); germplasm.setSeedSource(source); + germplasm.setProgramDbId(brapiProgramDbId); JsonObject additionalInfo = new JsonObject(); additionalInfo.addProperty(BrAPIAdditionalInfoFields.GERMPLASM_IMPORT_ENTRY_NUMBER, accessionNumber); From dbb4e863360aefafbf98e16410ef36d4414824af Mon Sep 17 00:00:00 2001 From: Jason Loux Date: Tue, 25 Aug 2026 11:07:04 -0400 Subject: [PATCH 3/7] Add comments for BrAPIGermplasmDAO implementation, link ticket --- .../org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java index 395b868ac..c7fdd6257 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -143,6 +143,7 @@ public List getGermplasm(UUID programId) throws ApiException { * @throws ApiException */ public List getRawGermplasm(UUID programId) throws ApiException { + // TODO: This method is used for checking if germplasm already exist in the system. Once a generalized BrAPI exists check is made, we should update this method [BI-2938] Program program = new Program(programDAO.fetchOneById(programId)); List programGermplasm = getGermplasm(programId); return programGermplasm.stream().map(germplasm -> { @@ -394,6 +395,7 @@ public List updateBrAPIGermplasm(List putBrAPIGe } public List getGermplasmByRawName(List germplasmNames, UUID programId) throws ApiException { + // TODO: Optimize this method by utilizing a BrAPIGermplasmSearchRequest [BI-3028] Program program = new Program(programDAO.fetchOneById(programId)); return getGermplasm(programId) .stream() @@ -430,6 +432,7 @@ public List getGermplasmDbIdsForUUIDs(List germplasmUUIDs, UUID } public Optional getGermplasmByDBID(String germplasmDbId, UUID programId) throws ApiException { + // TODO: Optimize by utilizing a BrAPIGermplasmSearchRequest [BI-3028] Map cache = programGermplasmCache.get(programId); //key is UUID, want to filter by DBID BrAPIGermplasm germplasm = null; @@ -440,6 +443,7 @@ public Optional getGermplasmByDBID(String germplasmDbId, UUID pr } public List getGermplasmsByDBID(Collection germplasmDbIds, UUID programId) throws ApiException { + // TODO: Optimize by utilizing a BrAPIGermplasmSearchRequest [BI-3028] Map cache = programGermplasmCache.get(programId); //key is UUID, want to filter by DBID List germplasm = new ArrayList<>(); From 14d03073124451495abd82aec2612cd6c80b5898 Mon Sep 17 00:00:00 2001 From: Jason Loux Date: Tue, 25 Aug 2026 16:12:08 -0400 Subject: [PATCH 4/7] Add Germplasm search code, fix another cache get() --- .../brapi/v2/dao/BrAPIGermplasmDAO.java | 62 ++++++++++++++++--- .../services/ProgramService.java | 17 +++++ .../utilities/BrAPIDAOUtil.java | 4 ++ 3 files changed, 75 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java index c7fdd6257..50b51f447 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -32,8 +32,10 @@ import org.brapi.v2.model.germ.BrAPIGermplasm; import org.brapi.v2.model.germ.BrAPIGermplasmSynonyms; import org.brapi.v2.model.germ.request.BrAPIGermplasmSearchRequest; +import org.brapi.v2.model.germ.response.BrAPIGermplasmListResponse; import org.brapi.v2.model.germ.response.BrAPIGermplasmSingleResponse; import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; +import org.breedinginsight.brapi.v2.model.request.query.GermplasmQuery; import org.breedinginsight.brapps.importer.daos.ImportDAO; import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; @@ -403,16 +405,60 @@ public List getGermplasmByRawName(List germplasmNames, U .collect(Collectors.toList()); } - public BrAPIGermplasm getGermplasmByUUID(String germplasmId, UUID programId) throws ApiException, DoesNotExistException { - Map cache = programGermplasmCache.get(programId); - BrAPIGermplasm germplasm = null; - if (cache != null) { - germplasm = cache.get(germplasmId); + public List brapiGermplasmSearchReturnList(Program program, + List brapiGermplasmIds) throws ApiException { + return brapiGermplasmSearchReturnResponse(program, brapiGermplasmIds, null).getResult().getData(); + } + + public BrAPIGermplasmListResponse brapiGermplasmSearchReturnResponse(Program program, + List brapiGermplasmIds, + GermplasmQuery germplasmQuery) throws ApiException { + + GermplasmApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(program.getId()), GermplasmApi.class); + + BrAPIGermplasmSearchRequest brAPIGermplasmSearchRequest = buildSearchRequest(program, brapiGermplasmIds, germplasmQuery); + + BrAPIGermplasmListResponse brAPIResponse = + brAPIDAOUtil.simpleSearch( + api::searchGermplasmPost, + brAPIGermplasmSearchRequest + ); + + // TODO: Once cache is removed for this class, fix processGermplasmForDisplay to return List [BI-2906] + List processedGermplasm = + new ArrayList<>(processGermplasmForDisplay(brAPIDAOUtil.getListResult(brAPIResponse), program.getKey()).values()); + + brAPIResponse.getResult().setData(processedGermplasm); + + return brAPIResponse; + } + + private BrAPIGermplasmSearchRequest buildSearchRequest(Program program, List brapiGermplasmIds, GermplasmQuery germplasmQuery) throws ApiException { + BrAPIGermplasmSearchRequest searchRequest = new BrAPIGermplasmSearchRequest(); + + searchRequest.programDbIds(List.of(brAPIDAOUtil.getBrAPIProgramDbId(program.getId()))); + + if (brapiGermplasmIds != null && !brapiGermplasmIds.isEmpty()) { + searchRequest.setTrialDbIds(brapiGermplasmIds.stream().map(UUID::toString).collect(Collectors.toList())); } - if (germplasm == null) { - throw new DoesNotExistException("UUID for this germplasm does not exist"); + + brAPIDAOUtil.setGenericSearchParameters(searchRequest, germplasmQuery); + + return searchRequest; + } + + public BrAPIGermplasm getGermplasmByUUID(String germplasmId, UUID programId) throws ApiException, DoesNotExistException { + Program program = new Program(programDAO.fetchOneById(programId)); + + List result = brapiGermplasmSearchReturnList(program, List.of(UUID.fromString(germplasmId))); + + if (result.size() > 1) { + throw new ApiException(String.format("Multiple germplasms found for germplasm with ID: [%s]", germplasmId)); + } else if (result.isEmpty()) { + throw new DoesNotExistException(String.format("Germplasm with ID: [%s] does not exist", germplasmId)); } - return germplasm; + + return result.get(0); } public List getGermplasmDbIdsForUUIDs(List germplasmUUIDs, UUID programId) throws ApiException, DoesNotExistException { diff --git a/src/main/java/org/breedinginsight/services/ProgramService.java b/src/main/java/org/breedinginsight/services/ProgramService.java index d7b35801b..aea07a9fa 100644 --- a/src/main/java/org/breedinginsight/services/ProgramService.java +++ b/src/main/java/org/breedinginsight/services/ProgramService.java @@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.brapi.client.v2.model.exceptions.ApiException; import org.brapi.v2.model.core.BrAPIProgram; import org.breedinginsight.api.auth.AuthenticatedUser; import org.breedinginsight.api.auth.SecurityService; @@ -316,5 +317,21 @@ public ArrayList getKeyValidationErrors(String key) { return keyErrors; } + public String getBrAPIProgramDbId(UUID biProgramId) throws ApiException { + Optional programOpt = getById(biProgramId); + + if (programOpt.isEmpty()) { + throw new ApiException("Program does not exist"); + } + + Program program = programOpt.get(); + + if (program.getBrapiProgram() == null) { + throw new ApiException("Program does not exist in BrAPI"); + } + + return program.getBrapiProgram().getProgramDbId(); + } + } diff --git a/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java b/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java index 0209d0afb..07d012b06 100644 --- a/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java +++ b/src/main/java/org/breedinginsight/utilities/BrAPIDAOUtil.java @@ -626,4 +626,8 @@ public void brapiSearchRequest.setPageSize(biSearchQuery.getPageSize()); } } + + public String getBrAPIProgramDbId(UUID biProgramId) throws ApiException { + return programService.getBrAPIProgramDbId(biProgramId); + } } From b56ac085c5f3c3ec0eda6129301d6461e4a130a3 Mon Sep 17 00:00:00 2001 From: Jason Loux Date: Thu, 27 Aug 2026 17:10:44 -0400 Subject: [PATCH 5/7] Fix BrAPIGermplasmController getCache usage --- .../brapi/v2/BrAPIGermplasmController.java | 16 ++-------------- .../brapi/v2/dao/BrAPIGermplasmDAO.java | 18 ++---------------- .../v2/services/BrAPIGermplasmService.java | 13 +++++-------- 3 files changed, 9 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java index 850ed8138..25789ddae 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java @@ -1,6 +1,5 @@ package org.breedinginsight.brapi.v2; -import com.drew.lang.annotations.Nullable; import io.micronaut.context.annotation.Property; import io.micronaut.http.HttpHeaders; import io.micronaut.http.HttpResponse; @@ -108,15 +107,8 @@ public HttpResponse searchGermplasm( return HttpResponse.notFound(); } - // Can't use BrAPI server programDbId filtering, think germplasm are linked to program through observation - // units and doesn't work if don't have any loaded, use external refs instead for now - // Just use DeltaBreed program UUID - String extRefId = program.get().getId().toString(); - body.externalReferenceIds(List.of(extRefId)); - - // convert request filter dbIds from DeltaBreed UUID to BrAPI service dbIds - List convertedDbIds = germplasmService.getGermplasmDbIdsForUUIDs(program.get().getId(), body.getGermplasmDbIds()); - body.setGermplasmDbIds(convertedDbIds); + String brapiProgramDbId = programService.getBrAPIProgramDbId(program.get().getId()); + body.setProgramDbIds(List.of(brapiProgramDbId)); ApiResponse, Optional>> brapiGermplasm; brapiGermplasm = brAPIEndpointProvider @@ -177,10 +169,6 @@ private void batchProcessGermplasm(List germplasmList, String pr // Prepare a regex pattern for program key removal Pattern programKeyPattern = Utilities.getRegexPatternMatchAllProgramKeysAnyAccession(programKey); germplasmList.parallelStream().forEach(germplasm -> { - // Set dbId - germplasm.germplasmDbId(Utilities.getExternalReference(germplasm.getExternalReferences(), "breedinginsight.org") - .orElseThrow(() -> new IllegalStateException("No BI external reference found")) - .getReferenceId()); // Process synonyms if (germplasm.getSynonyms() != null) { germplasm.getSynonyms().forEach(synonym -> { diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java index 50b51f447..489c6cd75 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -23,10 +23,12 @@ import io.micronaut.http.server.exceptions.InternalServerException; import io.micronaut.scheduling.annotation.Scheduled; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; import org.brapi.client.v2.ApiResponse; import org.brapi.client.v2.model.exceptions.ApiException; import org.brapi.client.v2.model.queryParams.germplasm.GermplasmQueryParams; import org.brapi.client.v2.modules.germplasm.GermplasmApi; +import org.brapi.v2.model.BrAPIAcceptedSearchResponse; import org.brapi.v2.model.BrAPIExternalReference; import org.brapi.v2.model.core.BrAPIProgram; import org.brapi.v2.model.germ.BrAPIGermplasm; @@ -461,22 +463,6 @@ public BrAPIGermplasm getGermplasmByUUID(String germplasmId, UUID programId) thr return result.get(0); } - public List getGermplasmDbIdsForUUIDs(List germplasmUUIDs, UUID programId) throws ApiException, DoesNotExistException { - Map cache = programGermplasmCache.get(programId); - List germplasmList = new ArrayList<>(); - if (cache != null) { - // not using streams because want to throw checked exception - for (String germplasmUUID : germplasmUUIDs) { - BrAPIGermplasm germplasm = cache.get(germplasmUUID); - if (germplasm == null) { - throw new DoesNotExistException("UUID for this germplasm does not exist: " + germplasmUUID); - } - germplasmList.add(germplasm.getGermplasmDbId()); - } - } - return germplasmList; - } - public Optional getGermplasmByDBID(String germplasmDbId, UUID programId) throws ApiException { // TODO: Optimize by utilizing a BrAPIGermplasmSearchRequest [BI-3028] Map cache = programGermplasmCache.get(programId); diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java index 7e4a01e67..161ceed8e 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java @@ -4,7 +4,10 @@ import io.micronaut.context.annotation.Property; import io.micronaut.http.server.exceptions.InternalServerException; import io.micronaut.http.server.types.files.StreamedFile; +import org.apache.commons.lang3.tuple.Pair; +import org.brapi.client.v2.ApiResponse; import org.brapi.client.v2.model.exceptions.ApiException; +import org.brapi.v2.model.BrAPIAcceptedSearchResponse; import org.brapi.v2.model.BrAPIExternalReference; import lombok.extern.slf4j.Slf4j; import org.brapi.v2.model.core.request.BrAPIListNewRequest; @@ -12,6 +15,8 @@ import org.brapi.v2.model.core.response.BrAPIListsSingleResponse; import org.brapi.v2.model.germ.BrAPIGermplasm; import org.brapi.v2.model.germ.BrAPIGermplasmSynonyms; +import org.brapi.v2.model.germ.request.BrAPIGermplasmSearchRequest; +import org.brapi.v2.model.germ.response.BrAPIGermplasmListResponse; import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; import org.breedinginsight.brapi.v2.dao.BrAPIListDAO; import org.breedinginsight.brapps.importer.model.exports.FileType; @@ -70,14 +75,6 @@ public BrAPIGermplasm getGermplasmByUUID(UUID programId, String germplasmId) thr } } - public List getGermplasmDbIdsForUUIDs(UUID programId, List germplasmUUIDs) throws DoesNotExistException { - try { - return germplasmDAO.getGermplasmDbIdsForUUIDs(germplasmUUIDs, programId); - } catch (ApiException e) { - throw new InternalServerException(e.getMessage(), e); - } - } - public Optional getGermplasmByDBID(UUID programId, String germplasmId) throws ApiException { return germplasmDAO.getGermplasmByDBID(germplasmId, programId); } From 1e1690d7f29cc4f564007138c9f83dc047f5d78f Mon Sep 17 00:00:00 2001 From: Jason Loux Date: Thu, 27 Aug 2026 17:39:09 -0400 Subject: [PATCH 6/7] Go after next BrAPIController cache usage, fix bug --- .../brapi/v2/BrAPIGermplasmController.java | 3 +-- .../brapi/v2/dao/BrAPIGermplasmDAO.java | 13 +------------ .../brapi/v2/services/BrAPIGermplasmService.java | 4 ---- 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java index 25789ddae..f234c3030 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIGermplasmController.java @@ -308,8 +308,7 @@ public HttpResponse getGermplasmPedigreeInfo( metadata.setPagination(pagination); response = new BrAPIGermplasmPedigreeResponse(); } else { - BrAPIGermplasm germplasm = germplasmService.getGermplasmByDBID(programId, germplasmId) - .orElseThrow(() -> new DoesNotExistException("DBID for this germplasm does not exist")); + BrAPIGermplasm germplasm = germplasmService.getGermplasmByUUID(programId, germplasmId); //Forward the pedigree call to the backing BrAPI system of the program passing the germplasmDbId that came in the request GermplasmApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(programId), GermplasmApi.class); diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java index 489c6cd75..6afa3d073 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -441,7 +441,7 @@ private BrAPIGermplasmSearchRequest buildSearchRequest(Program program, List getGermplasmByDBID(String germplasmDbId, UUID programId) throws ApiException { - // TODO: Optimize by utilizing a BrAPIGermplasmSearchRequest [BI-3028] - Map cache = programGermplasmCache.get(programId); - //key is UUID, want to filter by DBID - BrAPIGermplasm germplasm = null; - if (cache != null) { - germplasm = cache.values().stream().filter(x -> x.getGermplasmDbId().equals(germplasmDbId)).collect(Collectors.toList()).get(0); - } - return Optional.ofNullable(germplasm); - } - public List getGermplasmsByDBID(Collection germplasmDbIds, UUID programId) throws ApiException { // TODO: Optimize by utilizing a BrAPIGermplasmSearchRequest [BI-3028] Map cache = programGermplasmCache.get(programId); diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java index 161ceed8e..c68801a8b 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java @@ -75,10 +75,6 @@ public BrAPIGermplasm getGermplasmByUUID(UUID programId, String germplasmId) thr } } - public Optional getGermplasmByDBID(UUID programId, String germplasmId) throws ApiException { - return germplasmDAO.getGermplasmByDBID(germplasmId, programId); - } - public List> processListData(List germplasm, List listData, Program program){ Map germplasmByName = new HashMap<>(); for (BrAPIGermplasm g: germplasm) { From acef437734075878be0d6f778f117a47b45c6d5b Mon Sep 17 00:00:00 2001 From: Jason Loux Date: Thu, 27 Aug 2026 18:19:31 -0400 Subject: [PATCH 7/7] Remove remaining cache.get() usages --- .../brapi/v2/dao/BrAPIGermplasmDAO.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java index 6afa3d073..ca896441e 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -408,12 +408,12 @@ public List getGermplasmByRawName(List germplasmNames, U } public List brapiGermplasmSearchReturnList(Program program, - List brapiGermplasmIds) throws ApiException { + List brapiGermplasmIds) throws ApiException { return brapiGermplasmSearchReturnResponse(program, brapiGermplasmIds, null).getResult().getData(); } public BrAPIGermplasmListResponse brapiGermplasmSearchReturnResponse(Program program, - List brapiGermplasmIds, + List brapiGermplasmIds, GermplasmQuery germplasmQuery) throws ApiException { GermplasmApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(program.getId()), GermplasmApi.class); @@ -435,13 +435,13 @@ public BrAPIGermplasmListResponse brapiGermplasmSearchReturnResponse(Program pro return brAPIResponse; } - private BrAPIGermplasmSearchRequest buildSearchRequest(Program program, List brapiGermplasmIds, GermplasmQuery germplasmQuery) throws ApiException { + private BrAPIGermplasmSearchRequest buildSearchRequest(Program program, List brapiGermplasmIds, GermplasmQuery germplasmQuery) throws ApiException { BrAPIGermplasmSearchRequest searchRequest = new BrAPIGermplasmSearchRequest(); searchRequest.programDbIds(List.of(brAPIDAOUtil.getBrAPIProgramDbId(program.getId()))); if (brapiGermplasmIds != null && !brapiGermplasmIds.isEmpty()) { - searchRequest.setGermplasmDbIds(brapiGermplasmIds.stream().map(UUID::toString).collect(Collectors.toList())); + searchRequest.setGermplasmDbIds(new ArrayList<>(brapiGermplasmIds)); } brAPIDAOUtil.setGenericSearchParameters(searchRequest, germplasmQuery); @@ -452,7 +452,7 @@ private BrAPIGermplasmSearchRequest buildSearchRequest(Program program, List result = brapiGermplasmSearchReturnList(program, List.of(UUID.fromString(germplasmId))); + List result = brapiGermplasmSearchReturnList(program, List.of(germplasmId)); if (result.size() > 1) { throw new ApiException(String.format("Multiple germplasms found for germplasm with ID: [%s]", germplasmId)); @@ -464,14 +464,10 @@ public BrAPIGermplasm getGermplasmByUUID(String germplasmId, UUID programId) thr } public List getGermplasmsByDBID(Collection germplasmDbIds, UUID programId) throws ApiException { - // TODO: Optimize by utilizing a BrAPIGermplasmSearchRequest [BI-3028] - Map cache = programGermplasmCache.get(programId); - //key is UUID, want to filter by DBID - List germplasm = new ArrayList<>(); - if (cache != null) { - germplasm = cache.values().stream().filter(x -> germplasmDbIds.contains(x.getGermplasmDbId())).collect(Collectors.toList()); - } - return germplasm; + // TODO: This method is mainly used by the download experiment export tool. This method will fail until we address the parameter limit for async Germplasm requests for germplasmDbIds > 4. Return to this use case during [BI-3021] + Program program = new Program(programDAO.fetchOneById(programId)); + + return brapiGermplasmSearchReturnList(program, new ArrayList<>(germplasmDbIds)); } public List putGermplasm(List germplasmList, GermplasmApi api) throws ApiException {