diff --git a/src/main/java/org/breedinginsight/brapi/v2/constants/BrAPIAdditionalInfoFields.java b/src/main/java/org/breedinginsight/brapi/v2/constants/BrAPIAdditionalInfoFields.java index 9e0289a51..034176a97 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/constants/BrAPIAdditionalInfoFields.java +++ b/src/main/java/org/breedinginsight/brapi/v2/constants/BrAPIAdditionalInfoFields.java @@ -43,4 +43,5 @@ public final class BrAPIAdditionalInfoFields { public static final String OBSERVATION_DATASET_ID = "observationDatasetId"; public static final String FEMALE_PARENT_UNKNOWN = "femaleParentUnknown"; public static final String MALE_PARENT_UNKNOWN = "maleParentUnknown"; + public static final String GID = "gid"; } diff --git a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java index 41edca7c1..0c59128a9 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPITrialService.java @@ -283,7 +283,7 @@ public Dataset getDatasetData(Program program, UUID experimentId, UUID datsetId, // TODO: Once BI-1831 is complete and OUs in a dataset can be identified using the datasetId stored as a xref // the expOUs needs to be replaced with datasetOUs, as was done with datasetObsVars - List expOUs = ouDAO.getObservationUnitsForTrialDbId(program.getId(), experiment.getTrialDbId()); + List expOUs = ouDAO.getObservationUnitsForTrialDbId(program.getId(), experiment.getTrialDbId(), true); List datasetObsVars = getDatasetObsVars(datsetId.toString(), program); List ouDbIds = expOUs.stream().map(BrAPIObservationUnit::getObservationUnitDbId).collect(Collectors.toList()); List obsVarDbIds = datasetObsVars.stream().map(BrAPIObservationVariable::getObservationVariableDbId).collect(Collectors.toList()); diff --git a/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIObservationUnitDAO.java b/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIObservationUnitDAO.java index 6401c031e..9da1f46dc 100644 --- a/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIObservationUnitDAO.java +++ b/src/main/java/org/breedinginsight/brapps/importer/daos/BrAPIObservationUnitDAO.java @@ -20,8 +20,11 @@ import io.micronaut.context.annotation.Property; import org.brapi.client.v2.model.exceptions.ApiException; import org.brapi.client.v2.modules.phenotype.ObservationUnitsApi; +import org.brapi.v2.model.germ.BrAPIGermplasm; import org.brapi.v2.model.pheno.BrAPIObservationUnit; import org.brapi.v2.model.pheno.request.BrAPIObservationUnitSearchRequest; +import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; +import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; import org.breedinginsight.brapps.importer.model.ImportUpload; import org.breedinginsight.brapps.importer.services.ExternalReferenceSource; import org.breedinginsight.daos.ProgramDAO; @@ -43,17 +46,19 @@ public class BrAPIObservationUnitDAO { private final BrAPIDAOUtil brAPIDAOUtil; private final BrAPIEndpointProvider brAPIEndpointProvider; private final ProgramService programService; + private final BrAPIGermplasmService germplasmService; private final String referenceSource; @Inject - public BrAPIObservationUnitDAO(ProgramDAO programDAO, ImportDAO importDAO, BrAPIDAOUtil brAPIDAOUtil, BrAPIEndpointProvider brAPIEndpointProvider, ProgramService programService, @Property(name = "brapi.server.reference-source") String referenceSource) { + public BrAPIObservationUnitDAO(ProgramDAO programDAO, ImportDAO importDAO, BrAPIDAOUtil brAPIDAOUtil, BrAPIEndpointProvider brAPIEndpointProvider, BrAPIGermplasmService germplasmService, ProgramService programService, @Property(name = "brapi.server.reference-source") String referenceSource) { this.programDAO = programDAO; this.importDAO = importDAO; this.brAPIDAOUtil = brAPIDAOUtil; this.brAPIEndpointProvider = brAPIEndpointProvider; this.referenceSource = referenceSource; this.programService = programService; + this.germplasmService = germplasmService; } public List getObservationUnitByName(List observationUnitNames, Program program) throws ApiException { @@ -105,7 +110,12 @@ public List getObservationUnitsForStudyDbId(@NotNull Strin api::searchObservationunitsSearchResultsDbIdGet, observationUnitSearchRequest); } + public List getObservationUnitsForTrialDbId(@NotNull UUID programId, @NotNull String trialDbId) throws ApiException, DoesNotExistException { + return getObservationUnitsForTrialDbId(programId, trialDbId, false); + } + + public List getObservationUnitsForTrialDbId(@NotNull UUID programId, @NotNull String trialDbId, boolean withGID) throws ApiException, DoesNotExistException { Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Program id does not exist")); BrAPIObservationUnitSearchRequest observationUnitSearchRequest = new BrAPIObservationUnitSearchRequest(); @@ -114,8 +124,19 @@ public List getObservationUnitsForTrialDbId(@NotNull UUID observationUnitSearchRequest.trialDbIds(List.of(trialDbId)); ObservationUnitsApi api = brAPIEndpointProvider.get(programDAO.getCoreClient(program.getId()), ObservationUnitsApi.class); - return brAPIDAOUtil.search(api::searchObservationunitsPost, + List observationUnits = brAPIDAOUtil.search(api::searchObservationunitsPost, api::searchObservationunitsSearchResultsDbIdGet, observationUnitSearchRequest); + if( withGID ){ + // Load germplasm for program into map. + // TODO: if we use redis search, that may be more efficient than loading all germplasm for the program. + HashMap germplasmByDbId = new HashMap<>(); + this.germplasmService.getGermplasm(programId).forEach((germplasm -> germplasmByDbId.put(germplasm.getGermplasmDbId(), germplasm))); + for (BrAPIObservationUnit observationUnit: observationUnits) { + BrAPIGermplasm germplasm = germplasmByDbId.get(observationUnit.getGermplasmDbId()); + observationUnit.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GID, germplasm.getAccessionNumber()); + } + } + return observationUnits; } }