You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2020/10/27 10:35:55 UTC
[uima-uimaj] 01/01: [UIMA-6286] select following finds zero-width
annotation at reference end position
This is an automated email from the ASF dual-hosted git repository.
rec pushed a commit to branch bugfix/UIMA-6286-select-following-finds-zero-width-annotation-at-reference-end-position
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git
commit 89c53d192727f0efc5d646e8147851cfc49364bd
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Tue Oct 27 11:35:40 2020 +0100
[UIMA-6286] select following finds zero-width annotation at reference end position
- When selecting following annotations, skip over zero-width annotations that are the the end position of the reference interval
- Added unit test checking behavior for zero-width annotations at start/end of reference when selecting following and preceding
---
.../org/apache/uima/cas/impl/SelectFSs_impl.java | 15 +++++++--
.../org/apache/uima/cas/impl/SelectFsTest.java | 37 +++++++++++++++++++++-
2 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
index 13f90e6..7880a05 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
@@ -772,7 +772,7 @@ public class SelectFSs_impl <T extends FeatureStructure> implements SelectFSs<T>
if (boundsUse == BoundsUse.notBounded) {
if (!isSortedIndex) {
// set index or bag index
- it = (LowLevelIterator<T>) idx.iterator();
+ it = (LowLevelIterator<T>) idx.iterator();
} else {
// index is sorted but no bounds are being used. Varieties:
// - AnnotationIndex:
@@ -781,7 +781,7 @@ public class SelectFSs_impl <T extends FeatureStructure> implements SelectFSs<T>
// - typePriority / ignore typePriority
// - orderNotNecessary / orderNeeded
// - preceding: need to skip over annotations whose end is > positioning-begin
-
+ // - following: need to skip over zero-width annotations at positioning-end
it = isAnnotationIndex
? (LowLevelIterator<T>) ai.iterator( ! isNonOverlapping, IS_NOT_STRICT, isUnordered, ! isTypePriority)
: idx.iterator(isUnordered, ! isTypePriority);
@@ -791,6 +791,17 @@ public class SelectFSs_impl <T extends FeatureStructure> implements SelectFSs<T>
// true if ok, false to skip
((Annotation) fs).getEnd() <= ((Annotation) startingFs).getBegin());
}
+
+ if (isFollowing) {
+ // filter the iterator to skip zero-width annotations at positioning-end because these
+ // are considered to be covered and not following
+ int startingFsEnd = ((Annotation) startingFs).getEnd();
+ it = new FilteredIterator<>(it, fs -> {
+ // true if ok, false to skip
+ int begin = ((Annotation) fs).getBegin();
+ return begin != ((Annotation) fs).getEnd() || begin != startingFsEnd;
+ });
+ }
}
} else {
if (isEmptyBoundingFs) {
diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java
index bd4f587..a4b21b9 100644
--- a/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java
+++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsTest.java
@@ -43,11 +43,15 @@ import org.apache.uima.util.CasCreationUtils;
import org.apache.uima.util.XMLInputSource;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
import org.junit.Test;
+import org.junit.runners.MethodSorters;
import x.y.z.Sentence;
import x.y.z.Token;
+// Sorting only to keep the list in Eclipse ordered so it is easier spot if related tests fail
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SelectFsTest {
private static TypeSystemDescription typeSystemDescription;
@@ -175,7 +179,7 @@ public class SelectFsTest {
}
@Test
- public void testempty() {
+ public void thatIsEmptyWorks() {
cas.reset();
JCas jcas = cas.getJCas();
cas.setDocumentText("t1 t2 t3 t4");
@@ -386,6 +390,37 @@ public class SelectFsTest {
}
@Test
+ public void thatSelectFollowingDoesNotFindZeroWidthAnnotationAtEnd()
+ {
+ Annotation a1 = cas.createAnnotation(cas.getAnnotationType(), 10, 20);
+ Annotation a2 = cas.createAnnotation(cas.getAnnotationType(), 20, 20);
+
+ asList(a1, a2).forEach(cas::addFsToIndexes);
+
+ List<Annotation> selection = cas.select(Annotation.class)
+ .following(a1)
+ .asList();
+
+ assertThat(selection)
+ .isEmpty();
+ }
+
+ @Test
+ public void thatSelectPrecedingDoesNotFindZeroWidthAnnotationAtStart()
+ {
+ Annotation a1 = cas.createAnnotation(cas.getAnnotationType(), 10, 20);
+ Annotation a2 = cas.createAnnotation(cas.getAnnotationType(), 10, 10);
+
+ asList(a1, a2).forEach(cas::addFsToIndexes);
+
+ List<Annotation> selection = cas.select(Annotation.class)
+ .preceding(a1)
+ .asList();
+
+ assertThat(selection)
+ .isEmpty();
+ }
+ @Test
public void thatSelectFollowingReturnsAdjacentAnnotation()
{
Annotation a1 = cas.createAnnotation(cas.getAnnotationType(), 10, 20);