From d867cf856b9c0cdcb3d9732691f2c3afe861697c Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Fri, 3 Sep 2021 18:39:14 +0100 Subject: [PATCH] JAL-3863 promote non-canonical version of dbref to a canonical one --- src/jalview/datamodel/DBRefEntry.java | 21 +++++++++++++++++++-- test/jalview/datamodel/DBRefEntryTest.java | 15 +++++++++++++++ test/jalview/datamodel/SequenceTest.java | 12 +++++++++++- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/jalview/datamodel/DBRefEntry.java b/src/jalview/datamodel/DBRefEntry.java index b6cae62..511287b 100755 --- a/src/jalview/datamodel/DBRefEntry.java +++ b/src/jalview/datamodel/DBRefEntry.java @@ -172,6 +172,7 @@ public class DBRefEntry implements DBRefEntryI return true; } + boolean improved=false; /* * source must either match or be both null */ @@ -195,6 +196,19 @@ public class DBRefEntry implements DBRefEntryI return false; } + if (!isCanonicalAccession && other.isCanonical()) + { + isCanonicalAccession = true; + improved = true; + } + else + { + if (isCanonicalAccession && !other.isCanonical()) + { + // other is not an authoritative source of canonical accessions + return false; + } + } /* * if my version is null, "0" or "source:0" then replace with other version, * otherwise the versions have to match @@ -211,12 +225,15 @@ public class DBRefEntry implements DBRefEntryI if (version != null && (otherVersion == null || !version.equalsIgnoreCase(otherVersion))) { - return false; + // FIXME: there may be a problem with old version strings not allowing + // updating of dbrefentries + return improved; } } /* - * if I have no mapping, take that of the other dbref + * if I have no mapping, take that of the other dbref + * - providing it had a version and so do I */ if (map == null) { diff --git a/test/jalview/datamodel/DBRefEntryTest.java b/test/jalview/datamodel/DBRefEntryTest.java index c8f998b..e95a8b5 100644 --- a/test/jalview/datamodel/DBRefEntryTest.java +++ b/test/jalview/datamodel/DBRefEntryTest.java @@ -134,6 +134,21 @@ public class DBRefEntryTest assertEquals("3", ref1.getVersion()); /* + * canonical == false superseded by canonical == true + */ + ref1.setCanonical(false); + ref2.setCanonical(true); + assertTrue(ref1.updateFrom(ref2)); + assertTrue(ref1.isCanonical()); + + /* + * canonical == true NOT superseded by canonical == false + */ + ref1.setCanonical(true); + ref2.setCanonical(false); + assertFalse(ref1.updateFrom(ref2)); + + /* * version "source:n" with n>0 is not superseded */ ref1.setVersion("UNIPROT:1"); diff --git a/test/jalview/datamodel/SequenceTest.java b/test/jalview/datamodel/SequenceTest.java index 5ae7dd9..e549978 100644 --- a/test/jalview/datamodel/SequenceTest.java +++ b/test/jalview/datamodel/SequenceTest.java @@ -2181,9 +2181,19 @@ public class SequenceTest Sequence toSeq = new Sequence("MYSEQ","THISISASEQ"); origSeq.addDBRef(new DBRefEntry("UNIPROT", "0", "Q12345", null, true)); toSeq.transferAnnotation(origSeq, null); - assertTrue(toSeq.getDBRefs().size()>0); + assertTrue(toSeq.getDBRefs().size()==1); assertTrue(toSeq.getDBRefs().get(0).isCanonical()); + // check for promotion of non-canonical + // to canonical (e.g. fetch-db-refs on a jalview project pre 2.11.2) + toSeq.setDBRefs(null); + toSeq.addDBRef(new DBRefEntry("UNIPROT", "0", "Q12345", null, false)); + toSeq.transferAnnotation(origSeq, null); + assertTrue(toSeq.getDBRefs().size()==1); + + assertTrue("Promotion of non-canonical DBRefEntry failed",toSeq.getDBRefs().get(0).isCanonical()); + + } } -- 1.7.10.2