diff --git a/src/main/java/org/breedinginsight/api/model/v1/request/query/SearchRequest.java b/src/main/java/org/breedinginsight/api/model/v1/request/query/SearchRequest.java index 9b6355d58..861966d39 100644 --- a/src/main/java/org/breedinginsight/api/model/v1/request/query/SearchRequest.java +++ b/src/main/java/org/breedinginsight/api/model/v1/request/query/SearchRequest.java @@ -26,6 +26,8 @@ @Getter @Setter @Introspected +@AllArgsConstructor +@NoArgsConstructor public class SearchRequest { private List filters = new ArrayList<>(); } diff --git a/src/main/java/org/breedinginsight/brapi/v1/model/request/query/BrapiQuery.java b/src/main/java/org/breedinginsight/brapi/v1/model/request/query/BrapiQuery.java index 231dc9bd7..f51bcf317 100644 --- a/src/main/java/org/breedinginsight/brapi/v1/model/request/query/BrapiQuery.java +++ b/src/main/java/org/breedinginsight/brapi/v1/model/request/query/BrapiQuery.java @@ -20,6 +20,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.breedinginsight.api.model.v1.request.query.FilterRequest; import org.breedinginsight.api.model.v1.request.query.PaginationParams; import org.breedinginsight.api.v1.controller.metadata.SortOrder; @@ -50,4 +51,11 @@ public Integer getDefaultPage() { public Integer getDefaultPageSize() { return DEFAULT_PAGE_SIZE; } + + protected FilterRequest constructFilterRequest(String field, String value) { + return FilterRequest.builder() + .field(field) + .value(value) + .build(); + } } diff --git a/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java b/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java index ccd13c68d..8466e6dbf 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java +++ b/src/main/java/org/breedinginsight/brapi/v2/GermplasmController.java @@ -14,11 +14,14 @@ import org.brapi.v2.model.germ.BrAPIGermplasm; import org.breedinginsight.api.auth.ProgramSecured; import org.breedinginsight.api.auth.ProgramSecuredRoleGroup; +import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.api.model.v1.response.DataResponse; import org.breedinginsight.api.model.v1.response.Response; import org.breedinginsight.api.model.v1.validators.QueryValid; +import org.breedinginsight.api.model.v1.validators.SearchValid; import org.breedinginsight.brapi.v1.controller.BrapiVersion; import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; +import org.breedinginsight.brapi.v2.model.request.query.GermplasmQuery; import org.breedinginsight.brapi.v2.model.response.mappers.GermplasmQueryMapper; import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; import org.breedinginsight.brapps.importer.model.exports.FileType; @@ -46,18 +49,39 @@ public GermplasmController(BrAPIGermplasmService germplasmService, GermplasmQuer this.germplasmQueryMapper = germplasmQueryMapper; } + @Post("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/search/germplasm{?queryParams*}") + @Produces(MediaType.APPLICATION_JSON) + @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) + public HttpResponse>>> searchGermplasm( + @PathVariable("programId") UUID programId, + @QueryValue @QueryValid(using = GermplasmQueryMapper.class) @Valid BrapiQuery queryParams, + @Body @SearchValid(using = GermplasmQueryMapper.class) SearchRequest searchRequest) { + try { + log.debug("fetching germ for program: " + programId); + List germplasm = germplasmService.getGermplasm(programId); + queryParams.setSortField(germplasmQueryMapper.getDefaultSortField()); + queryParams.setSortOrder(germplasmQueryMapper.getDefaultSortOrder()); + return ResponseUtils.getBrapiQueryResponse(germplasm, germplasmQueryMapper, queryParams, searchRequest); + } catch (ApiException e) { + log.info(e.getMessage(), e); + return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving germplasm"); + } + } + @Get("/${micronaut.bi.api.version}/programs/{programId}" + BrapiVersion.BRAPI_V2 + "/germplasm{?queryParams*}") @Produces(MediaType.APPLICATION_JSON) @ProgramSecured(roleGroups = {ProgramSecuredRoleGroup.ALL}) public HttpResponse>>> getGermplasm( @PathVariable("programId") UUID programId, - @QueryValue @QueryValid(using = GermplasmQueryMapper.class) @Valid BrapiQuery queryParams) { + @QueryValue @QueryValid(using = GermplasmQueryMapper.class) @Valid GermplasmQuery queryParams) { try { log.debug("fetching germ for program: " + programId); + List germplasm = germplasmService.getGermplasm(programId); queryParams.setSortField(germplasmQueryMapper.getDefaultSortField()); queryParams.setSortOrder(germplasmQueryMapper.getDefaultSortOrder()); - return ResponseUtils.getBrapiQueryResponse(germplasm, germplasmQueryMapper, queryParams); + SearchRequest searchRequest = queryParams.constructSearchRequest(); + return ResponseUtils.getBrapiQueryResponse(germplasm, germplasmQueryMapper, queryParams, searchRequest); } catch (ApiException e) { log.info(e.getMessage(), e); return HttpResponse.status(HttpStatus.INTERNAL_SERVER_ERROR, "Error retrieving germplasm"); 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 c63646adc..e037cb96e 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/constants/BrAPIAdditionalInfoFields.java +++ b/src/main/java/org/breedinginsight/brapi/v2/constants/BrAPIAdditionalInfoFields.java @@ -21,4 +21,15 @@ public final class BrAPIAdditionalInfoFields { public static final String GERMPLASM_RAW_PEDIGREE = "rawPedigree"; public static final String GERMPLASM_PEDIGREE_BY_NAME = "pedigreeByName"; public static final String GERMPLASM_PEDIGREE_BY_UUID = "pedigreeByUUID"; + public static final String GERMPLASM_IMPORT_ENTRY_NUMBER = "importEntryNumber"; + public static final String GERMPLASM_FEMALE_PARENT_GID = "femaleParentGid"; + public static final String GERMPLASM_MALE_PARENT_GID = "maleParentGid"; + public static final String GERMPLASM_FEMALE_PARENT_ENTRY_NO = "femaleParentEntryNo"; + public static final String GERMPLASM_MALE_PARENT_ENTRY_NO = "maleParentEntryNo"; + public static final String CREATED_BY = "createdBy"; + public static final String CREATED_BY_USER_ID = "userId"; + public static final String CREATED_BY_USER_NAME = "userName"; + public static final String GERMPLASM_BREEDING_METHOD_ID = "breedingMethodId"; + public static final String GERMPLASM_BREEDING_METHOD = "breedingMethod"; + public static final String CREATED_DATE = "createdDate"; } 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 60e22a7f6..252d864aa 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java +++ b/src/main/java/org/breedinginsight/brapi/v2/dao/BrAPIGermplasmDAO.java @@ -49,8 +49,6 @@ @Context public class BrAPIGermplasmDAO { - private final String BREEDING_METHOD_ID_KEY = "breedingMethodId"; - private final ProgramDAO programDAO; private final ImportDAO importDAO; @@ -143,8 +141,8 @@ private Map processGermplasmForDisplay(List processGermplasmForDisplay(List parents = Arrays.asList(germplasm.getPedigree().split("/")); if (parents.size() >= 1) { if (programGermplasmByFullName.containsKey(parents.get(0))) { - newPedigreeString = programGermplasmByFullName.get(parents.get(0)).getAccessionNumber(); + String femaleParentAccessionNumber = programGermplasmByFullName.get(parents.get(0)).getAccessionNumber(); + newPedigreeString = femaleParentAccessionNumber; namePedigreeString = programGermplasmByFullName.get(parents.get(0)).getDefaultDisplayName(); uuidPedigreeString = programGermplasmByFullName.get(parents.get(0)).getExternalReferences(). stream().filter(ref -> ref.getReferenceSource().equals(referenceSource)). map(ref -> ref.getReferenceID()).findFirst().orElse(""); + additionalInfo.addProperty(BrAPIAdditionalInfoFields.GERMPLASM_FEMALE_PARENT_GID, femaleParentAccessionNumber); } } if (parents.size() == 2) { if (programGermplasmByFullName.containsKey(parents.get(1))) { - newPedigreeString += "/" + programGermplasmByFullName.get(parents.get(1)).getAccessionNumber(); + String maleParentAccessionNumber = programGermplasmByFullName.get(parents.get(1)).getAccessionNumber(); + newPedigreeString += "/" + maleParentAccessionNumber; namePedigreeString += "/" + programGermplasmByFullName.get(parents.get(1)).getDefaultDisplayName(); uuidPedigreeString += "/" + programGermplasmByFullName.get(parents.get(1)).getExternalReferences(). stream().filter(ref -> ref.getReferenceSource().equals(referenceSource)). map(ref -> ref.getReferenceID()).findFirst().orElse(""); + additionalInfo.addProperty(BrAPIAdditionalInfoFields.GERMPLASM_MALE_PARENT_GID, maleParentAccessionNumber); } } //For use in individual germplasm display diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/request/query/GermplasmQuery.java b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/GermplasmQuery.java new file mode 100644 index 000000000..3ba48a63a --- /dev/null +++ b/src/main/java/org/breedinginsight/brapi/v2/model/request/query/GermplasmQuery.java @@ -0,0 +1,39 @@ +package org.breedinginsight.brapi.v2.model.request.query; + +import io.micronaut.core.annotation.Introspected; +import lombok.Getter; +import org.breedinginsight.api.model.v1.request.query.FilterRequest; +import org.breedinginsight.api.model.v1.request.query.SearchRequest; +import org.breedinginsight.brapi.v1.model.request.query.BrapiQuery; +import org.jooq.tools.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +@Getter +@Introspected +public class GermplasmQuery extends BrapiQuery { + private String accessionNumber; + private String defaultDisplayName; + private String breedingMethod; + private String seedSource; + private String femaleParentGID; + private String maleParentGID; + private String createdDate; + private String createdByUserName; + private String synonym; + + public SearchRequest constructSearchRequest() { + List filters = new ArrayList<>(); + if (!StringUtils.isBlank(getAccessionNumber())) filters.add(constructFilterRequest("accessionNumber", getAccessionNumber())); + if (!StringUtils.isBlank(getDefaultDisplayName())) filters.add(constructFilterRequest("defaultDisplayName", getDefaultDisplayName())); + if (!StringUtils.isBlank(getBreedingMethod())) filters.add(constructFilterRequest("breedingMethod", getBreedingMethod())); + if (!StringUtils.isBlank(getSeedSource())) filters.add(constructFilterRequest("seedSource", getSeedSource())); + if (!StringUtils.isBlank(getFemaleParentGID())) filters.add(constructFilterRequest("femaleParentGID", getFemaleParentGID())); + if (!StringUtils.isBlank(getMaleParentGID())) filters.add(constructFilterRequest("maleParentGID", getMaleParentGID())); + if (!StringUtils.isBlank(getCreatedDate())) filters.add(constructFilterRequest("createdDate", getCreatedDate())); + if (!StringUtils.isBlank(getCreatedByUserName())) filters.add(constructFilterRequest("createdByUserName", getCreatedByUserName())); + if (!StringUtils.isBlank(getSynonym())) filters.add(constructFilterRequest("synonym", getSynonym())); + return new SearchRequest(filters); + } +} diff --git a/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/GermplasmQueryMapper.java b/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/GermplasmQueryMapper.java index 33e7f3e70..35219c99f 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/GermplasmQueryMapper.java +++ b/src/main/java/org/breedinginsight/brapi/v2/model/response/mappers/GermplasmQueryMapper.java @@ -4,11 +4,13 @@ import org.brapi.v2.model.germ.BrAPIGermplasm; import org.breedinginsight.api.v1.controller.metadata.SortOrder; import org.breedinginsight.brapi.v1.model.ObservationVariable; +import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; import org.breedinginsight.utilities.response.mappers.AbstractQueryMapper; import javax.inject.Singleton; import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; @Getter @Singleton @@ -21,7 +23,35 @@ public class GermplasmQueryMapper extends AbstractQueryMapper { public GermplasmQueryMapper() { fields = Map.ofEntries( - Map.entry("accessionNumber", BrAPIGermplasm::getAccessionNumber) + Map.entry("accessionNumber", BrAPIGermplasm::getAccessionNumber), + Map.entry("defaultDisplayName", BrAPIGermplasm::getDefaultDisplayName), + Map.entry("breedingMethod", (germplasm) -> + germplasm.getAdditionalInfo() != null && germplasm.getAdditionalInfo().has(BrAPIAdditionalInfoFields.GERMPLASM_BREEDING_METHOD) ? + germplasm.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_BREEDING_METHOD).getAsString() : + null), + Map.entry("seedSource", BrAPIGermplasm::getSeedSource), + Map.entry("femaleParentGID", (germplasm) -> + germplasm.getAdditionalInfo() != null && germplasm.getAdditionalInfo().has(BrAPIAdditionalInfoFields.GERMPLASM_FEMALE_PARENT_GID) ? + germplasm.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_FEMALE_PARENT_GID).getAsString() : + null), + Map.entry("maleParentGID", (germplasm) -> + germplasm.getAdditionalInfo() != null && germplasm.getAdditionalInfo().has(BrAPIAdditionalInfoFields.GERMPLASM_MALE_PARENT_GID) ? + germplasm.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_MALE_PARENT_GID).getAsString() : + null), + Map.entry("createdDate", (germplasm) -> + germplasm.getAdditionalInfo() != null && germplasm.getAdditionalInfo().has(BrAPIAdditionalInfoFields.CREATED_DATE) ? + germplasm.getAdditionalInfo().get(BrAPIAdditionalInfoFields.CREATED_DATE).getAsString() : + null), + Map.entry("createdByUserName", (germplasm) -> + germplasm.getAdditionalInfo() != null + && germplasm.getAdditionalInfo().has(BrAPIAdditionalInfoFields.CREATED_BY) + && germplasm.getAdditionalInfo().getAsJsonObject(BrAPIAdditionalInfoFields.CREATED_BY).has(BrAPIAdditionalInfoFields.CREATED_BY_USER_NAME) ? + germplasm.getAdditionalInfo().getAsJsonObject(BrAPIAdditionalInfoFields.CREATED_BY).get(BrAPIAdditionalInfoFields.CREATED_BY_USER_NAME).getAsString() : + null), + Map.entry("synonyms", (germplasm) -> + germplasm.getSynonyms() != null ? + germplasm.getSynonyms().stream().map((synonym) -> synonym.getSynonym()) + .collect(Collectors.toList()) : null) ); } 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 9d715e771..ced8c02f7 100644 --- a/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java +++ b/src/main/java/org/breedinginsight/brapi/v2/services/BrAPIGermplasmService.java @@ -13,6 +13,7 @@ import org.brapi.v2.model.core.response.BrAPIListsListResponse; import org.brapi.v2.model.germ.BrAPIGermplasm; import org.brapi.v2.model.germ.BrAPIGermplasmSynonyms; +import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; import org.breedinginsight.brapps.importer.daos.BrAPIListDAO; import org.breedinginsight.brapps.importer.model.exports.FileType; import org.breedinginsight.model.Column; @@ -109,8 +110,8 @@ public List> processData(List germplasm){ HashMap row = new HashMap<>(); row.put("GID", Integer.valueOf(germplasmEntry.getAccessionNumber())); row.put("Name", germplasmEntry.getGermplasmName()); - row.put("Entry No", germplasmEntry.getAdditionalInfo().get("importEntryNumber").getAsInt()); - row.put("Breeding Method", germplasmEntry.getAdditionalInfo().get("breedingMethod").getAsString()); + row.put("Entry No", germplasmEntry.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_IMPORT_ENTRY_NUMBER).getAsInt()); + row.put("Breeding Method", germplasmEntry.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_BREEDING_METHOD).getAsString()); String source = germplasmEntry.getSeedSource(); row.put("Source", source); @@ -152,7 +153,7 @@ public DownloadFile exportGermplasmList(UUID programId, String listId, FileType List germplasmNames = listData.getData(); List germplasm = germplasmDAO.getGermplasmByRawName(germplasmNames, programId); //processGermplasmForDisplay, numbers - germplasm.sort(Comparator.comparingInt(g -> g.getAdditionalInfo().get("importEntryNumber").getAsInt())); + germplasm.sort(Comparator.comparingInt(g -> g.getAdditionalInfo().get(BrAPIAdditionalInfoFields.GERMPLASM_IMPORT_ENTRY_NUMBER).getAsInt())); String listName = listData.getListName(); Optional optionalProgram = programService.getById(programId); 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 ae0fc63d5..c8c323619 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 @@ -25,6 +25,7 @@ import org.brapi.v2.model.core.request.BrAPIListNewRequest; import org.brapi.v2.model.germ.BrAPIGermplasm; import org.brapi.v2.model.germ.BrAPIGermplasmSynonyms; +import org.breedinginsight.brapi.v2.constants.BrAPIAdditionalInfoFields; import org.breedinginsight.brapps.importer.model.config.*; import org.breedinginsight.dao.db.tables.pojos.BreedingMethodEntity; import org.breedinginsight.model.Program; @@ -148,15 +149,15 @@ public BrAPIGermplasm constructBrAPIGermplasm(BreedingMethodEntity breedingMetho germplasm.setDefaultDisplayName(getGermplasmName()); germplasm.setGermplasmPUI(getGermplasmPUI()); germplasm.setCollection(getCollection()); - germplasm.putAdditionalInfoItem("importEntryNumber", entryNo); - germplasm.putAdditionalInfoItem("femaleParentGid", getFemaleParentDBID()); - germplasm.putAdditionalInfoItem("maleParentGid", getMaleParentDBID()); - germplasm.putAdditionalInfoItem("femaleParentEntryNo", getFemaleParentEntryNo()); - germplasm.putAdditionalInfoItem("maleParentEntryNo", getMaleParentEntryNo()); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GERMPLASM_IMPORT_ENTRY_NUMBER, entryNo); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GERMPLASM_FEMALE_PARENT_GID, getFemaleParentDBID()); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GERMPLASM_MALE_PARENT_GID, getMaleParentDBID()); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GERMPLASM_FEMALE_PARENT_ENTRY_NO, getFemaleParentEntryNo()); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GERMPLASM_MALE_PARENT_ENTRY_NO, getMaleParentEntryNo()); Map createdBy = new HashMap<>(); - createdBy.put("userId", user.getId().toString()); - createdBy.put("userName", user.getName()); - germplasm.putAdditionalInfoItem("createdBy", createdBy); + createdBy.put(BrAPIAdditionalInfoFields.CREATED_BY_USER_ID, user.getId().toString()); + createdBy.put(BrAPIAdditionalInfoFields.CREATED_BY_USER_NAME, user.getName()); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.CREATED_BY, createdBy); //TODO: Need to check that the acquisition date it in date format //brAPIGermplasm.setAcquisitionDate(pedigreeImport.getGermplasm().getAcquisitionDate()); germplasm.setCountryOfOriginCode(getCountryOfOrigin()); @@ -193,8 +194,8 @@ public BrAPIGermplasm constructBrAPIGermplasm(BreedingMethodEntity breedingMetho } if (breedingMethod != null) { - germplasm.putAdditionalInfoItem("breedingMethodId", breedingMethod.getId()); - germplasm.putAdditionalInfoItem("breedingMethod", breedingMethod.getName()); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GERMPLASM_BREEDING_METHOD_ID, breedingMethod.getId()); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.GERMPLASM_BREEDING_METHOD, breedingMethod.getName()); } // Synonyms @@ -235,7 +236,7 @@ private void setBrAPIGermplasmCommitFields(BrAPIGermplasm germplasm, String prog // Set createdDate field DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); - germplasm.putAdditionalInfoItem("createdDate", formatter.format(now)); + germplasm.putAdditionalInfoItem(BrAPIAdditionalInfoFields.CREATED_DATE, formatter.format(now)); // Update our synonyms to [-] if (germplasm.getSynonyms() != null && !germplasm.getSynonyms().isEmpty()) { diff --git a/src/main/java/org/breedinginsight/utilities/response/ResponseUtils.java b/src/main/java/org/breedinginsight/utilities/response/ResponseUtils.java index 71983d460..f56fe15f2 100644 --- a/src/main/java/org/breedinginsight/utilities/response/ResponseUtils.java +++ b/src/main/java/org/breedinginsight/utilities/response/ResponseUtils.java @@ -171,15 +171,19 @@ private static List sort(List data, QueryParams queryParams, AbstractQueryMapper private static List search(List data, SearchRequest searchRequest, AbstractQueryMapper mapper) { - List filterFields = searchRequest.getFilters().stream() - .map(filter -> new FilterField(mapper.getField(filter.getField()), filter.getValue())) - .collect(Collectors.toList()); + List filterFields = new ArrayList<>(); + if (searchRequest.getFilters() != null) { + filterFields = searchRequest.getFilters().stream() + .map(filter -> new FilterField(mapper.getField(filter.getField()), filter.getValue())) + .collect(Collectors.toList()); + } if (filterFields.size() > 0){ // Apply filters + List finalFilterFields = filterFields; return data.stream() .filter(record -> - filterFields.stream().allMatch(filterField -> { + finalFilterFields.stream().allMatch(filterField -> { if (filterField.getField().apply(record) == null) { return false; } else if (filterField.getField().apply(record) instanceof List || diff --git a/src/main/java/org/breedinginsight/utilities/response/mappers/FilterField.java b/src/main/java/org/breedinginsight/utilities/response/mappers/FilterField.java index cf3cc186a..cf0997194 100644 --- a/src/main/java/org/breedinginsight/utilities/response/mappers/FilterField.java +++ b/src/main/java/org/breedinginsight/utilities/response/mappers/FilterField.java @@ -18,12 +18,14 @@ package org.breedinginsight.utilities.response.mappers; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import java.util.function.Function; @Getter @AllArgsConstructor +@Builder public class FilterField { Function field; String value; diff --git a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java index a67702b5c..0d17e5585 100644 --- a/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java +++ b/src/test/java/org/breedinginsight/brapi/v2/GermplasmControllerIntegrationTest.java @@ -15,7 +15,10 @@ import org.breedinginsight.TestUtils; import org.breedinginsight.api.model.v1.request.ProgramRequest; import org.breedinginsight.api.model.v1.request.SpeciesRequest; +import org.breedinginsight.api.model.v1.request.query.FilterRequest; +import org.breedinginsight.api.model.v1.request.query.SearchRequest; import org.breedinginsight.api.v1.controller.TestTokenValidator; +import org.breedinginsight.brapi.v2.model.response.mappers.GermplasmQueryMapper; import org.breedinginsight.brapi.v2.services.BrAPIGermplasmService; import org.breedinginsight.brapps.importer.daos.BrAPIListDAO; import org.breedinginsight.dao.db.tables.pojos.BiUserEntity; @@ -23,6 +26,7 @@ import org.breedinginsight.model.Program; import org.breedinginsight.model.Species; import org.breedinginsight.services.SpeciesService; +import org.breedinginsight.utilities.response.mappers.FilterField; import org.jooq.DSLContext; import org.junit.jupiter.api.*; @@ -30,10 +34,12 @@ import java.io.File; import java.time.OffsetDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Map; import static io.micronaut.http.HttpRequest.GET; +import static io.micronaut.http.HttpRequest.POST; import static org.junit.jupiter.api.Assertions.*; @MicronautTest @@ -60,6 +66,7 @@ public class GermplasmControllerIntegrationTest extends BrAPITest { private Gson gson = new GsonBuilder().registerTypeAdapter(OffsetDateTime.class, (JsonDeserializer) (json, type, context) -> OffsetDateTime.parse(json.getAsString())) .create(); + GermplasmQueryMapper germplasmQueryMapper = new GermplasmQueryMapper(); private final String germplasmListName = "Program List"; private final String germplasmListDesc = "Program List"; @@ -231,4 +238,110 @@ public void getAllGermplasmListsSuccess() { } } } + + @Test + @SneakyThrows + public void filterGermplasmNameSuccess() { + + SearchRequest searchRequest = constructSearchRequest( + List.of("defaultDisplayName", "synonyms"), + List.of("Full", "test1")); + JsonArray data = callFilterGermplasm(searchRequest); + + assertEquals(1, data.size(), "Wrong number of germplasm were returned"); + JsonObject germplasm = data.get(0).getAsJsonObject(); + assertEquals("Full Germplasm 1", germplasm.get("germplasmName").getAsString()); + } + + @Test + @SneakyThrows + public void filterGermplasmBreedingMethodSuccess() { + + SearchRequest searchRequest = constructSearchRequest( + List.of("breedingMethod", "defaultDisplayName"), + List.of("Aneupoly", "Germplasm 1")); + JsonArray data = callFilterGermplasm(searchRequest); + + assertEquals(1, data.size(), "Wrong number of germplasm were returned"); + JsonObject germplasm = data.get(0).getAsJsonObject(); + assertEquals("Full Germplasm 1", germplasm.get("germplasmName").getAsString()); + } + + @Test + @SneakyThrows + public void filterGermplasmSourceSuccess() { + + SearchRequest searchRequest = constructSearchRequest( + List.of("seedSource"), + List.of("cultivate")); + JsonArray data = callFilterGermplasm(searchRequest); + + assertEquals(1, data.size(), "Wrong number of germplasm were returned"); + JsonObject germplasm = data.get(0).getAsJsonObject(); + assertEquals("Germplasm 2", germplasm.get("germplasmName").getAsString()); + } + + @Test + @SneakyThrows + public void filterGermplasmFemaleParentGIDSuccess() { + + SearchRequest searchRequest = constructSearchRequest( + List.of("femaleParentGID"), + List.of("2")); + JsonArray data = callFilterGermplasm(searchRequest); + + assertEquals(1, data.size(), "Wrong number of germplasm were returned"); + JsonObject germplasm = data.get(0).getAsJsonObject(); + assertEquals("Full Germplasm 2", germplasm.get("germplasmName").getAsString()); + } + + @Test + @SneakyThrows + public void filterGermplasmMaleParentGIDSuccess() { + + SearchRequest searchRequest = constructSearchRequest( + List.of("maleParentGID"), + List.of("2")); + JsonArray data = callFilterGermplasm(searchRequest); + + assertEquals(1, data.size(), "Wrong number of germplasm were returned"); + JsonObject germplasm = data.get(0).getAsJsonObject(); + assertEquals("Full Germplasm 1", germplasm.get("germplasmName").getAsString()); + } + + @Test + @SneakyThrows + public void filterGermplasmOneMatchOneNoMatch() { + + SearchRequest searchRequest = constructSearchRequest( + List.of("defaultDisplayName", "synonyms"), + List.of("No Match", "test1")); + JsonArray data = callFilterGermplasm(searchRequest); + + assertEquals(0, data.size(), "Wrong number of germplasm were returned"); + } + + public JsonArray callFilterGermplasm(SearchRequest searchRequest) { + + Flowable> call = client.exchange( + POST(String.format("/programs/%s/brapi/v2/search/germplasm",validProgram.getId().toString()), gson.toJson(searchRequest)) + .cookie(new NettyCookie("phylo-token", "test-registered-user")), String.class + ); + HttpResponse response = call.blockingFirst(); + assertEquals(HttpStatus.OK, response.getStatus()); + + JsonObject result = JsonParser.parseString(response.body()).getAsJsonObject().getAsJsonObject("result"); + + return result.getAsJsonArray("data"); + } + + public SearchRequest constructSearchRequest(List fields, List values) { + SearchRequest searchRequest = new SearchRequest(); + List filters = new ArrayList<>(); + for (int i = 0; i < fields.size(); i++) { + filters.add(new FilterRequest(fields.get(i), values.get(i))); + } + searchRequest.setFilters(filters); + return searchRequest; + } }