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

schor pushed a commit to branch feature/UIMA-6160-startAt-with-single-int-arg
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git

commit c5ab3a798aa1739ed36b110a83a2b1c95d422a7e
Author: Marshall Schor <m...@schor.com>
AuthorDate: Fri Jan 10 13:55:24 2020 -0500

    [UIMA-6160] add startAt with one int, incl doc and test
---
 .../src/docbook/uv3.select.xml                        | 16 +++++++++-------
 .../src/main/java/org/apache/uima/cas/SelectFSs.java  | 11 +++++++++++
 .../java/org/apache/uima/cas/impl/SelectFSs_impl.java |  7 +++++++
 .../apache/uima/cas/test/AnnotationIteratorTest.java  | 19 ++++++++++++-------
 4 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/uima-docbook-v3-users-guide/src/docbook/uv3.select.xml 
b/uima-docbook-v3-users-guide/src/docbook/uv3.select.xml
index 8d5cb47..4a04d79 100644
--- a/uima-docbook-v3-users-guide/src/docbook/uv3.select.xml
+++ b/uima-docbook-v3-users-guide/src/docbook/uv3.select.xml
@@ -421,18 +421,20 @@ FSIterator&lt;Token&gt; token_iterator =
           <term><emphasis role="">startAt</emphasis></term>
           <listitem>
             <para>position the starting point of any iteration.  
-                               <code>startAt(xxx)</code> takes two forms, each 
of which has, in turn 2 subforms.  
-                               The form using <code>begin, end</code> is only 
valid for Annotation Indexes.
-                               <programlisting>startAt(fs);          // fs 
specifies a feature structure 
+                               <code>startAt(...)</code> can be used for 
general sorted indexes, and also has special
+                               formats only usable for Annotation Indexes.   
+                               <programlisting>// Forms for any sorted index
+startAt(fs);          // fs specifies a feature structure 
                       // indicating the starting position
              
 startAt(fs, shifted); // same as above, but after positioning, 
                       // shift to the right or left by the shift 
-                      // amount which can be positive or negative
-             
+                      // amount which can be positive or negative             
+
+// Forms for AnnotationIndex sources
 
-// the next two forms are only valid for AnnotationIndex sources
-   
+startAt(begin);       // sets no TypePriorities, and starts at the
+                      //   leftmost annotation whose begin is >= begin   
 startAt(begin, end);  // start at the position indicated by begin/end
 
 startAt(begin, end, shifted) // same as above, 
diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java 
b/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
index e2f6096..965cd81 100644
--- a/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
+++ b/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
@@ -226,6 +226,17 @@ public interface SelectFSs<T extends FeatureStructure> 
extends Iterable<T>, Stre
    * @return the updated SelectFSs object
    */
   SelectFSs<T> startAt(FeatureStructure fs);
+  
+  /**
+   * Starting Position specification - For Annotation Indexes, specifies which 
FS to start at.
+   * Sets no typepriorities.
+   * Positions to the leftmost (if there are multiple equal ones) Annotation 
+   *   whose begin is >= begin 
+   * @param begin the begin bound
+   * @return the updated SelectFSs object
+   */
+  SelectFSs<T> startAt(int begin);   // requires Annotation Index, no type 
priorities
+
   /**
    * Starting Position specification - For Annotation Indexes, specifies which 
FS to start at. 
    * @param begin the begin bound
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 36accf2..dc89c7e 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
@@ -383,6 +383,13 @@ public class SelectFSs_impl <T extends FeatureStructure> 
implements SelectFSs<T>
 //  }
 
   @Override
+  public SelectFSs_impl<T> startAt(int begin) {
+    this.isTypePriority = false;
+    this.startingFs = makePosAnnot(begin, Integer.MAX_VALUE);
+    return this;
+  }
+  
+  @Override
   public SelectFSs_impl<T> startAt(int begin, int end) {  // AI
     this.startingFs = makePosAnnot(begin, end);
     return this;
diff --git 
a/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java 
b/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java
index 75bc739..7196a80 100644
--- 
a/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java
+++ 
b/uimaj-core/src/test/java/org/apache/uima/cas/test/AnnotationIteratorTest.java
@@ -204,7 +204,7 @@ public class AnnotationIteratorTest extends TestCase {
   
 
   public void testIterator1() {
-    int annotCount = setupTheCas();
+    final int annotCount = setupTheCas();
     FSIndexRepository ir = this.cas.getIndexRepository();
 
     /***************************************************
@@ -258,7 +258,7 @@ public class AnnotationIteratorTest extends TestCase {
    * @param fss
    */
   // called twice, the 2nd time should be with flattened indexes (List afss 
non empty the 2nd time)
-  private void iterateOverAnnotations(int annotCount, List<Annotation> afss) {
+  private void iterateOverAnnotations(final int annotCount, List<Annotation> 
afss) {
     this.fss = afss;
     isSave = fss.size() == 0;   // on first call is 0, so save on first call
 //    int count;
@@ -273,6 +273,8 @@ public class AnnotationIteratorTest extends TestCase {
     assertEquals(annotCount, select(annotIndex).toArray().length);  // stream 
op
     assertEquals(annotCount, 
select(annotIndex).asArray(Annotation.class).length);  // select op
     
+    assertEquals(annotCount - 5, 
annotIndex.select().startAt(2).asArray(Annotation.class).length);
+    
     Annotation[] tokensAndSentencesAndPhrases = 
annotIndex.select().asArray(Annotation.class);
     JCas jcas = null;
     try {
@@ -761,6 +763,9 @@ public class AnnotationIteratorTest extends TestCase {
 //                      +--------+
 //  Sentences                +--------+
 //                                +----------+
+//  one xtr sent                    +-----------------+  (12, 31)
+//
+//  Phrases             some overlap, some dont, 3-7 length
 //
 //  bound4strict                   +------------------+            
 //  sentence4strict                 +-----------------------------+
@@ -802,16 +807,16 @@ public class AnnotationIteratorTest extends TestCase {
      }
    }
    
-   // create overlapping phrases
-   // begin =  0,  6,  10, 14, ...
-   // end   =  5,  9,  16, 19, ...
+   // create overlapping and non-overlapping phrases
+   // begin =  0,  6,  9,  15, 21, 24, 30, 36, ...
+   // end   =  5,  9,  16, 20, 24, 31, 35, 39, ...
    
    int beginAlt = 0, endAlt = 0;
    for (int i = 0; i < text.length() - 10; i += 5) {
      ++annotCount;
      ir.addFS(fs = this.cas.createAnnotation(this.phraseType,  i + beginAlt, i 
+ 5 + endAlt));
-     beginAlt = (beginAlt == 1) ? -1 : beginAlt + 1;
-     endAlt = (endAlt == -1) ? 1 : endAlt - 1;
+     beginAlt = (beginAlt == 1) ? -1 : beginAlt + 1; // sequence: start @ 0, 
then 1, -1, 0, 1, ...
+     endAlt = (endAlt == -1) ? 1 : endAlt - 1; //sequence: start At 0, then 
-1, 1, 0, -1, ...
      if (showFSs) {
        System.out.format("creating: %d begin: %d end: %d type: %s%n", 
annotCount, fs.getBegin(), fs.getEnd(), fs.getType().getName() );
      }

Reply via email to