{
private int count;
- private List<SearchResultMatchI> matches = new ArrayList<>();
+ private ArrayList<SearchResultMatchI> matches = new ArrayList<>();
/**
* One match consists of a sequence reference, start and end positions.
* Discontiguous ranges in a sequence require two or more Match objects.
*/
- public class Match implements SearchResultMatchI
+ public class Match
+ implements SearchResultMatchI, Comparable<SearchResultMatchI>
{
final SequenceI sequence;
{
return (sequence == seq && start <= from && end >= to);
}
+
+ @Override
+ public boolean adjacent(SequenceI seq, int from, int to)
+ {
+ return (sequence == seq && ((start <= from && end >= to)
+ || (from <= (end + 1) && to >= (end + 1))
+ || (from <= (start - 1) && to >= (start - 1))));
+ }
+
+ @Override
+ public int compareTo(SearchResultMatchI o)
+ {
+ if (start < o.getStart())
+ {
+ return -1;
+ }
+ if (start > o.getStart())
+ {
+ return +1;
+ }
+ if (end < o.getEnd())
+ {
+ return -1;
+ }
+ if (end > o.getEnd())
+ {
+ return +1;
+ }
+ if (sequence != o.getSequence())
+ {
+ int hashc = sequence.hashCode(), oseq = o.getSequence().hashCode();
+ return (hashc < oseq) ? -1 : 1;
+ }
+ return 0;
+ }
+
}
@Override
}
@Override
+ public boolean appendResult(SequenceI sequence, int start, int end)
+ {
+
+ Match m = new Match(sequence, start, end);
+
+ boolean appending = false;
+
+ // we dynamically maintain an interval to add as we test each range in the
+ // list
+
+ int cstart = start, cend = end;
+ List<SearchResultMatchI> toRemove = new ArrayList<>();
+ for (SearchResultMatchI thatm : matches)
+ {
+ if (thatm.getSequence() == sequence)
+ {
+ if (thatm.contains(sequence, cstart, cend))
+ {
+ // found a match containing the current range. nothing else to do
+ // except report if we operated on the list
+ return appending;
+ }
+ if (thatm.adjacent(sequence, cstart, cend))
+ {
+ // update the match to add with the adjacent start/end
+ start = Math.min(m.start, thatm.getStart());
+ end = Math.max(m.end, thatm.getEnd());
+ // and check if we keep or remove the old one
+ if (thatm.getStart() != start || thatm.getEnd() != end)
+ {
+ toRemove.add(thatm);
+ count--;
+ cstart = start;
+ cend = end;
+ appending = true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ }
+ matches.removeAll(toRemove);
+ {
+ matches.add(new Match(sequence, cstart, cend));
+ count++;
+ }
+ return appending;
+ }
+
+ @Override
public boolean involvesSequence(SequenceI sequence)
{
final int start = sequence.getStart();
else
{
// debug
- // jalview.bin.Console.errPrintln("Outwith bounds!" + matchStart+">"+end +" or "
+ // jalview.bin.Console.errPrintln("Outwith bounds!" +
+ // matchStart+">"+end +" or "
// + matchEnd+"<"+start);
}
}
}
return seqs;
}
+
}