From c2534bc3caf5a468475a79fad873a8245b515713 Mon Sep 17 00:00:00 2001 From: Adam Gibson Date: Tue, 2 Jul 2024 14:24:55 -0500 Subject: [PATCH 1/5] SCRUM-4185 updated executor, service, and validator --- ...equenceTargetingReagentCrudController.java | 2 +- .../SequenceTargetingReagentExecutor.java | 95 +++++++++++++++++-- .../SequenceTargetingReagentService.java | 70 ++++++++++++++ ...quenceTargetingReagentFmsDTOValidator.java | 69 +++++++++++++- 4 files changed, 221 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/alliancegenome/curation_api/controllers/crud/SequenceTargetingReagentCrudController.java b/src/main/java/org/alliancegenome/curation_api/controllers/crud/SequenceTargetingReagentCrudController.java index e3d52bf3c..61afd749a 100644 --- a/src/main/java/org/alliancegenome/curation_api/controllers/crud/SequenceTargetingReagentCrudController.java +++ b/src/main/java/org/alliancegenome/curation_api/controllers/crud/SequenceTargetingReagentCrudController.java @@ -30,7 +30,7 @@ protected void init() { @Override public APIResponse updateSequenceTargetingReagent(String dataProvider, SequenceTargetingReagentIngestFmsDTO sqtrFmsDTO) { - return sqtrExecutor.runLoadApi(sqtrService, dataProvider, sqtrFmsDTO.getData()); + return sqtrExecutor.runLoadApi(dataProvider, sqtrFmsDTO.getData()); } } diff --git a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java index 3e48a6edd..69e538733 100644 --- a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java +++ b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java @@ -6,13 +6,19 @@ import java.util.zip.GZIPInputStream; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; +import org.alliancegenome.curation_api.exceptions.ObjectUpdateException; +import org.alliancegenome.curation_api.exceptions.ObjectUpdateException.ObjectUpdateExceptionData; import org.alliancegenome.curation_api.interfaces.AGRCurationSchemaVersion; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkFMSLoad; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkLoadFile; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkLoadFileHistory; +import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentIngestFmsDTO; +import org.alliancegenome.curation_api.response.APIResponse; +import org.alliancegenome.curation_api.response.LoadHistoryResponce; import org.alliancegenome.curation_api.services.SequenceTargetingReagentService; +import org.alliancegenome.curation_api.util.ProcessDisplayHelper; import org.apache.commons.lang3.StringUtils; import jakarta.enterprise.context.ApplicationScoped; @@ -29,33 +35,38 @@ public void execLoad(BulkLoadFile bulkLoadFile) { BulkFMSLoad fms = (BulkFMSLoad) bulkLoadFile.getBulkLoad(); SequenceTargetingReagentIngestFmsDTO sqtrIngestFmsDTO = mapper.readValue( - new GZIPInputStream(new FileInputStream(bulkLoadFile.getLocalFilePath())), SequenceTargetingReagentIngestFmsDTO.class); + new GZIPInputStream(new FileInputStream(bulkLoadFile.getLocalFilePath())), + SequenceTargetingReagentIngestFmsDTO.class); bulkLoadFile.setRecordCount(sqtrIngestFmsDTO.getData().size()); - AGRCurationSchemaVersion version = SequenceTargetingReagent.class.getAnnotation(AGRCurationSchemaVersion.class); + AGRCurationSchemaVersion version = SequenceTargetingReagent.class + .getAnnotation(AGRCurationSchemaVersion.class); bulkLoadFile.setLinkMLSchemaVersion(version.max()); - if (sqtrIngestFmsDTO.getMetaData() != null && StringUtils.isNotBlank(sqtrIngestFmsDTO.getMetaData().getRelease())) { + if (sqtrIngestFmsDTO.getMetaData() != null + && StringUtils.isNotBlank(sqtrIngestFmsDTO.getMetaData().getRelease())) { bulkLoadFile.setAllianceMemberReleaseVersion(sqtrIngestFmsDTO.getMetaData().getRelease()); } BackendBulkDataProvider dataProvider = BackendBulkDataProvider.valueOf(fms.getFmsDataSubType()); List sqtrIdsLoaded = new ArrayList<>(); - List sqtrIdsBefore = new ArrayList<>(); + List sqtrIdsBefore = sqtrService.getIdsByDataProvider(dataProvider.name()); + List sqtrGeneAssociationIdsLoaded = new ArrayList<>(); + List sqtrGeneAssociationIdsBefore = sqtrService.getIdsByDataProvider(dataProvider.name()); + bulkLoadFileDAO.merge(bulkLoadFile); BulkLoadFileHistory history = new BulkLoadFileHistory(sqtrIngestFmsDTO.getData().size()); - boolean success = runLoad(sqtrService, history, dataProvider, sqtrIngestFmsDTO.getData(), sqtrIdsLoaded); + runLoad(history, dataProvider, sqtrIngestFmsDTO.getData(), sqtrIdsLoaded, sqtrGeneAssociationIdsLoaded); + + runCleanup(sqtrService, history, dataProvider.name(), sqtrIdsBefore, sqtrIdsLoaded, "SQTR", bulkLoadFile.getMd5Sum()); + runCleanup(sqtrService, history, dataProvider.name(), sqtrGeneAssociationIdsBefore, sqtrGeneAssociationIdsLoaded, "SQTR Gene Associations", bulkLoadFile.getMd5Sum()); - if (success) { - runCleanup(sqtrService, history, dataProvider.name(), sqtrIdsBefore, sqtrIdsLoaded, "SQTR", bulkLoadFile.getMd5Sum()); - } - history.finishLoad(); - + updateHistory(history); } catch (Exception e) { failLoad(bulkLoadFile, e); @@ -63,4 +74,68 @@ public void execLoad(BulkLoadFile bulkLoadFile) { } } + public APIResponse runLoadApi(String dataProviderName, List sqtrDTOs) { + List sqtrIdsLoaded = new ArrayList<>(); + List sqtrGeneAssociationIdsLoaded = new ArrayList<>(); + + BulkLoadFileHistory history = new BulkLoadFileHistory(sqtrDTOs.size()); + BackendBulkDataProvider dataProvider = BackendBulkDataProvider.valueOf(dataProviderName); + runLoad(history, dataProvider, sqtrDTOs, sqtrIdsLoaded, sqtrGeneAssociationIdsLoaded); + history.finishLoad(); + + return new LoadHistoryResponce(history); + } + + private void runLoad(BulkLoadFileHistory history, BackendBulkDataProvider dataProvider, List sqtrs, List sqtrIdsLoaded, List sqtrGeneAssociationIdsLoaded) { + ProcessDisplayHelper ph = new ProcessDisplayHelper(); + ph.addDisplayHandler(loadProcessDisplayService); + ph.startProcess("Sequence Targeting Reagent DTO Update for " + dataProvider.name(), sqtrs.size() * 2); + + loadSequenceTargetingReagents(history, sqtrs, sqtrIdsLoaded, dataProvider, ph); + loadSequenceTargetingReagentGeneAssociations(history, sqtrs, sqtrGeneAssociationIdsLoaded, dataProvider, ph); + + ph.finishProcess(); + + } + + private void loadSequenceTargetingReagents(BulkLoadFileHistory history, List sqtrs, List idsLoaded, BackendBulkDataProvider dataProvider, ProcessDisplayHelper ph) { + for (SequenceTargetingReagentFmsDTO dto : sqtrs) { + try { + SequenceTargetingReagent dbObject = sqtrService.upsert(dto, dataProvider); + history.incrementCompleted(); + if (idsLoaded != null) { + idsLoaded.add(dbObject.getId()); + } + } catch (ObjectUpdateException e) { + history.incrementFailed(); + addException(history, e.getData()); + } catch (Exception e) { + history.incrementFailed(); + addException(history, new ObjectUpdateExceptionData(dto, e.getMessage(), e.getStackTrace())); + } + updateHistory(history); + ph.progressProcess(); + } + } + + private void loadSequenceTargetingReagentGeneAssociations(BulkLoadFileHistory history, List sqtrs, List idsLoaded, BackendBulkDataProvider dataProvider, ProcessDisplayHelper ph) { + + for (SequenceTargetingReagentFmsDTO dto : sqtrs) { + try { + List associationIds = sqtrService.addGeneAssociations(dto, dataProvider); + history.incrementCompleted(); + if (idsLoaded != null) { + idsLoaded.addAll(associationIds); + } + } catch (ObjectUpdateException e) { + history.incrementFailed(); + addException(history, e.getData()); + } catch (Exception e) { + history.incrementFailed(); + addException(history, new ObjectUpdateExceptionData(dto, e.getMessage(), e.getStackTrace())); + } + updateHistory(history); + ph.progressProcess(); + } + } } diff --git a/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java b/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java index f5bc01489..66bd201a1 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java +++ b/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java @@ -1,10 +1,20 @@ package org.alliancegenome.curation_api.services; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.alliancegenome.curation_api.constants.EntityFieldConstants; import org.alliancegenome.curation_api.dao.SequenceTargetingReagentDAO; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; import org.alliancegenome.curation_api.exceptions.ObjectUpdateException; import org.alliancegenome.curation_api.interfaces.crud.BaseUpsertServiceInterface; +import org.alliancegenome.curation_api.model.entities.Gene; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; +import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; import org.alliancegenome.curation_api.services.base.BaseEntityCrudService; import org.alliancegenome.curation_api.services.validation.dto.fms.SequenceTargetingReagentFmsDTOValidator; @@ -25,10 +35,70 @@ public class SequenceTargetingReagentService extends BaseEntityCrudService addGeneAssociations(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider dataProvider) throws ObjectUpdateException { + + List associations = sqtrDtoValidator.validateSQTRGeneAssociationFmsDTO(dto, dataProvider); + + for (SequenceTargetingReagentGeneAssociation association : associations) { + if (association != null) { + addAssociationToSQTR(association); + addAssociationToGene(association); + } + } + + return associations.stream().map(SequenceTargetingReagentGeneAssociation::getId).collect(Collectors.toList()); + } + + private void addAssociationToSQTR(SequenceTargetingReagentGeneAssociation association) { + SequenceTargetingReagent sqtr = association.getSequenceTargetingReagentAssociationSubject(); + List currentAssociations = sqtr.getSequenceTargetingReagentGeneAssociations(); + if (currentAssociations == null) { + currentAssociations = new ArrayList<>(); + sqtr.setSequenceTargetingReagentGeneAssociations(currentAssociations); + } + + List currentAssociationIds = new ArrayList<>(); + for (SequenceTargetingReagentGeneAssociation sqtrga : currentAssociations) { + currentAssociationIds.add(sqtrga.getId()); + } + + if (!currentAssociationIds.contains(association.getId())) { + currentAssociations.add(association); + } + } + + private void addAssociationToGene(SequenceTargetingReagentGeneAssociation association) { + Gene gene = association.getSequenceTargetingReagentGeneAssociationObject(); + List currentAssociations = gene.getSequenceTargetingReagentGeneAssociations(); + if (currentAssociations == null) { + currentAssociations = new ArrayList<>(); + gene.setSequenceTargetingReagentGeneAssociations(currentAssociations); + } + + List currentAssociationIds = new ArrayList<>(); + for (SequenceTargetingReagentGeneAssociation sqtrga : currentAssociations) { + currentAssociationIds.add(sqtrga.getId()); + } + + if (!currentAssociationIds.contains(association.getId())) { + currentAssociations.add(association); + } + + } + public List getIdsByDataProvider(String dataProvider) { + Map params = new HashMap<>(); + params.put(EntityFieldConstants.DATA_PROVIDER, dataProvider); + List ids = sqtrDAO.findIdsByParams(params); + ids.removeIf(Objects::isNull); + return ids; } } diff --git a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java index 6cd17f9cd..a8e28b493 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java +++ b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java @@ -1,15 +1,24 @@ package org.alliancegenome.curation_api.services.validation.dto.fms; +import java.util.ArrayList; +import java.util.List; + import org.alliancegenome.curation_api.constants.ValidationConstants; import org.alliancegenome.curation_api.dao.SequenceTargetingReagentDAO; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; import org.alliancegenome.curation_api.exceptions.ObjectValidationException; +import org.alliancegenome.curation_api.model.entities.Gene; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; +import org.alliancegenome.curation_api.model.entities.VocabularyTerm; +import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; import org.alliancegenome.curation_api.model.entities.ontology.NCBITaxonTerm; import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; import org.alliancegenome.curation_api.response.ObjectResponse; import org.alliancegenome.curation_api.response.SearchResponse; import org.alliancegenome.curation_api.services.DataProviderService; +import org.alliancegenome.curation_api.services.GeneService; +import org.alliancegenome.curation_api.services.SequenceTargetingReagentService; +import org.alliancegenome.curation_api.services.VocabularyTermService; import org.alliancegenome.curation_api.services.ontology.NcbiTaxonTermService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -19,14 +28,19 @@ @RequestScoped public class SequenceTargetingReagentFmsDTOValidator { - @Inject - DataProviderService dataProviderService; + @Inject DataProviderService dataProviderService; + + @Inject GeneService geneService; - @Inject - SequenceTargetingReagentDAO sqtrDAO; + @Inject SequenceTargetingReagentDAO sqtrDAO; @Inject NcbiTaxonTermService ncbiTaxonTermService; + @Inject SequenceTargetingReagentService sqtrService; + + @Inject VocabularyTermService vocabularyTermService; + + public SequenceTargetingReagent validateSQTRFmsDTO(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider beDataProvider) throws ObjectValidationException { ObjectResponse sqtrResponse = new ObjectResponse<>(); @@ -87,4 +101,51 @@ public SequenceTargetingReagent validateSQTRFmsDTO(SequenceTargetingReagentFmsDT return sqtr; } + + public List validateSQTRGeneAssociationFmsDTO(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider beDataProvider) throws ObjectValidationException { + + List strGeneAssociations = new ArrayList<>(); + ObjectResponse sqtrResponse = new ObjectResponse<>(); + + SequenceTargetingReagent sqtr; + SearchResponse sqtrSearchResponse = sqtrDAO.findByField("modEntityId", dto.getPrimaryId()); + + if (sqtrSearchResponse == null || sqtrSearchResponse.getSingleResult() == null) { + sqtrResponse.addErrorMessage("modEntityId", ValidationConstants.INVALID_MESSAGE + " (" + dto.getPrimaryId() + ")"); + sqtr = new SequenceTargetingReagent(); + } else { + sqtr = sqtrSearchResponse.getSingleResult(); + } + + + VocabularyTerm relation; + SearchResponse relationSearchResponse = vocabularyTermService.findByField("name", "targets"); + if (relationSearchResponse == null || relationSearchResponse.getSingleResult() == null) { + sqtrResponse.addErrorMessage("relation", ValidationConstants.INVALID_MESSAGE + " (" + "targets" + ")"); + relation = new VocabularyTerm(); + } else { + relation = relationSearchResponse.getSingleResult(); + } + + for (String geneId : dto.getTargetGeneIds()) { + Gene gene = geneService.findByIdentifierString(geneId); + + if (gene == null) { + sqtrResponse.addErrorMessage("targetGeneIds", ValidationConstants.INVALID_MESSAGE + " (" + geneId + ")"); + } else { + SequenceTargetingReagentGeneAssociation strGeneAssociation = new SequenceTargetingReagentGeneAssociation(); + strGeneAssociation.setSequenceTargetingReagentAssociationSubject(sqtr); + strGeneAssociation.setRelation(relation); + strGeneAssociation.setSequenceTargetingReagentGeneAssociationObject(gene); + + strGeneAssociations.add(strGeneAssociation); + } + + } + if (sqtrResponse.hasErrors()) { + throw new ObjectValidationException(dto, sqtrResponse.errorMessagesString()); + } + + return strGeneAssociations; + } } From 452982b05cdf3f95e7e8d03a3a4295a1e11702d4 Mon Sep 17 00:00:00 2001 From: Adam Gibson Date: Mon, 8 Jul 2024 10:25:39 -0500 Subject: [PATCH 2/5] SCRUM-4185 added service, validator, and dao for sqtrGeneAssociations --- ...nceTargetingReagentGeneAssociationDAO.java | 15 +++ .../SequenceTargetingReagentExecutor.java | 5 +- .../SequenceTargetingReagentService.java | 52 --------- ...argetingReagentGeneAssociationService.java | 105 ++++++++++++++++++ ...ReagentGeneAssociationFmsDTOValidator.java | 76 +++++++++++++ ...quenceTargetingReagentFmsDTOValidator.java | 46 -------- 6 files changed, 200 insertions(+), 99 deletions(-) create mode 100644 src/main/java/org/alliancegenome/curation_api/dao/associations/SequenceTargetingReagentGeneAssociationDAO.java create mode 100644 src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java create mode 100644 src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java diff --git a/src/main/java/org/alliancegenome/curation_api/dao/associations/SequenceTargetingReagentGeneAssociationDAO.java b/src/main/java/org/alliancegenome/curation_api/dao/associations/SequenceTargetingReagentGeneAssociationDAO.java new file mode 100644 index 000000000..bc512d663 --- /dev/null +++ b/src/main/java/org/alliancegenome/curation_api/dao/associations/SequenceTargetingReagentGeneAssociationDAO.java @@ -0,0 +1,15 @@ +package org.alliancegenome.curation_api.dao.associations; + +import org.alliancegenome.curation_api.dao.base.BaseSQLDAO; +import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; + +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class SequenceTargetingReagentGeneAssociationDAO extends BaseSQLDAO { + + protected SequenceTargetingReagentGeneAssociationDAO() { + super(SequenceTargetingReagentGeneAssociation.class); + } + +} diff --git a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java index 69e538733..708b12cfe 100644 --- a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java +++ b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java @@ -10,6 +10,7 @@ import org.alliancegenome.curation_api.exceptions.ObjectUpdateException.ObjectUpdateExceptionData; import org.alliancegenome.curation_api.interfaces.AGRCurationSchemaVersion; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; +import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkFMSLoad; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkLoadFile; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkLoadFileHistory; @@ -18,6 +19,7 @@ import org.alliancegenome.curation_api.response.APIResponse; import org.alliancegenome.curation_api.response.LoadHistoryResponce; import org.alliancegenome.curation_api.services.SequenceTargetingReagentService; +import org.alliancegenome.curation_api.services.associations.SequenceTargetingReagentGeneAssociationService; import org.alliancegenome.curation_api.util.ProcessDisplayHelper; import org.apache.commons.lang3.StringUtils; @@ -27,6 +29,7 @@ @ApplicationScoped public class SequenceTargetingReagentExecutor extends LoadFileExecutor { @Inject SequenceTargetingReagentService sqtrService; + @Inject SequenceTargetingReagentGeneAssociationService sqtrGeneAssociationService; public void execLoad(BulkLoadFile bulkLoadFile) { @@ -122,7 +125,7 @@ private void loadSequenceTargetingReagentGeneAssociations(BulkLoadFileHistory hi for (SequenceTargetingReagentFmsDTO dto : sqtrs) { try { - List associationIds = sqtrService.addGeneAssociations(dto, dataProvider); + List associationIds = sqtrGeneAssociationService.addGeneAssociations(dto, dataProvider); history.incrementCompleted(); if (idsLoaded != null) { idsLoaded.addAll(associationIds); diff --git a/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java b/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java index 66bd201a1..a11689115 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java +++ b/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java @@ -42,58 +42,6 @@ public SequenceTargetingReagent upsert(SequenceTargetingReagentFmsDTO dto, Backe return sqtrDAO.persist(sqtr); } - @Transactional - public List addGeneAssociations(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider dataProvider) throws ObjectUpdateException { - - List associations = sqtrDtoValidator.validateSQTRGeneAssociationFmsDTO(dto, dataProvider); - - for (SequenceTargetingReagentGeneAssociation association : associations) { - if (association != null) { - addAssociationToSQTR(association); - addAssociationToGene(association); - } - } - - return associations.stream().map(SequenceTargetingReagentGeneAssociation::getId).collect(Collectors.toList()); - } - - private void addAssociationToSQTR(SequenceTargetingReagentGeneAssociation association) { - SequenceTargetingReagent sqtr = association.getSequenceTargetingReagentAssociationSubject(); - List currentAssociations = sqtr.getSequenceTargetingReagentGeneAssociations(); - if (currentAssociations == null) { - currentAssociations = new ArrayList<>(); - sqtr.setSequenceTargetingReagentGeneAssociations(currentAssociations); - } - - List currentAssociationIds = new ArrayList<>(); - for (SequenceTargetingReagentGeneAssociation sqtrga : currentAssociations) { - currentAssociationIds.add(sqtrga.getId()); - } - - if (!currentAssociationIds.contains(association.getId())) { - currentAssociations.add(association); - } - } - - private void addAssociationToGene(SequenceTargetingReagentGeneAssociation association) { - Gene gene = association.getSequenceTargetingReagentGeneAssociationObject(); - List currentAssociations = gene.getSequenceTargetingReagentGeneAssociations(); - if (currentAssociations == null) { - currentAssociations = new ArrayList<>(); - gene.setSequenceTargetingReagentGeneAssociations(currentAssociations); - } - - List currentAssociationIds = new ArrayList<>(); - for (SequenceTargetingReagentGeneAssociation sqtrga : currentAssociations) { - currentAssociationIds.add(sqtrga.getId()); - } - - if (!currentAssociationIds.contains(association.getId())) { - currentAssociations.add(association); - } - - } - public List getIdsByDataProvider(String dataProvider) { Map params = new HashMap<>(); params.put(EntityFieldConstants.DATA_PROVIDER, dataProvider); diff --git a/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java b/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java new file mode 100644 index 000000000..8a920fa87 --- /dev/null +++ b/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java @@ -0,0 +1,105 @@ +package org.alliancegenome.curation_api.services.associations; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.alliancegenome.curation_api.dao.associations.SequenceTargetingReagentGeneAssociationDAO; +import org.alliancegenome.curation_api.dao.associations.alleleAssociations.AlleleGeneAssociationDAO; +import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; +import org.alliancegenome.curation_api.exceptions.ObjectUpdateException; +import org.alliancegenome.curation_api.interfaces.crud.BaseUpsertServiceInterface; +import org.alliancegenome.curation_api.model.entities.Gene; +import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; +import org.alliancegenome.curation_api.model.entities.associations.alleleAssociations.AlleleGeneAssociation; +import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; +import org.alliancegenome.curation_api.model.ingest.dto.associations.alleleAssociations.AlleleGeneAssociationDTO; +import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; +import org.alliancegenome.curation_api.services.base.BaseAssociationDTOCrudService; +import org.alliancegenome.curation_api.services.validation.associations.SequenceTargetingReagentGeneAssociationFmsDTOValidator; + +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; +import jakarta.transaction.Transactional; + +@RequestScoped +public class SequenceTargetingReagentGeneAssociationService extends + BaseAssociationDTOCrudService { + @Inject + SequenceTargetingReagentGeneAssociationDAO sequenceTargetingReagentGeneAssociationDAO; + @Inject + SequenceTargetingReagentGeneAssociationFmsDTOValidator sequenceTargetingReagentGeneAssociationFmsDTOValidator; + + @Override + @PostConstruct + protected void init() { + setSQLDao(sequenceTargetingReagentGeneAssociationDAO); + } + + @Transactional + public SequenceTargetingReagentGeneAssociation upsert(SequenceTargetingReagentFmsDTO dto, + BackendBulkDataProvider dataProvider) throws ObjectUpdateException { + // TODO: fix this placeholder code + SequenceTargetingReagentGeneAssociation sequenceTargetingReagentGeneAssociation = new SequenceTargetingReagentGeneAssociation(); + return sequenceTargetingReagentGeneAssociation; + } + + // TODO: rename? + @Transactional + public List addGeneAssociations(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider dataProvider) + throws ObjectUpdateException { + + List associations = sequenceTargetingReagentGeneAssociationFmsDTOValidator + .validateSQTRGeneAssociationFmsDTO(dto, dataProvider); + + for (SequenceTargetingReagentGeneAssociation association : associations) { + if (association != null) { + addAssociationToSQTR(association); + addAssociationToGene(association); + } + } + + return associations.stream().map(SequenceTargetingReagentGeneAssociation::getId) + .collect(Collectors.toList()); + } + + private void addAssociationToSQTR(SequenceTargetingReagentGeneAssociation association) { + SequenceTargetingReagent sqtr = association.getSequenceTargetingReagentAssociationSubject(); + List currentAssociations = sqtr + .getSequenceTargetingReagentGeneAssociations(); + if (currentAssociations == null) { + currentAssociations = new ArrayList<>(); + sqtr.setSequenceTargetingReagentGeneAssociations(currentAssociations); + } + + List currentAssociationIds = new ArrayList<>(); + for (SequenceTargetingReagentGeneAssociation sqtrga : currentAssociations) { + currentAssociationIds.add(sqtrga.getId()); + } + + if (!currentAssociationIds.contains(association.getId())) { + currentAssociations.add(association); + } + } + + private void addAssociationToGene(SequenceTargetingReagentGeneAssociation association) { + Gene gene = association.getSequenceTargetingReagentGeneAssociationObject(); + List currentAssociations = gene + .getSequenceTargetingReagentGeneAssociations(); + if (currentAssociations == null) { + currentAssociations = new ArrayList<>(); + gene.setSequenceTargetingReagentGeneAssociations(currentAssociations); + } + + List currentAssociationIds = new ArrayList<>(); + for (SequenceTargetingReagentGeneAssociation sqtrga : currentAssociations) { + currentAssociationIds.add(sqtrga.getId()); + } + + if (!currentAssociationIds.contains(association.getId())) { + currentAssociations.add(association); + } + + } +} diff --git a/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java b/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java new file mode 100644 index 000000000..74ff2f979 --- /dev/null +++ b/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java @@ -0,0 +1,76 @@ +package org.alliancegenome.curation_api.services.validation.associations; + +import java.util.ArrayList; +import java.util.List; + +import org.alliancegenome.curation_api.constants.ValidationConstants; +import org.alliancegenome.curation_api.dao.SequenceTargetingReagentDAO; +import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; +import org.alliancegenome.curation_api.exceptions.ObjectValidationException; +import org.alliancegenome.curation_api.model.entities.Gene; +import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; +import org.alliancegenome.curation_api.model.entities.VocabularyTerm; +import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; +import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; +import org.alliancegenome.curation_api.response.ObjectResponse; +import org.alliancegenome.curation_api.response.SearchResponse; +import org.alliancegenome.curation_api.services.GeneService; +import org.alliancegenome.curation_api.services.VocabularyTermService; + +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Inject; + +@RequestScoped +public class SequenceTargetingReagentGeneAssociationFmsDTOValidator { + @Inject SequenceTargetingReagentDAO sqtrDAO; + @Inject VocabularyTermService vocabularyTermService; + @Inject GeneService geneService; + + public List validateSQTRGeneAssociationFmsDTO( SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider beDataProvider) throws ObjectValidationException { + List strGeneAssociations = new ArrayList<>(); + ObjectResponse sqtrResponse = new ObjectResponse<>(); + + SequenceTargetingReagent sqtr; + SearchResponse sqtrSearchResponse = sqtrDAO.findByField("modEntityId", + dto.getPrimaryId()); + + if (sqtrSearchResponse == null || sqtrSearchResponse.getSingleResult() == null) { + sqtrResponse.addErrorMessage("modEntityId", + ValidationConstants.INVALID_MESSAGE + " (" + dto.getPrimaryId() + ")"); + sqtr = new SequenceTargetingReagent(); + } else { + sqtr = sqtrSearchResponse.getSingleResult(); + } + + VocabularyTerm relation; + SearchResponse relationSearchResponse = vocabularyTermService.findByField("name", "targets"); + if (relationSearchResponse == null || relationSearchResponse.getSingleResult() == null) { + sqtrResponse.addErrorMessage("relation", ValidationConstants.INVALID_MESSAGE + " (" + "targets" + ")"); + relation = new VocabularyTerm(); + } else { + relation = relationSearchResponse.getSingleResult(); + } + + for (String geneId : dto.getTargetGeneIds()) { + Gene gene = geneService.findByIdentifierString(geneId); + + if (gene == null) { + sqtrResponse.addErrorMessage("targetGeneIds", + ValidationConstants.INVALID_MESSAGE + " (" + geneId + ")"); + } else { + SequenceTargetingReagentGeneAssociation strGeneAssociation = new SequenceTargetingReagentGeneAssociation(); + strGeneAssociation.setSequenceTargetingReagentAssociationSubject(sqtr); + strGeneAssociation.setRelation(relation); + strGeneAssociation.setSequenceTargetingReagentGeneAssociationObject(gene); + + strGeneAssociations.add(strGeneAssociation); + } + + } + if (sqtrResponse.hasErrors()) { + throw new ObjectValidationException(dto, sqtrResponse.errorMessagesString()); + } + + return strGeneAssociations; + } +} diff --git a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java index a8e28b493..37684191e 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java +++ b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java @@ -102,50 +102,4 @@ public SequenceTargetingReagent validateSQTRFmsDTO(SequenceTargetingReagentFmsDT return sqtr; } - public List validateSQTRGeneAssociationFmsDTO(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider beDataProvider) throws ObjectValidationException { - - List strGeneAssociations = new ArrayList<>(); - ObjectResponse sqtrResponse = new ObjectResponse<>(); - - SequenceTargetingReagent sqtr; - SearchResponse sqtrSearchResponse = sqtrDAO.findByField("modEntityId", dto.getPrimaryId()); - - if (sqtrSearchResponse == null || sqtrSearchResponse.getSingleResult() == null) { - sqtrResponse.addErrorMessage("modEntityId", ValidationConstants.INVALID_MESSAGE + " (" + dto.getPrimaryId() + ")"); - sqtr = new SequenceTargetingReagent(); - } else { - sqtr = sqtrSearchResponse.getSingleResult(); - } - - - VocabularyTerm relation; - SearchResponse relationSearchResponse = vocabularyTermService.findByField("name", "targets"); - if (relationSearchResponse == null || relationSearchResponse.getSingleResult() == null) { - sqtrResponse.addErrorMessage("relation", ValidationConstants.INVALID_MESSAGE + " (" + "targets" + ")"); - relation = new VocabularyTerm(); - } else { - relation = relationSearchResponse.getSingleResult(); - } - - for (String geneId : dto.getTargetGeneIds()) { - Gene gene = geneService.findByIdentifierString(geneId); - - if (gene == null) { - sqtrResponse.addErrorMessage("targetGeneIds", ValidationConstants.INVALID_MESSAGE + " (" + geneId + ")"); - } else { - SequenceTargetingReagentGeneAssociation strGeneAssociation = new SequenceTargetingReagentGeneAssociation(); - strGeneAssociation.setSequenceTargetingReagentAssociationSubject(sqtr); - strGeneAssociation.setRelation(relation); - strGeneAssociation.setSequenceTargetingReagentGeneAssociationObject(gene); - - strGeneAssociations.add(strGeneAssociation); - } - - } - if (sqtrResponse.hasErrors()) { - throw new ObjectValidationException(dto, sqtrResponse.errorMessagesString()); - } - - return strGeneAssociations; - } } From dcb3aac1856154c0d40b67a84705a861784956db Mon Sep 17 00:00:00 2001 From: Adam Gibson Date: Tue, 9 Jul 2024 11:54:29 -0500 Subject: [PATCH 3/5] SCRUM-4185 update executor to use sqtr gene association service --- .../SequenceTargetingReagentExecutor.java | 44 +++++++++++++------ ...argetingReagentGeneAssociationService.java | 34 +++++++------- ...ReagentGeneAssociationFmsDTOValidator.java | 34 +++++++------- ...quenceTargetingReagentFmsDTOValidator.java | 6 --- 4 files changed, 63 insertions(+), 55 deletions(-) diff --git a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java index 708b12cfe..3c7b0b3d8 100644 --- a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java +++ b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java @@ -2,7 +2,9 @@ import java.io.FileInputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.zip.GZIPInputStream; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; @@ -28,8 +30,10 @@ @ApplicationScoped public class SequenceTargetingReagentExecutor extends LoadFileExecutor { - @Inject SequenceTargetingReagentService sqtrService; - @Inject SequenceTargetingReagentGeneAssociationService sqtrGeneAssociationService; + @Inject + SequenceTargetingReagentService sqtrService; + @Inject + SequenceTargetingReagentGeneAssociationService sqtrGeneAssociationService; public void execLoad(BulkLoadFile bulkLoadFile) { @@ -53,20 +57,20 @@ public void execLoad(BulkLoadFile bulkLoadFile) { BackendBulkDataProvider dataProvider = BackendBulkDataProvider.valueOf(fms.getFmsDataSubType()); - List sqtrIdsLoaded = new ArrayList<>(); - List sqtrIdsBefore = sqtrService.getIdsByDataProvider(dataProvider.name()); - List sqtrGeneAssociationIdsLoaded = new ArrayList<>(); - List sqtrGeneAssociationIdsBefore = sqtrService.getIdsByDataProvider(dataProvider.name()); + Map> idsAdded = new HashMap>(); + idsAdded.put("SQTR", new ArrayList()); + idsAdded.put("SQTRGeneAssociation", new ArrayList()); + Map> previousIds = getPreviouslyLoadedIds(dataProvider); bulkLoadFileDAO.merge(bulkLoadFile); - BulkLoadFileHistory history = new BulkLoadFileHistory(sqtrIngestFmsDTO.getData().size()); + BulkLoadFileHistory history = new BulkLoadFileHistory(sqtrIngestFmsDTO.getData().size() * 2); - runLoad(history, dataProvider, sqtrIngestFmsDTO.getData(), sqtrIdsLoaded, sqtrGeneAssociationIdsLoaded); + runLoad(history, dataProvider, sqtrIngestFmsDTO.getData(), idsAdded.get("SQTR"), idsAdded.get("SQTRGeneAssociation")); - runCleanup(sqtrService, history, dataProvider.name(), sqtrIdsBefore, sqtrIdsLoaded, "SQTR", bulkLoadFile.getMd5Sum()); - runCleanup(sqtrService, history, dataProvider.name(), sqtrGeneAssociationIdsBefore, sqtrGeneAssociationIdsLoaded, "SQTR Gene Associations", bulkLoadFile.getMd5Sum()); + runCleanup(sqtrService, history, dataProvider.name(), previousIds.get("SQTR"), idsAdded.get("SQTR"), "SQTR", bulkLoadFile.getMd5Sum()); + runCleanup(sqtrService, history, dataProvider.name(), previousIds.get("SQTRGeneAssociation"), idsAdded.get("SQTRGeneAssociation"), "SQTR Gene Associations", bulkLoadFile.getMd5Sum()); history.finishLoad(); @@ -77,11 +81,20 @@ public void execLoad(BulkLoadFile bulkLoadFile) { } } + private Map> getPreviouslyLoadedIds(BackendBulkDataProvider dataProvider) { + Map> previousIds = new HashMap<>(); + + previousIds.put("SQTR", sqtrService.getIdsByDataProvider(dataProvider.name())); + previousIds.put("SQTRGeneAssociation", sqtrGeneAssociationService.getIdsByDataProvider(dataProvider.name())); + + return previousIds; + } + public APIResponse runLoadApi(String dataProviderName, List sqtrDTOs) { List sqtrIdsLoaded = new ArrayList<>(); List sqtrGeneAssociationIdsLoaded = new ArrayList<>(); - BulkLoadFileHistory history = new BulkLoadFileHistory(sqtrDTOs.size()); + BulkLoadFileHistory history = new BulkLoadFileHistory(sqtrDTOs.size() * 2); BackendBulkDataProvider dataProvider = BackendBulkDataProvider.valueOf(dataProviderName); runLoad(history, dataProvider, sqtrDTOs, sqtrIdsLoaded, sqtrGeneAssociationIdsLoaded); history.finishLoad(); @@ -101,7 +114,8 @@ private void runLoad(BulkLoadFileHistory history, BackendBulkDataProvider dataPr } - private void loadSequenceTargetingReagents(BulkLoadFileHistory history, List sqtrs, List idsLoaded, BackendBulkDataProvider dataProvider, ProcessDisplayHelper ph) { + private void loadSequenceTargetingReagents(BulkLoadFileHistory history, List sqtrs, + List idsLoaded, BackendBulkDataProvider dataProvider, ProcessDisplayHelper ph) { for (SequenceTargetingReagentFmsDTO dto : sqtrs) { try { SequenceTargetingReagent dbObject = sqtrService.upsert(dto, dataProvider); @@ -121,11 +135,13 @@ private void loadSequenceTargetingReagents(BulkLoadFileHistory history, List sqtrs, List idsLoaded, BackendBulkDataProvider dataProvider, ProcessDisplayHelper ph) { + private void loadSequenceTargetingReagentGeneAssociations(BulkLoadFileHistory history, + List sqtrs, List idsLoaded, BackendBulkDataProvider dataProvider, + ProcessDisplayHelper ph) { for (SequenceTargetingReagentFmsDTO dto : sqtrs) { try { - List associationIds = sqtrGeneAssociationService.addGeneAssociations(dto, dataProvider); + List associationIds = sqtrGeneAssociationService.loadGeneAssociations(dto, dataProvider); history.incrementCompleted(); if (idsLoaded != null) { idsLoaded.addAll(associationIds); diff --git a/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java b/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java index 8a920fa87..4c00833a2 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java +++ b/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java @@ -1,9 +1,13 @@ package org.alliancegenome.curation_api.services.associations; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; +import org.alliancegenome.curation_api.constants.EntityFieldConstants; import org.alliancegenome.curation_api.dao.associations.SequenceTargetingReagentGeneAssociationDAO; import org.alliancegenome.curation_api.dao.associations.alleleAssociations.AlleleGeneAssociationDAO; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; @@ -24,31 +28,15 @@ import jakarta.transaction.Transactional; @RequestScoped -public class SequenceTargetingReagentGeneAssociationService extends - BaseAssociationDTOCrudService { +public class SequenceTargetingReagentGeneAssociationService { + @Inject SequenceTargetingReagentGeneAssociationDAO sequenceTargetingReagentGeneAssociationDAO; @Inject SequenceTargetingReagentGeneAssociationFmsDTOValidator sequenceTargetingReagentGeneAssociationFmsDTOValidator; - @Override - @PostConstruct - protected void init() { - setSQLDao(sequenceTargetingReagentGeneAssociationDAO); - } - @Transactional - public SequenceTargetingReagentGeneAssociation upsert(SequenceTargetingReagentFmsDTO dto, - BackendBulkDataProvider dataProvider) throws ObjectUpdateException { - // TODO: fix this placeholder code - SequenceTargetingReagentGeneAssociation sequenceTargetingReagentGeneAssociation = new SequenceTargetingReagentGeneAssociation(); - return sequenceTargetingReagentGeneAssociation; - } - - // TODO: rename? - @Transactional - public List addGeneAssociations(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider dataProvider) - throws ObjectUpdateException { + public List loadGeneAssociations(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider dataProvider) throws ObjectUpdateException { List associations = sequenceTargetingReagentGeneAssociationFmsDTOValidator .validateSQTRGeneAssociationFmsDTO(dto, dataProvider); @@ -102,4 +90,12 @@ private void addAssociationToGene(SequenceTargetingReagentGeneAssociation associ } } + + public List getIdsByDataProvider(String dataProvider) { + Map params = new HashMap<>(); + params.put(EntityFieldConstants.DATA_PROVIDER, dataProvider); + List ids = sequenceTargetingReagentGeneAssociationDAO.findIdsByParams(params); + ids.removeIf(Objects::isNull); + return ids; + } } diff --git a/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java b/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java index 74ff2f979..1997b6f97 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java +++ b/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java @@ -31,8 +31,7 @@ public List validateSQTRGeneAssociation ObjectResponse sqtrResponse = new ObjectResponse<>(); SequenceTargetingReagent sqtr; - SearchResponse sqtrSearchResponse = sqtrDAO.findByField("modEntityId", - dto.getPrimaryId()); + SearchResponse sqtrSearchResponse = sqtrDAO.findByField("modEntityId", dto.getPrimaryId()); if (sqtrSearchResponse == null || sqtrSearchResponse.getSingleResult() == null) { sqtrResponse.addErrorMessage("modEntityId", @@ -51,22 +50,25 @@ public List validateSQTRGeneAssociation relation = relationSearchResponse.getSingleResult(); } - for (String geneId : dto.getTargetGeneIds()) { - Gene gene = geneService.findByIdentifierString(geneId); - - if (gene == null) { - sqtrResponse.addErrorMessage("targetGeneIds", - ValidationConstants.INVALID_MESSAGE + " (" + geneId + ")"); - } else { - SequenceTargetingReagentGeneAssociation strGeneAssociation = new SequenceTargetingReagentGeneAssociation(); - strGeneAssociation.setSequenceTargetingReagentAssociationSubject(sqtr); - strGeneAssociation.setRelation(relation); - strGeneAssociation.setSequenceTargetingReagentGeneAssociationObject(gene); - - strGeneAssociations.add(strGeneAssociation); + if(dto.getTargetGeneIds() != null){ + for (String geneId : dto.getTargetGeneIds()) { + Gene gene = geneService.findByIdentifierString(geneId); + + if (gene == null) { + sqtrResponse.addErrorMessage("targetGeneIds", + ValidationConstants.INVALID_MESSAGE + " (" + geneId + ")"); + } else { + SequenceTargetingReagentGeneAssociation strGeneAssociation = new SequenceTargetingReagentGeneAssociation(); + strGeneAssociation.setSequenceTargetingReagentAssociationSubject(sqtr); + strGeneAssociation.setRelation(relation); + strGeneAssociation.setSequenceTargetingReagentGeneAssociationObject(gene); + + strGeneAssociations.add(strGeneAssociation); + } + } - } + if (sqtrResponse.hasErrors()) { throw new ObjectValidationException(dto, sqtrResponse.errorMessagesString()); } diff --git a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java index 37684191e..55cdec3ba 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java +++ b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/fms/SequenceTargetingReagentFmsDTOValidator.java @@ -1,16 +1,10 @@ package org.alliancegenome.curation_api.services.validation.dto.fms; -import java.util.ArrayList; -import java.util.List; - import org.alliancegenome.curation_api.constants.ValidationConstants; import org.alliancegenome.curation_api.dao.SequenceTargetingReagentDAO; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; import org.alliancegenome.curation_api.exceptions.ObjectValidationException; -import org.alliancegenome.curation_api.model.entities.Gene; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; -import org.alliancegenome.curation_api.model.entities.VocabularyTerm; -import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; import org.alliancegenome.curation_api.model.entities.ontology.NCBITaxonTerm; import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; import org.alliancegenome.curation_api.response.ObjectResponse; From 644e2cb28e290835d1ab153d1f771801a457d387 Mon Sep 17 00:00:00 2001 From: Adam Gibson Date: Tue, 9 Jul 2024 11:55:25 -0500 Subject: [PATCH 4/5] SCRUM-4185 update tests --- ...ceTargetingReagentBulkUploadFmsITCase.java | 41 +++++++++++++++---- .../curation_api/base/BaseITCase.java | 10 +++-- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java b/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java index b3bade7ef..8939c04a8 100644 --- a/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java +++ b/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java @@ -45,7 +45,7 @@ public void init() { @Order(1) public void sqtrBulkUploadCheckFields() throws Exception { - checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "AF_01_all_fields.json"); + checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "AF_01_all_fields.json", 2); RestAssured.given(). when(). @@ -67,16 +67,41 @@ public void sqtrBulkUploadCheckFields() throws Exception { @Order(2) public void sqtrBulkUploadMissingRequiredFields() throws Exception { - checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "MR_01_no_name.json"); - checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "MR_02_no_taxon.json"); + checkFailedBulkLoad( + sqtrBulkPostEndpoint, + sqtrTestFilePath + "MR_01_no_name.json", + 2, + 1, + 1 + ); + checkFailedBulkLoad( + sqtrBulkPostEndpoint, + sqtrTestFilePath + "MR_02_no_taxon.json", + 2, + 1, + 1 + ); } @Test @Order(3) public void sqtrBulkUploadEmptyRequiredFields() throws Exception { - checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "ER_01_empty_name.json"); - checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "ER_02_empty_taxon.json"); + checkFailedBulkLoad( + sqtrBulkPostEndpoint, + sqtrTestFilePath + "ER_01_empty_name.json", + 2, + 1, + 1 + ); + + checkFailedBulkLoad( + sqtrBulkPostEndpoint, + sqtrTestFilePath + "ER_02_empty_taxon.json", + 2, + 1, + 1 + ); } @@ -84,7 +109,7 @@ public void sqtrBulkUploadEmptyRequiredFields() throws Exception { @Order(4) public void sqtrBulkUploadUpdateMissingNonRequiredFields() throws Exception { - checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "UM_01_update_no_non_required_fields.json"); + checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "UM_01_update_no_non_required_fields.json", 2); RestAssured.given(). when(). @@ -104,7 +129,7 @@ public void sqtrBulkUploadUpdateMissingNonRequiredFields() throws Exception { @Order(5) public void sqtrBulkUploadUpdateEmptyNonRequiredFields() throws Exception { - checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "AF_01_all_fields.json"); + checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "AF_01_all_fields.json", 2); RestAssured.given(). when(). @@ -122,7 +147,7 @@ public void sqtrBulkUploadUpdateEmptyNonRequiredFields() throws Exception { body("results[0]" , hasKey("synonyms")). body("results[0]" , hasKey("secondaryIdentifiers")); - checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "UE_01_update_empty_non_required_fields.json"); + checkSuccessfulBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "UE_01_update_empty_non_required_fields.json", 2); RestAssured.given(). when(). diff --git a/src/test/java/org/alliancegenome/curation_api/base/BaseITCase.java b/src/test/java/org/alliancegenome/curation_api/base/BaseITCase.java index 1ef4c4cb1..42c239537 100644 --- a/src/test/java/org/alliancegenome/curation_api/base/BaseITCase.java +++ b/src/test/java/org/alliancegenome/curation_api/base/BaseITCase.java @@ -97,6 +97,10 @@ public VocabularyTerm addVocabularyTermToSet(String setName, String termName, Vo } public void checkFailedBulkLoad(String endpoint, String filePath) throws Exception { + checkFailedBulkLoad(endpoint, filePath, 1, 1, 0); + } + + public void checkFailedBulkLoad(String endpoint, String filePath, int expectedTotalRecords, int expectedFailedRecords, int expectedCompletedRecords) throws Exception { String content = Files.readString(Path.of(filePath)); RestAssured.given(). @@ -106,9 +110,9 @@ public void checkFailedBulkLoad(String endpoint, String filePath) throws Excepti post(endpoint). then(). statusCode(200). - body("history.totalRecords", is(1)). - body("history.failedRecords", is(1)). - body("history.completedRecords", is(0)); + body("history.totalRecords", is(expectedTotalRecords)). + body("history.failedRecords", is(expectedFailedRecords)). + body("history.completedRecords", is(expectedCompletedRecords)); } public void checkSuccessfulBulkLoad(String endpoint, String filePath) throws Exception { From 2df4c73a4f2dd088215e8c4bbea6d7bf4ab9ed15 Mon Sep 17 00:00:00 2001 From: Adam Gibson Date: Tue, 9 Jul 2024 12:04:56 -0500 Subject: [PATCH 5/5] SCRUM-4185 update formatting --- .../SequenceTargetingReagentExecutor.java | 1 - .../SequenceTargetingReagentService.java | 4 - ...argetingReagentGeneAssociationService.java | 6 -- ...ReagentGeneAssociationFmsDTOValidator.java | 98 ++++++++++--------- ...ceTargetingReagentBulkUploadFmsITCase.java | 34 +------ 5 files changed, 56 insertions(+), 87 deletions(-) diff --git a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java index 3c7b0b3d8..9c96eec15 100644 --- a/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java +++ b/src/main/java/org/alliancegenome/curation_api/jobs/executors/SequenceTargetingReagentExecutor.java @@ -12,7 +12,6 @@ import org.alliancegenome.curation_api.exceptions.ObjectUpdateException.ObjectUpdateExceptionData; import org.alliancegenome.curation_api.interfaces.AGRCurationSchemaVersion; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; -import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkFMSLoad; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkLoadFile; import org.alliancegenome.curation_api.model.entities.bulkloads.BulkLoadFileHistory; diff --git a/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java b/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java index a11689115..14d3fa63b 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java +++ b/src/main/java/org/alliancegenome/curation_api/services/SequenceTargetingReagentService.java @@ -1,20 +1,16 @@ package org.alliancegenome.curation_api.services; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import org.alliancegenome.curation_api.constants.EntityFieldConstants; import org.alliancegenome.curation_api.dao.SequenceTargetingReagentDAO; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; import org.alliancegenome.curation_api.exceptions.ObjectUpdateException; import org.alliancegenome.curation_api.interfaces.crud.BaseUpsertServiceInterface; -import org.alliancegenome.curation_api.model.entities.Gene; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; -import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; import org.alliancegenome.curation_api.services.base.BaseEntityCrudService; import org.alliancegenome.curation_api.services.validation.dto.fms.SequenceTargetingReagentFmsDTOValidator; diff --git a/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java b/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java index 4c00833a2..bf19881cf 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java +++ b/src/main/java/org/alliancegenome/curation_api/services/associations/SequenceTargetingReagentGeneAssociationService.java @@ -9,20 +9,14 @@ import org.alliancegenome.curation_api.constants.EntityFieldConstants; import org.alliancegenome.curation_api.dao.associations.SequenceTargetingReagentGeneAssociationDAO; -import org.alliancegenome.curation_api.dao.associations.alleleAssociations.AlleleGeneAssociationDAO; import org.alliancegenome.curation_api.enums.BackendBulkDataProvider; import org.alliancegenome.curation_api.exceptions.ObjectUpdateException; -import org.alliancegenome.curation_api.interfaces.crud.BaseUpsertServiceInterface; import org.alliancegenome.curation_api.model.entities.Gene; import org.alliancegenome.curation_api.model.entities.SequenceTargetingReagent; -import org.alliancegenome.curation_api.model.entities.associations.alleleAssociations.AlleleGeneAssociation; import org.alliancegenome.curation_api.model.entities.associations.sequenceTargetingReagentAssociations.SequenceTargetingReagentGeneAssociation; -import org.alliancegenome.curation_api.model.ingest.dto.associations.alleleAssociations.AlleleGeneAssociationDTO; import org.alliancegenome.curation_api.model.ingest.dto.fms.SequenceTargetingReagentFmsDTO; -import org.alliancegenome.curation_api.services.base.BaseAssociationDTOCrudService; import org.alliancegenome.curation_api.services.validation.associations.SequenceTargetingReagentGeneAssociationFmsDTOValidator; -import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; diff --git a/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java b/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java index 1997b6f97..ca24216f8 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java +++ b/src/main/java/org/alliancegenome/curation_api/services/validation/associations/SequenceTargetingReagentGeneAssociationFmsDTOValidator.java @@ -22,57 +22,61 @@ @RequestScoped public class SequenceTargetingReagentGeneAssociationFmsDTOValidator { - @Inject SequenceTargetingReagentDAO sqtrDAO; - @Inject VocabularyTermService vocabularyTermService; - @Inject GeneService geneService; + @Inject + SequenceTargetingReagentDAO sqtrDAO; + @Inject + VocabularyTermService vocabularyTermService; + @Inject + GeneService geneService; - public List validateSQTRGeneAssociationFmsDTO( SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider beDataProvider) throws ObjectValidationException { - List strGeneAssociations = new ArrayList<>(); - ObjectResponse sqtrResponse = new ObjectResponse<>(); + public List validateSQTRGeneAssociationFmsDTO(SequenceTargetingReagentFmsDTO dto, BackendBulkDataProvider beDataProvider) throws ObjectValidationException { + List strGeneAssociations = new ArrayList<>(); + ObjectResponse sqtrResponse = new ObjectResponse<>(); - SequenceTargetingReagent sqtr; - SearchResponse sqtrSearchResponse = sqtrDAO.findByField("modEntityId", dto.getPrimaryId()); + SequenceTargetingReagent sqtr; + SearchResponse sqtrSearchResponse = sqtrDAO.findByField("modEntityId", + dto.getPrimaryId()); - if (sqtrSearchResponse == null || sqtrSearchResponse.getSingleResult() == null) { - sqtrResponse.addErrorMessage("modEntityId", - ValidationConstants.INVALID_MESSAGE + " (" + dto.getPrimaryId() + ")"); - sqtr = new SequenceTargetingReagent(); - } else { - sqtr = sqtrSearchResponse.getSingleResult(); - } + if (sqtrSearchResponse == null || sqtrSearchResponse.getSingleResult() == null) { + sqtrResponse.addErrorMessage("modEntityId", + ValidationConstants.INVALID_MESSAGE + " (" + dto.getPrimaryId() + ")"); + sqtr = new SequenceTargetingReagent(); + } else { + sqtr = sqtrSearchResponse.getSingleResult(); + } - VocabularyTerm relation; - SearchResponse relationSearchResponse = vocabularyTermService.findByField("name", "targets"); - if (relationSearchResponse == null || relationSearchResponse.getSingleResult() == null) { - sqtrResponse.addErrorMessage("relation", ValidationConstants.INVALID_MESSAGE + " (" + "targets" + ")"); - relation = new VocabularyTerm(); - } else { - relation = relationSearchResponse.getSingleResult(); - } + VocabularyTerm relation; + SearchResponse relationSearchResponse = vocabularyTermService.findByField("name", "targets"); + if (relationSearchResponse == null || relationSearchResponse.getSingleResult() == null) { + sqtrResponse.addErrorMessage("relation", ValidationConstants.INVALID_MESSAGE + " (" + "targets" + ")"); + relation = new VocabularyTerm(); + } else { + relation = relationSearchResponse.getSingleResult(); + } - if(dto.getTargetGeneIds() != null){ - for (String geneId : dto.getTargetGeneIds()) { - Gene gene = geneService.findByIdentifierString(geneId); - - if (gene == null) { - sqtrResponse.addErrorMessage("targetGeneIds", - ValidationConstants.INVALID_MESSAGE + " (" + geneId + ")"); - } else { - SequenceTargetingReagentGeneAssociation strGeneAssociation = new SequenceTargetingReagentGeneAssociation(); - strGeneAssociation.setSequenceTargetingReagentAssociationSubject(sqtr); - strGeneAssociation.setRelation(relation); - strGeneAssociation.setSequenceTargetingReagentGeneAssociationObject(gene); - - strGeneAssociations.add(strGeneAssociation); - } - - } - } - - if (sqtrResponse.hasErrors()) { - throw new ObjectValidationException(dto, sqtrResponse.errorMessagesString()); - } + if (dto.getTargetGeneIds() != null) { + for (String geneId : dto.getTargetGeneIds()) { + Gene gene = geneService.findByIdentifierString(geneId); - return strGeneAssociations; - } + if (gene == null) { + sqtrResponse.addErrorMessage("targetGeneIds", + ValidationConstants.INVALID_MESSAGE + " (" + geneId + ")"); + } else { + SequenceTargetingReagentGeneAssociation strGeneAssociation = new SequenceTargetingReagentGeneAssociation(); + strGeneAssociation.setSequenceTargetingReagentAssociationSubject(sqtr); + strGeneAssociation.setRelation(relation); + strGeneAssociation.setSequenceTargetingReagentGeneAssociationObject(gene); + + strGeneAssociations.add(strGeneAssociation); + } + + } + } + + if (sqtrResponse.hasErrors()) { + throw new ObjectValidationException(dto, sqtrResponse.errorMessagesString()); + } + + return strGeneAssociations; + } } diff --git a/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java b/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java index 8939c04a8..03a2df0a4 100644 --- a/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java +++ b/src/test/java/org/alliancegenome/curation_api/SequenceTargetingReagentBulkUploadFmsITCase.java @@ -67,41 +67,17 @@ public void sqtrBulkUploadCheckFields() throws Exception { @Order(2) public void sqtrBulkUploadMissingRequiredFields() throws Exception { - checkFailedBulkLoad( - sqtrBulkPostEndpoint, - sqtrTestFilePath + "MR_01_no_name.json", - 2, - 1, - 1 - ); - checkFailedBulkLoad( - sqtrBulkPostEndpoint, - sqtrTestFilePath + "MR_02_no_taxon.json", - 2, - 1, - 1 - ); + checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "MR_01_no_name.json", 2, 1, 1); + checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "MR_02_no_taxon.json", 2, 1, 1); } @Test @Order(3) public void sqtrBulkUploadEmptyRequiredFields() throws Exception { - checkFailedBulkLoad( - sqtrBulkPostEndpoint, - sqtrTestFilePath + "ER_01_empty_name.json", - 2, - 1, - 1 - ); - - checkFailedBulkLoad( - sqtrBulkPostEndpoint, - sqtrTestFilePath + "ER_02_empty_taxon.json", - 2, - 1, - 1 - ); + checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "ER_01_empty_name.json", 2, 1, 1); + + checkFailedBulkLoad(sqtrBulkPostEndpoint, sqtrTestFilePath + "ER_02_empty_taxon.json", 2, 1, 1); }