JAL-3253-applet JAL-3397 JAL-3383 fast IntervalStore for JavaScript
[jalview.git] / src / jalview / datamodel / SequenceFeature.java
index 34565c6..6f51420 100755 (executable)
@@ -27,6 +27,7 @@ import jalview.datamodel.features.FeatureSourceI;
 import jalview.datamodel.features.FeatureSources;
 import jalview.util.StringUtils;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -34,6 +35,8 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.Vector;
 
+import intervalstore.api.IntervalI;
+
 /**
  * A class that models a single contiguous feature on a sequence. If flag
  * 'contactFeature' is true, the start and end positions are interpreted instead
@@ -216,10 +219,20 @@ public class SequenceFeature implements FeatureLocationI
   @Override
   public boolean equals(Object o)
   {
-    return equals(o, false);
+    return (o != null && (o instanceof SequenceFeature)
+            && equalsInterval((SequenceFeature) o));
   }
 
   /**
+   * Having determined that this is in fact a SequenceFeature, now check it for
+   * equivalence. Overridden in CrossRef; used by IntervalStore (possibly).
+   */
+  @Override
+  public boolean equalsInterval(IntervalI sf)
+  {
+    return equals((SequenceFeature) sf, false);
+  }
+  /**
    * Overloaded method allows the equality test to optionally ignore the
    * 'Parent' attribute of a feature. This supports avoiding adding many
    * superficially duplicate 'exon' or CDS features to genomic or protein
@@ -229,14 +242,8 @@ public class SequenceFeature implements FeatureLocationI
    * @param ignoreParent
    * @return
    */
-  public boolean equals(Object o, boolean ignoreParent)
+  public boolean equals(SequenceFeature sf, boolean ignoreParent)
   {
-    if (o == null || !(o instanceof SequenceFeature))
-    {
-      return false;
-    }
-
-    SequenceFeature sf = (SequenceFeature) o;
     boolean sameScore = Float.isNaN(score) ? Float.isNaN(sf.score)
             : score == sf.score;
     if (begin != sf.begin || end != sf.end || !sameScore)
@@ -735,4 +742,24 @@ public class SequenceFeature implements FeatureLocationI
   {
     source = theSource;
   }
+
+}
+
+class SFSortByEnd implements Comparator<SequenceFeature>
+{
+  @Override
+  public int compare(SequenceFeature a, SequenceFeature b)
+  {
+    return a.getEnd() - b.getEnd();
+  }
+}
+
+class SFSortByBegin implements Comparator<SequenceFeature>
+{
+  @Override
+  public int compare(SequenceFeature a, SequenceFeature b)
+  {
+    return a.getBegin() - b.getBegin();
+  }
 }