From 51a95ac98b79414364f496e8338fc1535b94b036 Mon Sep 17 00:00:00 2001 From: waterflow80 Date: Sat, 20 Apr 2024 22:05:10 +0100 Subject: [PATCH 1/7] implemeted the one to many relationship for the metadata table using he @ElementCollection annotation --- .../controller/seqcol/SeqColController.java | 7 +++ .../eva/evaseqcol/entities/SeqColEntity.java | 2 - .../ebi/eva/evaseqcol/entities/SeqColId.java | 17 ------- .../entities/SeqColLevelOneEntity.java | 27 ++++++----- .../entities/SeqColLevelTwoEntity.java | 5 -- .../entities/SeqColMetadataEntity.java | 47 +++++++++++++++++++ .../repo/SeqColLevelOneRepository.java | 10 ++++ .../service/SeqColLevelOneService.java | 41 ++++++++++++++-- .../eva/evaseqcol/service/SeqColService.java | 18 +++++-- .../ebi/eva/evaseqcol/io/SeqColGenerator.java | 10 +++- .../ac/ebi/eva/evaseqcol/io/SeqColWriter.java | 4 +- .../service/SeqColLevelOneServiceTest.java | 8 ++-- 12 files changed, 146 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColId.java create mode 100644 src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java index d88f947..be22cb8 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java @@ -83,6 +83,13 @@ public ResponseEntity getSeqColByDigestAndLevel( return new ResponseEntity<>(HttpStatus.NOT_FOUND); } + @GetMapping(value = "/collection/{digest}/metadata") + public ResponseEntity getSeqColByDigestAndLevelMetadata(@PathVariable String digest) { + return new ResponseEntity<>( + seqColService.getSeqColMetadataBySeqColDigest(digest), HttpStatus.OK + ); + } + @GetMapping("/service-info") public ResponseEntity getServiceInfo() { try { diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java index 05da0ca..585198a 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColEntity.java @@ -17,8 +17,6 @@ public abstract class SeqColEntity { protected String digest; // The level 0 digest - protected NamingConvention namingConvention; - public enum NamingConvention { ENA, GENBANK, UCSC, TEST diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColId.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColId.java deleted file mode 100644 index 6accb4e..0000000 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColId.java +++ /dev/null @@ -1,17 +0,0 @@ -package uk.ac.ebi.eva.evaseqcol.entities; - -import com.sun.istack.NotNull; -import lombok.EqualsAndHashCode; - -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import java.io.Serializable; - -@EqualsAndHashCode -public class SeqColId implements Serializable { - @NotNull - private String digest; - - @Enumerated(EnumType.STRING) - private SeqColEntity.NamingConvention namingConvention; -} diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java index dd47949..846e88e 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelOneEntity.java @@ -7,20 +7,21 @@ import uk.ac.ebi.eva.evaseqcol.utils.JSONLevelOne; import javax.persistence.Basic; +import javax.persistence.CollectionTable; import javax.persistence.Column; +import javax.persistence.ElementCollection; import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.Id; -import javax.persistence.IdClass; +import javax.persistence.JoinColumn; import javax.persistence.Table; +import java.util.HashSet; +import java.util.Set; @Entity @NoArgsConstructor @Data @Table(name = "sequence_collections_L1") -@IdClass(SeqColId.class) public class SeqColLevelOneEntity extends SeqColEntity{ @Id @@ -32,15 +33,19 @@ public class SeqColLevelOneEntity extends SeqColEntity{ @Basic(fetch = FetchType.LAZY) private JSONLevelOne seqColLevel1Object; - @Id - @Column(nullable = false) - @Enumerated(EnumType.STRING) - protected NamingConvention namingConvention; + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "seqcol_md", joinColumns = + @JoinColumn(name = "digest", nullable = false, updatable = false)) + private Set metadata; - public SeqColLevelOneEntity(String digest, NamingConvention namingConvention, JSONLevelOne jsonLevelOne){ - super(digest, namingConvention); + public SeqColLevelOneEntity(String digest, JSONLevelOne jsonLevelOne){ + super(digest); this.seqColLevel1Object = jsonLevelOne; - this.namingConvention = namingConvention; + } + + public void addMetadata(SeqColMetadataEntity seqColMetadataEntity){ + if(metadata == null) metadata = new HashSet<>(); + metadata.add(seqColMetadataEntity); } @Override diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java index e707ae7..a7bea68 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColLevelTwoEntity.java @@ -24,9 +24,4 @@ public SeqColLevelTwoEntity setDigest(String digest) { this.digest = digest; return this; } - - public SeqColLevelTwoEntity setNamingConvention(NamingConvention convention) { - this.namingConvention = convention; - return this; - } } diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java new file mode 100644 index 0000000..8b6f58b --- /dev/null +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java @@ -0,0 +1,47 @@ +package uk.ac.ebi.eva.evaseqcol.entities; + +import lombok.Data; +import org.hibernate.annotations.CreationTimestamp; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import java.util.Date; + +@Data +@Embeddable +public class SeqColMetadataEntity { + + @Column(name = "source_id") + private String sourceIdentifier; // Eg: INSDC Acession + + @Column(name = "source_url") + private String sourceUrl; + + @Enumerated(EnumType.STRING) + @Column(name = "naming_convention") + private SeqColEntity.NamingConvention namingConvention; + + @Column(name = "timestamp", updatable = false, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") + @Temporal(TemporalType.TIMESTAMP) + @CreationTimestamp + private Date timestamp; + + public SeqColMetadataEntity setNamingConvention(SeqColEntity.NamingConvention namingConvention) { + this.namingConvention = namingConvention; + return this; + } + + public SeqColMetadataEntity setSourceIdentifier(String sourceIdentifier) { + this.sourceIdentifier = sourceIdentifier; + return this; + } + + public SeqColMetadataEntity setSourceUrl(String sourceUrl) { + this.sourceUrl = sourceUrl; + return this; + } +} diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java index 27ff575..b0bac73 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java @@ -1,9 +1,13 @@ package uk.ac.ebi.eva.evaseqcol.repo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelOneEntity; +import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; + +import java.util.List; @Repository public interface SeqColLevelOneRepository extends JpaRepository { @@ -14,4 +18,10 @@ public interface SeqColLevelOneRepository extends JpaRepository findMetadataBySeqColDigest(String digest); + + @Query(value = "select source_id, source_url, naming_convention, timestamp from seqcol_md", nativeQuery = true) + List findAllMetadata(); } diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java index 2810409..58e2f78 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java @@ -8,6 +8,7 @@ import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelOneEntity; import uk.ac.ebi.eva.evaseqcol.digests.DigestCalculator; import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelTwoEntity; +import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; import uk.ac.ebi.eva.evaseqcol.repo.SeqColLevelOneRepository; import uk.ac.ebi.eva.evaseqcol.utils.JSONExtData; import uk.ac.ebi.eva.evaseqcol.utils.JSONIntegerListExtData; @@ -15,7 +16,9 @@ import uk.ac.ebi.eva.evaseqcol.utils.JSONStringListExtData; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Optional; @@ -62,12 +65,17 @@ public List getAllSeqColLevelOneObjects(){ /** * Construct a seqCol level 1 entity out of three seqCol level 2 entities that - * hold names, lengths and sequences objects*/ + * hold names, lengths and sequences objects + * TODO: Change the signature of this method and make it accept metadata object instead of namingconvention and source id*/ public SeqColLevelOneEntity constructSeqColLevelOne(List>> stringListExtendedDataEntities, List>> integerListExtendedDataEntities, - SeqColEntity.NamingConvention convention) throws IOException { + SeqColEntity.NamingConvention convention, String sourceId) throws IOException { SeqColLevelOneEntity levelOneEntity = new SeqColLevelOneEntity(); JSONLevelOne jsonLevelOne = new JSONLevelOne(); + SeqColMetadataEntity metadata = new SeqColMetadataEntity() + .setNamingConvention(convention) + .setSourceIdentifier(sourceId); + levelOneEntity.addMetadata(metadata); // Looping over List types for (SeqColExtendedDataEntity> dataEntity: stringListExtendedDataEntities) { @@ -99,14 +107,13 @@ public SeqColLevelOneEntity constructSeqColLevelOne(List> sequencesExtData = new JSONStringListExtData(levelTwoEntity.getSequences()); JSONExtData> lengthsExtData = new JSONIntegerListExtData(levelTwoEntity.getLengths()); @@ -151,7 +158,7 @@ public SeqColLevelOneEntity constructSeqColLevelOne( lengthsExtEntity ); - return constructSeqColLevelOne(stringListExtendedDataEntities,integerListExtendedDataEntities, convention); + return constructSeqColLevelOne(stringListExtendedDataEntities,integerListExtendedDataEntities, convention, sourceId); } /** @@ -208,4 +215,28 @@ public List>> constructIntegerListExtData return integerListExtendedDataEntities; } + public List metadataObjectArrayListToMetadataList(List metadataArray) { + List metadataList = new ArrayList<>(); + for (Object[] metadataElements : metadataArray) { + SeqColMetadataEntity metadataEntity = new SeqColMetadataEntity(); + metadataEntity.setSourceIdentifier((String) metadataElements[0]); + metadataEntity.setSourceUrl((String) metadataElements[1]); + metadataEntity.setNamingConvention(SeqColEntity.NamingConvention.valueOf( + (String) metadataElements[2] + )); + metadataEntity.setTimestamp((Date) metadataElements[3]); + metadataList.add(metadataEntity); + } + return metadataList; + } + + public List getAllMetadata() { + List metadataArrayList = repository.findAllMetadata(); + return metadataObjectArrayListToMetadataList(metadataArrayList); + } + + public List getMetadataBySeqcolDigest(String digest) { + List metadataArrayList = repository.findMetadataBySeqColDigest(digest); + return metadataObjectArrayListToMetadataList(metadataArrayList); + } } \ No newline at end of file diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java index b3b8f44..5a046a7 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java @@ -14,6 +14,7 @@ import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelOneEntity; import uk.ac.ebi.eva.evaseqcol.entities.SeqColExtendedDataEntity; import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelTwoEntity; +import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; import uk.ac.ebi.eva.evaseqcol.exception.AssemblyAlreadyIngestedException; import uk.ac.ebi.eva.evaseqcol.exception.AssemblyNotFoundException; import uk.ac.ebi.eva.evaseqcol.exception.AttributeNotDefinedException; @@ -124,6 +125,10 @@ public Optional getSeqColByDigestAndLevel(String digest, } } + public List getSeqColMetadataBySeqColDigest(String digest) { + return levelOneService.getMetadataBySeqcolDigest(digest); + } + /** * Return the service info entity in a Map format * @see 'https://seqcol.readthedocs.io/en/dev/specification/#21-service-info' @@ -165,6 +170,13 @@ public IngestionResultEntity fetchAndInsertAllSeqColInFastaFile(String accession * assembly report. * Return the list of level 0 digests of the inserted seqcol objects*/ public IngestionResultEntity fetchAndInsertAllSeqColByAssemblyAccession(String assemblyAccession) throws IOException { + // Check for existing same source id + boolean sourceIdExists = levelOneService.getAllMetadata().stream() + .anyMatch(md -> md.getSourceIdentifier().equals(assemblyAccession)); + if (sourceIdExists) { + logger.warn("Seqcol objects for assembly" + assemblyAccession + " have been already ingested. Nothing to ingest !"); + throw new AssemblyAlreadyIngestedException(assemblyAccession); + } Optional> seqColDataMap = ncbiSeqColDataSource.getAllPossibleSeqColExtendedData(assemblyAccession); return createSeqColObjectsAndInsert(seqColDataMap, assemblyAccession); } @@ -206,8 +218,8 @@ public IngestionResultEntity createSeqColObjectsAndInsert(Optional seqColDigest = insertSeqColL1AndL2( // TODO: Check for possible self invocation problem @@ -227,7 +239,7 @@ public IngestionResultEntity createSeqColObjectsAndInsert(Optional>>) ucscExtendedDataMap.get("integerListExtDataList"); levelOneEntityUcsc = levelOneService.constructSeqColLevelOne( - extendedStringListDataEntitiesUcsc, extendedIntegerListDataEntitiesUcsc, SeqColEntity.NamingConvention.UCSC); + extendedStringListDataEntitiesUcsc, extendedIntegerListDataEntitiesUcsc, SeqColEntity.NamingConvention.UCSC, GCA_ACCESSION); Optional resultDigestUcsc = seqColService.addFullSequenceCollection( levelOneEntityUcsc, extendedStringListDataEntitiesUcsc, extendedIntegerListDataEntitiesUcsc); if (resultDigestUcsc.isPresent()) { @@ -163,7 +163,7 @@ public void create() throws IOException { extendedIntegerListDataEntitiesGenbank = (List>>) genbankExtendedDataMap.get("integerListExtDataList"); levelOneEntityGenbank = levelOneService.constructSeqColLevelOne( - extendedStringListDataEntitiesGenbank, extendedIntegerListDataEntitiesGenbank, SeqColEntity.NamingConvention.GENBANK); + extendedStringListDataEntitiesGenbank, extendedIntegerListDataEntitiesGenbank, SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); Optional resultDigestGenbank = seqColService.addFullSequenceCollection( levelOneEntityGenbank, extendedStringListDataEntitiesGenbank, extendedIntegerListDataEntitiesGenbank); if (resultDigestGenbank.isPresent()) { diff --git a/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java b/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java index 8d0bd66..061716f 100644 --- a/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java +++ b/src/test/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneServiceTest.java @@ -36,6 +36,8 @@ class SeqColLevelOneServiceTest { @Autowired private AssemblyDataGenerator assemblyDataGenerator; + private final String GCA_ACCESSION = "GCA_000146045.2"; + private AssemblyEntity assemblyEntity; private AssemblySequenceEntity assemblySequenceEntity; @@ -82,10 +84,10 @@ void constructSeqColL1Test() throws IOException { List>> integerListExtDataList = (List>>) extendedDataMapGenbank.get("integerListExtDataList"); SeqColLevelOneEntity levelOneEntity = levelOneService.constructSeqColLevelOne( - stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK); + stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); SeqColLevelTwoEntity levelTwoEntity = levelTwoService. constructSeqColL2(levelOneEntity.getDigest(), stringListExtDataList, integerListExtDataList); - SeqColLevelOneEntity constructedEntity = levelOneService.constructSeqColLevelOne(levelTwoEntity, SeqColEntity.NamingConvention.GENBANK); + SeqColLevelOneEntity constructedEntity = levelOneService.constructSeqColLevelOne(levelTwoEntity, SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); assertNotNull(constructedEntity); assertNotNull(constructedEntity.getSeqColLevel1Object().getSequences()); } @@ -100,7 +102,7 @@ void addSequenceCollectionL1() throws IOException { List>> integerListExtDataList = (List>>) extendedDataMapGenbank.get("integerListExtDataList"); SeqColLevelOneEntity levelOneEntity = levelOneService.constructSeqColLevelOne( - stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK); + stringListExtDataList, integerListExtDataList, SeqColEntity.NamingConvention.GENBANK, GCA_ACCESSION); Optional savedEntity = levelOneService.addSequenceCollectionL1(levelOneEntity); assertTrue(savedEntity.isPresent()); System.out.println(savedEntity.get()); From 5bf0216f34b4d5faaf1917b280a8f529dcefd3cb Mon Sep 17 00:00:00 2001 From: waterflow80 Date: Wed, 24 Apr 2024 14:18:10 +0100 Subject: [PATCH 2/7] changed timestamp into created_on --- .../ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java | 4 ++-- .../ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java | 4 ++-- .../ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java index 8b6f58b..d92f464 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java @@ -25,10 +25,10 @@ public class SeqColMetadataEntity { @Column(name = "naming_convention") private SeqColEntity.NamingConvention namingConvention; - @Column(name = "timestamp", updatable = false, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") + @Column(name = "created_on", updatable = false, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") @Temporal(TemporalType.TIMESTAMP) @CreationTimestamp - private Date timestamp; + private Date createdOn; public SeqColMetadataEntity setNamingConvention(SeqColEntity.NamingConvention namingConvention) { this.namingConvention = namingConvention; diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java index b0bac73..cae0177 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java @@ -19,9 +19,9 @@ public interface SeqColLevelOneRepository extends JpaRepository findMetadataBySeqColDigest(String digest); - @Query(value = "select source_id, source_url, naming_convention, timestamp from seqcol_md", nativeQuery = true) + @Query(value = "select source_id, source_url, naming_convention, created_on from seqcol_md", nativeQuery = true) List findAllMetadata(); } diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java index 58e2f78..5221df5 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java @@ -224,7 +224,7 @@ public List metadataObjectArrayListToMetadataList(List Date: Wed, 24 Apr 2024 14:19:15 +0100 Subject: [PATCH 3/7] remove unused class --- .../uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java index cae0177..e82e4c0 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/repo/SeqColLevelOneRepository.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Repository; import uk.ac.ebi.eva.evaseqcol.entities.SeqColLevelOneEntity; -import uk.ac.ebi.eva.evaseqcol.entities.SeqColMetadataEntity; import java.util.List; From 665237a31fef76d36e1d8611b1b786030bb00ab3 Mon Sep 17 00:00:00 2001 From: Haroune Hassine Date: Wed, 24 Apr 2024 15:03:17 +0100 Subject: [PATCH 4/7] Update src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java Co-authored-by: April Shen --- .../ebi/eva/evaseqcol/controller/seqcol/SeqColController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java index be22cb8..07b9412 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java @@ -84,7 +84,7 @@ public ResponseEntity getSeqColByDigestAndLevel( } @GetMapping(value = "/collection/{digest}/metadata") - public ResponseEntity getSeqColByDigestAndLevelMetadata(@PathVariable String digest) { + public ResponseEntity getSeqColMetadataByDigest(@PathVariable String digest) { return new ResponseEntity<>( seqColService.getSeqColMetadataBySeqColDigest(digest), HttpStatus.OK ); From c26668b95f59318ec89a1e0d6e0459eb450501c6 Mon Sep 17 00:00:00 2001 From: waterflow80 Date: Sat, 27 Apr 2024 15:01:21 +0100 Subject: [PATCH 5/7] fix timestamp ingestion --- .../ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java index d92f464..2f451e3 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java @@ -25,10 +25,10 @@ public class SeqColMetadataEntity { @Column(name = "naming_convention") private SeqColEntity.NamingConvention namingConvention; - @Column(name = "created_on", updatable = false, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") + @Column(name = "created_on", nullable = false) @Temporal(TemporalType.TIMESTAMP) @CreationTimestamp - private Date createdOn; + private Date createdOn = new Date(); public SeqColMetadataEntity setNamingConvention(SeqColEntity.NamingConvention namingConvention) { this.namingConvention = namingConvention; From fc9b52a69efbefa969978d55424931ae156b21fb Mon Sep 17 00:00:00 2001 From: waterflow80 Date: Fri, 17 May 2024 11:26:18 +0100 Subject: [PATCH 6/7] enhanced the transformation of the fetched tuple fron List to List --- .../entities/SeqColMetadataEntity.java | 10 +++++++ .../service/SeqColLevelOneService.java | 27 +++++++------------ .../eva/evaseqcol/service/SeqColService.java | 2 +- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java index 2f451e3..407a081 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/entities/SeqColMetadataEntity.java @@ -1,6 +1,7 @@ package uk.ac.ebi.eva.evaseqcol.entities; import lombok.Data; +import lombok.NoArgsConstructor; import org.hibernate.annotations.CreationTimestamp; import javax.persistence.Column; @@ -13,6 +14,7 @@ @Data @Embeddable +@NoArgsConstructor public class SeqColMetadataEntity { @Column(name = "source_id") @@ -30,6 +32,14 @@ public class SeqColMetadataEntity { @CreationTimestamp private Date createdOn = new Date(); + public SeqColMetadataEntity(String sourceIdentifier, String sourceUrl, SeqColEntity.NamingConvention namingConvention, + Date createdOn) { + this.sourceIdentifier = sourceIdentifier; + this.sourceUrl = sourceUrl; + this.namingConvention = namingConvention; + this.createdOn = createdOn; + } + public SeqColMetadataEntity setNamingConvention(SeqColEntity.NamingConvention namingConvention) { this.namingConvention = namingConvention; return this; diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java index 5221df5..44bc9ae 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColLevelOneService.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; @Service public class SeqColLevelOneService { @@ -215,28 +216,20 @@ public List>> constructIntegerListExtData return integerListExtendedDataEntities; } - public List metadataObjectArrayListToMetadataList(List metadataArray) { - List metadataList = new ArrayList<>(); - for (Object[] metadataElements : metadataArray) { - SeqColMetadataEntity metadataEntity = new SeqColMetadataEntity(); - metadataEntity.setSourceIdentifier((String) metadataElements[0]); - metadataEntity.setSourceUrl((String) metadataElements[1]); - metadataEntity.setNamingConvention(SeqColEntity.NamingConvention.valueOf( - (String) metadataElements[2] - )); - metadataEntity.setCreatedOn((Date) metadataElements[3]); - metadataList.add(metadataEntity); - } - return metadataList; + public SeqColMetadataEntity transformToMetadataEntity(Object[] tuple) { + return new SeqColMetadataEntity( + (String) tuple[0], + (String) tuple[1], + SeqColEntity.NamingConvention.valueOf((String) tuple[2]), + (Date) tuple[3] + ); } public List getAllMetadata() { - List metadataArrayList = repository.findAllMetadata(); - return metadataObjectArrayListToMetadataList(metadataArrayList); + return repository.findAllMetadata().stream().map(this::transformToMetadataEntity).collect(Collectors.toList()); } public List getMetadataBySeqcolDigest(String digest) { - List metadataArrayList = repository.findMetadataBySeqColDigest(digest); - return metadataObjectArrayListToMetadataList(metadataArrayList); + return repository.findMetadataBySeqColDigest(digest).stream().map(this::transformToMetadataEntity).collect(Collectors.toList()); } } \ No newline at end of file diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java index 5a046a7..c5e009f 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/service/SeqColService.java @@ -174,7 +174,7 @@ public IngestionResultEntity fetchAndInsertAllSeqColByAssemblyAccession(String a boolean sourceIdExists = levelOneService.getAllMetadata().stream() .anyMatch(md -> md.getSourceIdentifier().equals(assemblyAccession)); if (sourceIdExists) { - logger.warn("Seqcol objects for assembly" + assemblyAccession + " have been already ingested. Nothing to ingest !"); + logger.warn("Seqcol objects for assembly " + assemblyAccession + " have been already ingested... Nothing to ingest !"); throw new AssemblyAlreadyIngestedException(assemblyAccession); } Optional> seqColDataMap = ncbiSeqColDataSource.getAllPossibleSeqColExtendedData(assemblyAccession); From ea6e9e63aa6088db5bb37230ec8f35c49effb484 Mon Sep 17 00:00:00 2001 From: waterflow80 Date: Fri, 17 May 2024 12:25:25 +0100 Subject: [PATCH 7/7] chnaged the metadata endpoint from an independent endpoint that uses path variable, into a request param within the getSeqcolByDigest endpoint --- .../controller/seqcol/SeqColController.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java index 07b9412..4329501 100644 --- a/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java +++ b/src/main/java/uk/ac/ebi/eva/evaseqcol/controller/seqcol/SeqColController.java @@ -53,7 +53,16 @@ public ResponseEntity getSeqColByDigestAndLevel( required = true) @PathVariable String digest, @Parameter(name = "level", description = "The desired output's level (1 or 2)", - example = "1") @RequestParam(required = false) String level) { + example = "1") @RequestParam(required = false) String level, + @Parameter(name = "metadata", + description = "A boolean value that indicates if we need the metadata of the given seqcol digest", + example = "true, 1, yes") + @RequestParam(required = false, defaultValue = "false") boolean metadata) { + if (metadata) { + return new ResponseEntity<>( + seqColService.getSeqColMetadataBySeqColDigest(digest), HttpStatus.OK + ); + } if (level == null) level = "none"; try { switch (level) { @@ -83,13 +92,6 @@ public ResponseEntity getSeqColByDigestAndLevel( return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - @GetMapping(value = "/collection/{digest}/metadata") - public ResponseEntity getSeqColMetadataByDigest(@PathVariable String digest) { - return new ResponseEntity<>( - seqColService.getSeqColMetadataBySeqColDigest(digest), HttpStatus.OK - ); - } - @GetMapping("/service-info") public ResponseEntity getServiceInfo() { try {