JAL-3397 impl.IntervalStore and nonc.IntervalStore unified api
[jalview.git] / src / jalview / datamodel / features / SequenceFeatures.java
index 93ee71b..e747d5f 100644 (file)
@@ -26,6 +26,7 @@ import jalview.io.gff.SequenceOntologyI;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -45,7 +46,6 @@ import intervalstore.api.IntervalI;
  */
 public class SequenceFeatures implements SequenceFeaturesI
 {
-
   /*
    * map from feature type to structured store of features for that type
    * null types are permitted (but not a good idea!)
@@ -111,7 +111,7 @@ public class SequenceFeatures implements SequenceFeaturesI
     List<SequenceFeature> result = new ArrayList<>();
     for (FeatureStore featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.findOverlappingFeatures(from, to));
+      featureSet.findOverlappingFeatures(from, to, result);
     }
     return result;
   }
@@ -151,8 +151,8 @@ public class SequenceFeatures implements SequenceFeaturesI
       return new ArrayList<>();
     }
 
-    return getAllFeatures(featureTypes.toArray(new String[featureTypes
-            .size()]));
+    return getAllFeatures(
+            featureTypes.toArray(new String[featureTypes.size()]));
   }
 
   /**
@@ -195,7 +195,7 @@ public class SequenceFeatures implements SequenceFeaturesI
 
     for (FeatureStore featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.getPositionalFeatures());
+      featureSet.getPositionalFeatures(result);
     }
     return result;
   }
@@ -217,7 +217,6 @@ public class SequenceFeatures implements SequenceFeaturesI
       return featureStore.values();
     }
 
-
     List<FeatureStore> types = new ArrayList<>();
     List<String> args = Arrays.asList(type);
     for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
@@ -240,7 +239,7 @@ public class SequenceFeatures implements SequenceFeaturesI
 
     for (FeatureStore featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.getContactFeatures());
+      featureSet.getContactFeatures(result);
     }
     return result;
   }
@@ -255,7 +254,7 @@ public class SequenceFeatures implements SequenceFeaturesI
 
     for (FeatureStore featureSet : varargToTypes(type))
     {
-      result.addAll(featureSet.getNonPositionalFeatures());
+      featureSet.getNonPositionalFeatures(result);
     }
     return result;
   }
@@ -320,8 +319,8 @@ public class SequenceFeatures implements SequenceFeaturesI
 
     for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
     {
-      Set<String> featureGroups = featureType.getValue().getFeatureGroups(
-              positionalFeatures);
+      Set<String> featureGroups = featureType.getValue()
+              .getFeatureGroups(positionalFeatures);
       for (String group : groups)
       {
         if (featureGroups.contains(group))
@@ -389,8 +388,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   @Override
   public float getMinimumScore(String type, boolean positional)
   {
-    return featureStore.containsKey(type) ? featureStore.get(type)
-            .getMinimumScore(positional) : Float.NaN;
+    return featureStore.containsKey(type)
+            ? featureStore.get(type).getMinimumScore(positional)
+            : Float.NaN;
   }
 
   /**
@@ -399,8 +399,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   @Override
   public float getMaximumScore(String type, boolean positional)
   {
-    return featureStore.containsKey(type) ? featureStore.get(type)
-            .getMaximumScore(positional) : Float.NaN;
+    return featureStore.containsKey(type)
+            ? featureStore.get(type).getMaximumScore(positional)
+            : Float.NaN;
   }
 
   /**
@@ -413,7 +414,9 @@ public class SequenceFeatures implements SequenceFeaturesI
   public static void sortFeatures(List<? extends IntervalI> features,
           final boolean forwardStrand)
   {
-    IntervalI.sortIntervals(features, forwardStrand);
+    Collections.sort(features,
+            forwardStrand ? IntervalI.COMPARE_BEGIN_ASC
+                    : IntervalI.COMPARE_END_DESC);
   }
 
   /**
@@ -465,20 +468,18 @@ public class SequenceFeatures implements SequenceFeaturesI
     featureStore.clear();
   }
 
-  /**
-   * Simplified find for features associated with a given position.
-   * 
-   * @author Bob Hanson 2019.07.30
-   */
   @Override
-  public void findFeatures(int pos, String type, List<SequenceFeature> list)
+  public List<SequenceFeature> findFeatures(int pos, String type,
+          List<SequenceFeature> list)
   {
     FeatureStore fs = featureStore.get(type);
-    if (fs != null)
-    {
-      fs.findOverlappingFeatures(pos, list);
-    }
+    return fs.findOverlappingFeatures(pos, pos, list);
   }
 
+  @Override
+  public boolean hasFeatures(String type)
+  {
+    return featureStore.containsKey(type);
+  }
 
 }