in uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java [407:485]
public static List<AnnotationFS> selectBetween(final CAS cas, final Type type,
final AnnotationFS ann1, final AnnotationFS ann2) {
AnnotationFS left;
AnnotationFS right;
if (ann1.getEnd() > ann2.getBegin()) {
left = ann2;
right = ann1;
} else {
left = ann1;
right = ann2;
}
int begin = left.getEnd();
int end = right.getBegin();
List<AnnotationFS> list = new ArrayList<AnnotationFS>();
// withSnapshotIterators() not needed here since we copy the FSes to a list anyway
FSIterator<AnnotationFS> it = cas.getAnnotationIndex(type).iterator();
// Try to seek the insertion point.
it.moveTo(left);
// If the insertion point is beyond the index, move back to the last.
if (!it.isValid()) {
it.moveToLast();
if (!it.isValid()) {
return list;
}
}
// Ignore type priorities by seeking to the first that has the same begin
boolean moved = false;
while (it.isValid() && (it.get()).getBegin() >= begin) {
it.moveToPrevious();
moved = true;
}
// If we moved, then we are now on one starting before the requested begin, so we have to
// move one ahead.
if (moved) {
it.moveToNext();
}
// If we managed to move outside the index, start at first.
if (!it.isValid()) {
it.moveToFirst();
}
// Skip annotations whose start is before the start parameter.
while (it.isValid() && (it.get()).getBegin() < begin) {
it.moveToNext();
}
boolean strict = true;
while (it.isValid()) {
AnnotationFS a = it.get();
// If the start of the current annotation is past the end parameter, we're done.
if (a.getBegin() > end) {
break;
}
it.moveToNext();
if (strict && a.getEnd() > end) {
continue;
}
assert (a.getBegin() >= left.getEnd()) : "Illegal begin " + a.getBegin() + " in [" + begin
+ ".." + end + "]";
assert (a.getEnd() <= right.getBegin()) : "Illegal end " + a.getBegin() + " in [" + begin
+ ".." + end + "]";
if (!a.equals(left) && !a.equals(right)) {
list.add(a);
}
}
return unmodifiableList(list);
}