diff --git a/src/main/java/org/breedinginsight/brapi/v2/BrAPIPedigreeController.java b/src/main/java/org/breedinginsight/brapi/v2/BrAPIPedigreeController.java index 1e6d673fe..1be0bfce2 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/BrAPIPedigreeController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/BrAPIPedigreeController.java @@ -95,13 +95,14 @@ public HttpResponse pedigreeGet(@PathVariable("progra try { List pedigree = pedigreeDAO.getPedigree( program.get(), - Optional.ofNullable(includeParents), - Optional.ofNullable(includeSiblings), - Optional.ofNullable(includeProgeny), - Optional.ofNullable(includeFullTree), - Optional.ofNullable(pedigreeDepth), - Optional.ofNullable(progenyDepth), - Optional.ofNullable(germplasmName)); + includeParents, + includeSiblings, + includeProgeny, + includeFullTree, + pedigreeDepth, + progenyDepth, + germplasmName, + accessionNumber); return HttpResponse.ok( new BrAPIPedigreeListResponse() diff --git a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIPedigreeDAO.java b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIPedigreeDAO.java index a00957f2c..3a164c07d 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIPedigreeDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIPedigreeDAO.java @@ -73,13 +73,14 @@ public BrAPIPedigreeDAO(ProgramDAO programDAO, BrAPIDAOUtil brAPIDAOUtil, */ public List getPedigree( Program program, - Optional includeParents, - Optional includeSiblings, - Optional includeProgeny, - Optional includeFullTree, - Optional pedigreeDepth, - Optional progenyDepth, - Optional germplasmName + Boolean includeParents, + Boolean includeSiblings, + Boolean includeProgeny, + Boolean includeFullTree, + Integer pedigreeDepth, + Integer progenyDepth, + String germplasmName, + String accessionNumber ) throws ApiException { PedigreeQueryParams pedigreeRequest = new PedigreeQueryParams(); @@ -94,13 +95,14 @@ public List getPedigree( pedigreeRequest.externalReferenceId(extRefId); pedigreeRequest.externalReferenceSource(extRefSrc); - includeParents.ifPresent(pedigreeRequest::includeParents); - includeSiblings.ifPresent(pedigreeRequest::includeSiblings); - includeProgeny.ifPresent(pedigreeRequest::includeProgeny); - includeFullTree.ifPresent(pedigreeRequest::includeFullTree); - pedigreeDepth.ifPresent(pedigreeRequest::pedigreeDepth); - progenyDepth.ifPresent(pedigreeRequest::progenyDepth); - germplasmName.ifPresent(pedigreeRequest::germplasmName); + if (includeParents != null) pedigreeRequest.includeParents(includeParents); + if (includeSiblings != null) pedigreeRequest.includeSiblings(includeSiblings); + if (includeProgeny != null) pedigreeRequest.includeProgeny(includeProgeny); + if (includeFullTree != null) pedigreeRequest.includeFullTree(includeFullTree); + if (pedigreeDepth != null) pedigreeRequest.pedigreeDepth(pedigreeDepth); + if (progenyDepth != null) pedigreeRequest.progenyDepth(progenyDepth); + if (germplasmName != null) pedigreeRequest.germplasmName(germplasmName); + if (accessionNumber != null) pedigreeRequest.accessionNumber(accessionNumber); // TODO: other parameters // TODO: write utility to do paging instead of hardcoding 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 4824993b6..8023327d7 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java @@ -82,10 +82,15 @@ public Optional getGermplasmByDBID(UUID programId, String germpl return germplasmDAO.getGermplasmByDBID(germplasmId, programId); } - public List> processListData(List germplasm, BrAPIListDetails germplasmList){ + public List> processListData(List germplasm, BrAPIListDetails germplasmList, Program program){ Map germplasmByName = new HashMap<>(); for (BrAPIGermplasm g: germplasm) { - germplasmByName.put(g.getGermplasmName(), g); + // Use the full, unique germplasmName with programKey and accessionNumber (GID) for 2 reasons: + // 1. the BrAPI list items are full names, and + // 2. germplasmNames alone are not unique within a program, this led to unexpected behavior, see BI-2344. + String uniqueGermplasmName = String.format("%s [%s-%s]", g.getGermplasmName(), program.getKey(), g.getAccessionNumber()); + g.setGermplasmName(uniqueGermplasmName); // Mutate the germplasmName in place for later use. + germplasmByName.put(uniqueGermplasmName, g); } List> processedData = new ArrayList<>(); @@ -107,14 +112,13 @@ public List> processListData(List germplasm, for (String germplasmName: orderedGermplasmNames) { // Increment entryNumber. ++entryNumber; - // Strip program key and accession number from germplasm name. - germplasmName = Utilities.removeUnknownProgramKey(germplasmName); // TODO: could move to the germplasmList != null codepath. // Lookup the BrAPI germplasm in the map. BrAPIGermplasm germplasmEntry = germplasmByName.get(germplasmName); HashMap row = new HashMap<>(); row.put("GID", Integer.valueOf(germplasmEntry.getAccessionNumber())); - row.put("Germplasm Name", germplasmEntry.getGermplasmName()); + // Strip programKey and accessionNumber from germplasmName for the file output. + row.put("Germplasm Name", Utilities.removeProgramKeyAnyAccession(germplasmEntry.getGermplasmName(), program.getKey())); row.put("Breeding Method", germplasmEntry.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_BREEDING_METHOD).getAsString()); String source = germplasmEntry.getSeedSource(); row.put("Source", source); @@ -217,7 +221,7 @@ private BrAPIGermplasm cloneBrAPIGermplasm(BrAPIGermplasm germplasm) { return (BrAPIGermplasm) gson.fromJson(gson.toJson(germplasm), BrAPIGermplasm.class); } - public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException { + public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException, DoesNotExistException { List columns = GermplasmFileColumns.getOrderedColumns(); //Retrieve germplasm list data @@ -238,7 +242,8 @@ public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) thro StreamedFile downloadFile; //Convert list data to List> data to pass into file writer - List> processedData = processListData(germplasm, null); + Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Could not find program: " + programId)); + List> processedData = processListData(germplasm, null, program); if (fileExtension == FileType.CSV){ downloadFile = CSVWriter.writeToDownload(columns, processedData, fileExtension); @@ -249,7 +254,7 @@ public DownloadFile exportGermplasm(UUID programId, FileType fileExtension) thro return new DownloadFile(fileName, downloadFile); } - public DownloadFile exportGermplasmList(UUID programId, String listId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException { + public DownloadFile exportGermplasmList(UUID programId, String listId, FileType fileExtension) throws IllegalArgumentException, ApiException, IOException, DoesNotExistException { List columns = GermplasmFileColumns.getOrderedColumns(); //Retrieve germplasm list data @@ -260,15 +265,12 @@ public DownloadFile exportGermplasmList(UUID programId, String listId, FileType List germplasm = germplasmDAO.getGermplasmByRawName(germplasmNames, programId); String listName = listData.getListName(); - Optional optionalProgram = programService.getById(programId); - if (optionalProgram.isPresent()) { - Program program = optionalProgram.get(); - listName = removeAppendedKey(listName, program.getKey()); - } + Program program = programService.getById(programId).orElseThrow(() -> new DoesNotExistException("Could not find program: " + programId)); + listName = removeAppendedKey(listName, program.getKey()); String fileName = createFileName(listData, listName); StreamedFile downloadFile; //Convert list data to List> data to pass into file writer - List> processedData = processListData(germplasm, listData); + List> processedData = processListData(germplasm, listData, program); if (fileExtension == FileType.CSV){ downloadFile = CSVWriter.writeToDownload(columns, processedData, fileExtension); diff --git a/src/main/resources/version.properties b/src/main/resources/version.properties index 952159cc6..a4ad700ce 100644 --- a/src/main/resources/version.properties +++ b/src/main/resources/version.properties @@ -14,5 +14,6 @@ # limitations under the License. # + version=v1.1.0+852 versionInfo=https://github.com/Breeding-Insight/bi-api/commit/3fbb75f662c5600da816270d53699aa1192777b9