diff --git a/src/main/java/org/alliancegenome/curation_api/jobs/executors/BulkLoadJobExecutor.java b/src/main/java/org/alliancegenome/curation_api/jobs/executors/BulkLoadJobExecutor.java index cba074a37..82cb498f3 100644 --- a/src/main/java/org/alliancegenome/curation_api/jobs/executors/BulkLoadJobExecutor.java +++ b/src/main/java/org/alliancegenome/curation_api/jobs/executors/BulkLoadJobExecutor.java @@ -107,8 +107,6 @@ public void process(BulkLoadFileHistory bulkLoadFileHistory, Boolean cleanUp) th if (loadType == AGM_ASSOCIATION || loadType == FULL_INGEST) { agmStrAssociationExecutor.execLoad(bulkLoadFileHistory, cleanUp); agmAlleleAssociationExecutor.execLoad(bulkLoadFileHistory, cleanUp); - } - if (loadType == AGM_AGM_ASSOCIATION || loadType == FULL_INGEST) { agmAgmAssociationExecutor.execLoad(bulkLoadFileHistory, cleanUp); } diff --git a/src/main/java/org/alliancegenome/curation_api/model/entities/AffectedGenomicModel.java b/src/main/java/org/alliancegenome/curation_api/model/entities/AffectedGenomicModel.java index d121afc95..484b8c7d3 100644 --- a/src/main/java/org/alliancegenome/curation_api/model/entities/AffectedGenomicModel.java +++ b/src/main/java/org/alliancegenome/curation_api/model/entities/AffectedGenomicModel.java @@ -27,7 +27,7 @@ @Entity @Data @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = true) -@ToString(exclude = {"agmDiseaseAnnotations", "agmPhenotypeAnnotations", "constructGenomicEntityAssociations", "agmSecondaryIds", "agmSequenceTargetingReagentAssociations", "components"}, callSuper = true) +@ToString(exclude = {"agmDiseaseAnnotations", "agmPhenotypeAnnotations", "constructGenomicEntityAssociations", "agmSecondaryIds", "agmSequenceTargetingReagentAssociations", "components", "parentalPopulations"}, callSuper = true) @Schema(name = "AffectedGenomicModel", description = "POJO that represents the AGM") @AGRCurationSchemaVersion(min = "1.5.0", max = LinkMLSchemaConstants.LATEST_RELEASE, dependencies = {GenomicEntity.class}, partial = true) public class AffectedGenomicModel extends GenomicEntity { @@ -98,27 +98,15 @@ public class AffectedGenomicModel extends GenomicEntity { private List components; @IndexedEmbedded(includePaths = { - "agmAssociationSubject.name", - "agmAssociationSubject.name_keyword", - "agmAssociationSubject.synonyms", - "agmAssociationSubject.synonyms_keyword", - "agmAssociationSubject.secondaryIdentifiers", - "agmAssociationSubject.secondaryIdentifiers_keyword" + "agmAgmAssociationObject.name", + "agmAgmAssociationObject.name_keyword", + "agmAgmAssociationObject.synonyms", + "agmAgmAssociationObject.synonyms_keyword", + "agmAgmAssociationObject.secondaryIdentifiers", + "agmAgmAssociationObject.secondaryIdentifiers_keyword" }) @OneToMany(mappedBy = "agmAssociationSubject", cascade = CascadeType.ALL, orphanRemoval = true) @JsonView({View.FieldsAndLists.class, View.AffectedGenomicModelDetailView.class}) - private List agmAgmAssociations; - - @IndexedEmbedded(includePaths = { - "agmAssociationObject.name", - "agmAssociationObject.name_keyword", - "agmAssociationObject.synonyms", - "agmAssociationObject.synonyms_keyword", - "agmAssociationObject.secondaryIdentifiers", - "agmAssociationObject.secondaryIdentifiers_keyword" - }) - @OneToMany(mappedBy = "agmAssociationObject", cascade = CascadeType.ALL, orphanRemoval = true) - @JsonView({View.FieldsAndLists.class, View.AffectedGenomicModelDetailView.class}) - private List agmAgmObjectAssociations; + private List parentalPopulations; } diff --git a/src/main/java/org/alliancegenome/curation_api/model/entities/associations/agmAssociations/AgmAgmAssociation.java b/src/main/java/org/alliancegenome/curation_api/model/entities/associations/agmAssociations/AgmAgmAssociation.java index 4b1faf1b0..15fba8303 100644 --- a/src/main/java/org/alliancegenome/curation_api/model/entities/associations/agmAssociations/AgmAgmAssociation.java +++ b/src/main/java/org/alliancegenome/curation_api/model/entities/associations/agmAssociations/AgmAgmAssociation.java @@ -43,10 +43,10 @@ public class AgmAgmAssociation extends Association { @IndexedEmbedded(includePaths = { "curie", "name", "curie_keyword", "name_keyword", - "primaryExternalId", "perimaryExternalId_keyword", "modInternalId", "modInternalId_keyword"}) + "primaryExternalId", "primaryExternalId_keyword", "modInternalId", "modInternalId_keyword"}) @ManyToOne @JsonView({View.FieldsOnly.class}) - @JsonIgnoreProperties({"agmAgmAssociations", "agmAgmObjectAssociations", "agmSequenceTargetingReagentAssociations"}) + @JsonIgnoreProperties({"parentalPopulations", "agmSequenceTargetingReagentAssociations"}) @Fetch(FetchMode.JOIN) private AffectedGenomicModel agmAssociationSubject; @@ -56,10 +56,10 @@ public class AgmAgmAssociation extends Association { @JsonView({View.FieldsOnly.class}) private VocabularyTerm relation; - @IndexedEmbedded(includePaths = {"name", "synonyms", "secondaryIdentifiers"}) + @IndexedEmbedded(includePaths = {"name", "synonyms"}) @IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW) @ManyToOne @JsonView({View.FieldsOnly.class}) - @JsonIgnoreProperties({"agmAgmAssociations", "agmAgmObjectAssociations", "agmSequenceTargetingReagentAssociations"}) - private AffectedGenomicModel agmAssociationObject; + @JsonIgnoreProperties({"parentalPopulations", "agmSequenceTargetingReagentAssociations"}) + private AffectedGenomicModel agmAgmAssociationObject; } diff --git a/src/main/java/org/alliancegenome/curation_api/services/associations/agmAssociations/AgmAgmAssociationService.java b/src/main/java/org/alliancegenome/curation_api/services/associations/agmAssociations/AgmAgmAssociationService.java index 208036e67..2b517f17c 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/associations/agmAssociations/AgmAgmAssociationService.java +++ b/src/main/java/org/alliancegenome/curation_api/services/associations/agmAssociations/AgmAgmAssociationService.java @@ -112,7 +112,7 @@ public ObjectResponse getAssociation(Long agmId, String relat Map params = new HashMap<>(); params.put("agmAssociationSubject.id", agmId); params.put("relation.name", relationName); - params.put("agmAssociationObject.id", strId); + params.put("agmAgmAssociationObject.id", strId); SearchResponse resp = agmAgmAssociationDAO.findByParams(params); if (resp != null && resp.getSingleResult() != null) { @@ -127,10 +127,10 @@ public ObjectResponse getAssociation(Long agmId, String relat private void addAssociationToAgm(AgmAgmAssociation association) { AffectedGenomicModel agm = association.getAgmAssociationSubject(); - List currentAssociations = agm.getAgmAgmAssociations(); + List currentAssociations = agm.getParentalPopulations(); if (currentAssociations == null) { currentAssociations = new ArrayList<>(); - agm.setAgmAgmAssociations(currentAssociations); + agm.setParentalPopulations(currentAssociations); } List currentAssociationIds = new ArrayList<>(); @@ -144,11 +144,11 @@ private void addAssociationToAgm(AgmAgmAssociation association) { } private void addAssociationToStr(AgmAgmAssociation association) { - AffectedGenomicModel str = association.getAgmAssociationObject(); - List currentAssociations = str.getAgmAgmAssociations(); + AffectedGenomicModel str = association.getAgmAgmAssociationObject(); + List currentAssociations = str.getParentalPopulations(); if (currentAssociations == null) { currentAssociations = new ArrayList<>(); - str.setAgmAgmAssociations(currentAssociations); + str.setParentalPopulations(currentAssociations); } List currentAssociationIds = new ArrayList<>(); diff --git a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/associations/agmAssociations/AgmAgmAssociationDTOValidator.java b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/associations/agmAssociations/AgmAgmAssociationDTOValidator.java index 0f5bb81f3..d2506e47c 100644 --- a/src/main/java/org/alliancegenome/curation_api/services/validation/dto/associations/agmAssociations/AgmAgmAssociationDTOValidator.java +++ b/src/main/java/org/alliancegenome/curation_api/services/validation/dto/associations/agmAssociations/AgmAgmAssociationDTOValidator.java @@ -57,7 +57,7 @@ public AgmAgmAssociation validateAgmAgmAssociationDTO(AgmAgmAssociationDTO dto, params.put("agmAssociationSubject.id", subjectIds.get(0)); params.put("relation.name", dto.getRelationName()); - params.put("agmAssociationObject.id", objectIds.get(0)); + params.put("agmAgmAssociationObject.id", objectIds.get(0)); SearchResponse searchResponse = agmAgmAssociationDAO.findByParams(params); if (searchResponse != null && searchResponse.getResults().size() == 1) { @@ -84,7 +84,7 @@ public AgmAgmAssociation validateAgmAgmAssociationDTO(AgmAgmAssociationDTO dto, } } - if (association.getAgmAssociationObject() == null && !StringUtils.isBlank(dto.getAgmObjectIdentifier())) { + if (association.getAgmAgmAssociationObject() == null && !StringUtils.isBlank(dto.getAgmObjectIdentifier())) { AffectedGenomicModel object = agmService.findByIdentifierString(dto.getAgmObjectIdentifier()); if (object == null) { @@ -92,7 +92,7 @@ public AgmAgmAssociation validateAgmAgmAssociationDTO(AgmAgmAssociationDTO dto, } else if (beDataProvider != null && !object.getDataProvider().getAbbreviation().equals(beDataProvider.sourceOrganization)) { response.addErrorMessage("agm_object_identifier", ValidationConstants.INVALID_MESSAGE + " for " + beDataProvider.name() + " load (" + dto.getAgmObjectIdentifier() + ")"); } else { - association.setAgmAssociationObject(object); + association.setAgmAgmAssociationObject(object); } } association = validateAuditedObjectDTO(association, dto); diff --git a/src/main/resources/db/migration/v0.38.0.30__agm_agm_association_loads_2.sql b/src/main/resources/db/migration/v0.38.0.30__agm_agm_association_loads_2.sql new file mode 100644 index 000000000..5b0d7f2d3 --- /dev/null +++ b/src/main/resources/db/migration/v0.38.0.30__agm_agm_association_loads_2.sql @@ -0,0 +1,30 @@ +ALTER TABLE agmagmassociation + add column + agmAgmAssociationObject_id bigint +; + +alter table agmagmassociation + DROP agmassociationobject_id +; + +delete +from bulkscheduledload +where id in (SELECT id + FROM bulkload + WHERE backendbulkloadtype = 'AGM_AGM_ASSOCIATION'); + +delete +from bulkmanualload +where id in (SELECT id + FROM bulkload + WHERE backendbulkloadtype = 'AGM_AGM_ASSOCIATION'); + +delete +from bulkload +WHERE group_id in (select id from bulkloadgroup where name = 'Direct (LinkML) AGM AGM Association Loads'); + +delete +from bulkloadgroup +where name = 'Direct (LinkML) AGM AGM Association Loads'; + + diff --git a/src/main/resources/db/migration/v0.38.0.31__agm_agm_association_loads_2.sql b/src/main/resources/db/migration/v0.38.0.31__agm_agm_association_loads_2.sql new file mode 100644 index 000000000..ab0a25803 --- /dev/null +++ b/src/main/resources/db/migration/v0.38.0.31__agm_agm_association_loads_2.sql @@ -0,0 +1,2 @@ +CREATE INDEX agmagmassociation_agmassocobject_in ON public.agmagmassociation USING btree (agmAgmAssociationObject_id); +ALTER TABLE ONLY public.agmagmassociation ADD CONSTRAINT agmagmassociation_agmassociationobject_fk FOREIGN KEY (agmAgmAssociationObject_id) REFERENCES public.affectedgenomicmodel(id); diff --git a/src/main/resources/db/migration/v0.38.0.32__agm_agm_association_loads_3.sql b/src/main/resources/db/migration/v0.38.0.32__agm_agm_association_loads_3.sql new file mode 100644 index 000000000..752558edf --- /dev/null +++ b/src/main/resources/db/migration/v0.38.0.32__agm_agm_association_loads_3.sql @@ -0,0 +1,21 @@ +--alter TABLE agmagmassociation ADD COLUMN agmAgmAssociationObject_id bigint; +--alter TABLE agmagmassociation drop agmAssociationObject_id; + +CREATE INDEX AgmAgmAssociation_agmAssociationSubject_index ON public.agmagmassociation USING btree (agmassociationsubject_id); +CREATE INDEX AgmAgmAssociation_AgmAgmAssociationObject_index ON public.agmagmassociation USING btree (agmAgmAssociationObject_id); + +drop index agmagmassociation_agmassocobject_in; +drop index agmagmassociation_agmassocsubject_in; + +ALTER TABLE agmagmassociation DROP CONSTRAINT agmstrassociation_agmassocsubject_fk; +ALTER TABLE agmagmassociation DROP CONSTRAINT agmagmassociation_agmassociationobject_fk; +ALTER TABLE agmagmassociation DROP CONSTRAINT agmstrassociation_createdby_fk; +ALTER TABLE agmagmassociation DROP CONSTRAINT agmstrassociation_relation_fk; +ALTER TABLE agmagmassociation DROP CONSTRAINT agmstrassociation_updatedby_fk; + +ALTER TABLE agmagmassociation ADD CONSTRAINT agmagmassociation_agmagmassociationobject_id_fk FOREIGN KEY (agmAgmAssociationObject_id) REFERENCES affectedgenomicmodel(id); +ALTER TABLE agmagmassociation ADD CONSTRAINT agmagmassociation_agmassociationsubject_id_fk FOREIGN KEY (agmassociationsubject_id) REFERENCES affectedgenomicmodel(id); + +ALTER TABLE ONLY public.agmagmassociation ADD CONSTRAINT agmagmassociation_relation_fk FOREIGN KEY (relation_id) REFERENCES public.vocabularyterm(id); +ALTER TABLE ONLY public.agmagmassociation ADD CONSTRAINT agmagmassociation_updatedby_fk FOREIGN KEY (updatedby_id) REFERENCES public.person(id); +ALTER TABLE ONLY public.agmagmassociation ADD CONSTRAINT agmagmassociation_createdby_fk FOREIGN KEY (createdby_id) REFERENCES public.person(id); diff --git a/src/test/java/org/alliancegenome/curation_api/AgmAgmAssociationBulkUploadITCase.java b/src/test/java/org/alliancegenome/curation_api/AgmAgmAssociationBulkUploadITCase.java index 49eaead4a..6a90df2c2 100644 --- a/src/test/java/org/alliancegenome/curation_api/AgmAgmAssociationBulkUploadITCase.java +++ b/src/test/java/org/alliancegenome/curation_api/AgmAgmAssociationBulkUploadITCase.java @@ -55,14 +55,14 @@ public void agmAgmAssociationBulkUploadCheckFields() throws Exception { loadRequiredEntities(); checkSuccessfulBulkLoad(agmAgmAssociationBulkPostEndpoint, agmAgmAssociationTestFilePath + "AF_01_all_fields.json"); - + + String s = agmAgmAssociationGetEndpoint + "?agmSubjectId=" + agmSubject.getId() + "&relationName=" + relationName + "&agmObjectId=" + agmObject.getId(); RestAssured.given(). when(). - get(agmAgmAssociationGetEndpoint + "?agmSubjectId=" + agmSubject.getId() + "&relationName=" + relationName + "&agmObjectId=" + agmObject.getId()). + get(s). then(). statusCode(200). body("entity.relation.name", is(relationName)). - body("entity.agmAssociationObject.primaryExternalId", is(agmObjectCurie)). body("entity.agmAssociationSubject.primaryExternalId", is(agmSubjectCurie)). body("entity.internal", is(false)). body("entity.obsolete", is(false)). @@ -76,25 +76,16 @@ public void agmAgmAssociationBulkUploadCheckFields() throws Exception { get(agmGetEndpoint + agmSubjectCurie). then(). statusCode(200). - body("entity.agmAgmAssociations", hasSize(1)). - body("entity.agmAgmAssociations[0].relation.name", is(relationName)). - body("entity.agmAgmAssociations[0].agmAssociationSubject.primaryExternalId", is(agmSubjectCurie)). - body("entity.agmAgmAssociations[0].agmAssociationSubject", not(hasKey("agmAssociationObject"))); + body("entity.parentalPopulations", hasSize(1)). + body("entity.parentalPopulations[0].relation.name", is(relationName)). + body("entity.parentalPopulations[0].agmAssociationSubject.primaryExternalId", is(agmSubjectCurie)). + body("entity.parentalPopulations[0].agmAssociationSubject", not(hasKey("agmAgmAssociationObject"))); - RestAssured.given(). - when(). - get(agmGetEndpoint + agmObjectCurie). - then(). - statusCode(200). - body("entity.agmAgmObjectAssociations", hasSize(1)). - body("entity.agmAgmObjectAssociations[0].relation.name", is(relationName)). - body("entity.agmAgmObjectAssociations[0].agmAssociationSubject.primaryExternalId", is(agmSubjectCurie)). - body("entity.agmAgmObjectAssociations[0].agmAgmAssociationObject", not(hasKey("agmAgmAssociations"))); } + @Test @Order(2) public void agmAgmAssociationBulkUploadUpdateCheckFields() throws Exception { - checkSuccessfulBulkLoad(agmAgmAssociationBulkPostEndpoint, agmAgmAssociationTestFilePath + "UD_01_update_all_except_default_fields.json"); RestAssured.given(). @@ -103,7 +94,6 @@ public void agmAgmAssociationBulkUploadUpdateCheckFields() throws Exception { then(). statusCode(200). body("entity.relation.name", is(relationName)). - body("entity.agmAgmAssociationObject.primaryExternalId", is(agmObjectCurie)). body("entity.agmAssociationSubject.primaryExternalId", is(agmSubjectCurie)). body("entity.internal", is(true)). body("entity.obsolete", is(true)). @@ -118,14 +108,7 @@ public void agmAgmAssociationBulkUploadUpdateCheckFields() throws Exception { get(agmGetEndpoint + agmSubjectCurie). then(). statusCode(200). - body("entity.agmSequenceTargetingReagentAssociations", hasSize(1)); - - RestAssured.given(). - when(). - get(agmGetEndpoint + agmObjectCurie). - then(). - statusCode(200). - body("entity.agmSequenceTargetingReagentAssociations", hasSize(1)); + body("entity.parentalPopulations", hasSize(1)); } @Test