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/11/03 12:44:16 UTC

[uima-uimafit] branch bugfix/UIMA-6288-selectPreceding-using-zero-width-anchor-returns-covering-annotation created (now 2a07cda)

This is an automated email from the ASF dual-hosted git repository.

rec pushed a change to branch bugfix/UIMA-6288-selectPreceding-using-zero-width-anchor-returns-covering-annotation
in repository https://gitbox.apache.org/repos/asf/uima-uimafit.git.


      at 2a07cda  [UIMA-6286] select following finds zero-width annotation at reference end position

This branch includes the following new commits:

     new 2a07cda  [UIMA-6286] select following finds zero-width annotation at reference end position

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[uima-uimafit] 01/01: [UIMA-6286] select following finds zero-width annotation at reference end position

Posted by re...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rec pushed a commit to branch bugfix/UIMA-6288-selectPreceding-using-zero-width-anchor-returns-covering-annotation
in repository https://gitbox.apache.org/repos/asf/uima-uimafit.git

commit 2a07cda249ac973e56f72ec91070870bb3986eed
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Tue Nov 3 13:44:08 2020 +0100

    [UIMA-6286] select following finds zero-width annotation at reference end position
    
    - Added fix and unit test
---
 .../main/java/org/apache/uima/fit/util/CasUtil.java | 21 ++++++++++++++++-----
 .../java/org/apache/uima/fit/util/JCasUtilTest.java | 14 ++++++++++++++
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java b/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
index eaa0e5c..03c88ac 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
@@ -1088,14 +1088,14 @@ public final class CasUtil {
    *          a CAS.
    * @param type
    *          a UIMA type.
-   * @param annotation
+   * @param anchor
    *          anchor annotation
    * @param count
    *          number of annotations to collect
    * @return List of aType annotations preceding anchor annotation
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static List<AnnotationFS> selectPreceding(CAS cas, Type type, AnnotationFS annotation,
+  public static List<AnnotationFS> selectPreceding(CAS cas, Type type, AnnotationFS anchor,
           int count) {
     if (!cas.getTypeSystem().subsumes(cas.getAnnotationType(), type)) {
       throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation type");
@@ -1106,7 +1106,7 @@ public final class CasUtil {
     // Seek annotation in index
     // withSnapshotIterators() not needed here since we copy the FSes to a list anyway    
     FSIterator<AnnotationFS> itr = cas.getAnnotationIndex(type).iterator();
-    itr.moveTo(annotation);
+    itr.moveTo(anchor);
     
     // If the insertion point is beyond the index, move back to the last.
     if (!itr.isValid()) {
@@ -1115,20 +1115,30 @@ public final class CasUtil {
         return precedingAnnotations;
       }
     }
+    
+    int anchorBegin = anchor.getBegin();
+    int anchorEnd = anchor.getEnd();
 
     // No need to do additional seeks here (as done in selectCovered) because the current method
     // does not have to worry about type priorities - it never returns annotations that have
     // the same offset as the reference annotation.
     
     // make sure we're past the beginning of the reference annotation
-    while (itr.isValid() && itr.get().getEnd() > annotation.getBegin()) {
+    while (itr.isValid() && itr.get().getEnd() > anchorBegin) {
       itr.moveToPrevious();
     }
 
     // add annotations from the iterator into the result list
     for (int i = 0; i < count && itr.isValid(); itr.moveToPrevious()) {
       AnnotationFS cur = itr.get();
-      if (cur.getEnd() <= annotation.getBegin()) {
+
+      int curEnd = cur.getEnd();
+
+      if (
+              curEnd <= anchorBegin && 
+              (cur.getBegin() != curEnd || anchorBegin != curEnd) &&
+              (anchorBegin != anchorEnd || curEnd != anchorBegin)
+      ) {
         precedingAnnotations.add(itr.get());
         i++;
       }
@@ -1193,6 +1203,7 @@ public final class CasUtil {
       }
       followingAnnotations.add(itr.get());
     }
+    
     return followingAnnotations;
   }
 
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
index afdbb52..7094af4 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
@@ -694,7 +694,21 @@ public class JCasUtilTest extends ComponentTestBase {
     assertThat(selection)
             .isEmpty();
   }
+
+  @Test
+  public void thatSelectPrecedingOnZeroWidthDoesNotFindAnnotationEndingAtSameLocation()
+  {
+    Annotation a1 = new Annotation(jCas, 10, 20);
+    Annotation a2 = new Annotation(jCas, 20, 20);
+    
+    asList(a1, a2).forEach(a -> a.addToIndexes());
+    
+    List<Annotation> selection = selectPreceding(Annotation.class, a2, MAX_VALUE);
     
+    assertThat(selection)
+            .isEmpty();
+  }
+
   @Test
   public void testExists() throws UIMAException {
     JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();