You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2016/10/13 15:51:58 UTC

svn commit: r1764717 - in /uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas: SelectFSs.java impl/FSIndexRepositoryImpl.java impl/LowLevelIndex.java impl/SelectFSs_impl.java

Author: schor
Date: Thu Oct 13 15:51:57 2016
New Revision: 1764717

URL: http://svn.apache.org/viewvc?rev=1764717&view=rev
Log:
[UIMA-5115] updates to Select framework, after writing the docs for it, so it matches the docs.

Modified:
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java?rev=1764717&r1=1764716&r2=1764717&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/SelectFSs.java Thu Oct 13 15:51:57 2016
@@ -36,19 +36,19 @@ import org.apache.uima.jcas.cas.TOP;
  */
 public interface SelectFSs<T extends FeatureStructure> extends Iterable<T>, Stream<T> {
   
-  // If not specified, defaults to all FSs (unordered) unless AnnotationIndex implied
-    // Methods take their generic type from the variable to which they are assigned except for
-    // index(class) which takes it from its argument.
-  <N extends FeatureStructure> SelectFSs<N> index(String indexName);  
-  <N extends FeatureStructure> SelectFSs<N> index(FSIndex<N> index);
-
-  // If not specified defaults to the index's uppermost type.
-  // Methods take their generic type from the variable to which they are assigned except for
-  // type(class) which takes it from its argument.
-  <N extends FeatureStructure> SelectFSs<N> type(Type uimaType);
-  <N extends FeatureStructure> SelectFSs<N> type(String fullyQualifiedTypeName);
-  <N extends FeatureStructure> SelectFSs<N> type(int jcasClass_dot_type);
-  <N extends FeatureStructure> SelectFSs<N> type(Class<N> jcasClass_dot_class);
+//  // If not specified, defaults to all FSs (unordered) unless AnnotationIndex implied
+//    // Methods take their generic type from the variable to which they are assigned except for
+//    // index(class) which takes it from its argument.
+//  <N extends FeatureStructure> SelectFSs<N> index(String indexName);  
+//  <N extends FeatureStructure> SelectFSs<N> index(FSIndex<N> index);
+//
+//  // If not specified defaults to the index's uppermost type.
+//  // Methods take their generic type from the variable to which they are assigned except for
+//  // type(class) which takes it from its argument.
+//  <N extends FeatureStructure> SelectFSs<N> type(Type uimaType);
+//  <N extends FeatureStructure> SelectFSs<N> type(String fullyQualifiedTypeName);
+//  <N extends FeatureStructure> SelectFSs<N> type(int jcasClass_dot_type);
+//  <N extends FeatureStructure> SelectFSs<N> type(Class<N> jcasClass_dot_class);
     
 //  SelectFSs<T> shift(int amount); // incorporated into startAt 
   
@@ -163,8 +163,8 @@ public interface SelectFSs<T extends Fea
   // ---------------------------------
   FSIterator<T> fsIterator();
   Iterator<T> iterator();
-  List<T> asList(Class<T> clazz);
-  T[] asArray(Class<T> clazz);
+  <N extends T> List<N> asList();
+  <N extends T> N[] asArray(Class<N> clazz);
   Spliterator<T> spliterator();
   
   // returning one item
@@ -190,15 +190,27 @@ public interface SelectFSs<T extends Fea
   T single(int begin, int end, int offset);       // throws if not exactly 1 element
   T singleOrNull(int begin, int end, int offset); // throws if more than 1 element, returns single or null
   
-  // ---------------------------------
-  // The methods below are alternatives 
-  // to the methods above, that combine
-  // frequently used patterns into more
-  // concise forms using positional arguments
-  // ---------------------------------
   
-  static <N extends FeatureStructure> SelectFSs<N> sselect(FSIndex<N> index) {
+  /**
+   * static methods that more effectively capture the generic argument
+   */
+  /**
+   * @param index
+   * @return
+   */
+  static <U extends FeatureStructure, V extends U> SelectFSs<V> sselect(FSIndex<U> index) {
     return index.select();    
   } 
+  
+//  /**
+//   * DON'T USE THIS, use index.select(XXX.class) instead
+//   * @param index the index to use
+//   * @param clazz the JCas class
+//   * @return a select instance for this index and type
+//   */
+//  static <U extends FeatureStructure, V extends U> SelectFSs<V> sselect(FSIndex<U> index, Class<V> clazz) {
+//    return index.select(clazz);
+//  }
+ 
 
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java?rev=1764717&r1=1764716&r2=1764717&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FSIndexRepositoryImpl.java Thu Oct 13 15:51:57 2016
@@ -350,7 +350,18 @@ public class FSIndexRepositoryImpl imple
 
   // one bit per typeCode, indexed by typeCode
   //   This is only to speed up the test to skip adding an index to the set of "used" ones if it already is used.
-  final private boolean[] isUsed;
+  final private BitSet isUsed;
+  
+//  /**
+//   * Used for maintaining collection of all used iicp's for indexes
+//   * package scope for setting in index impl flush
+//   */
+//  boolean isUsedChanged = true;
+//  
+//  /**
+//   * iicps for all FSs
+//   */
+//  private List<FsIndex_iicp<?>> iicps4allFSs = null;
   
   // Monitor which indexes are iterated over, to allow resetting flatIndexes
 //  final private List<FsIndex_iicp<? extends FeatureStructure>> iteratedSortedIndexes = 
@@ -409,6 +420,8 @@ public class FSIndexRepositoryImpl imple
     this.indexUpdateOperation = null;
     this.usedIndexes = null;
     this.isUsed = null;
+//    this.isUsedChanged = true;
+//    this.iicps4allFSs = null;
   }
 
   /**
@@ -432,7 +445,9 @@ public class FSIndexRepositoryImpl imple
     this.logProcessed = false;
     this.indexArray = new IndexesForType[this.sii.tsi.getNumberOfTypes() + 1];
     this.usedIndexes = new IntVector();
-    this.isUsed = new boolean[numTypes];
+    this.isUsed = new BitSet(numTypes);
+//    this.isUsedChanged = true;
+//    this.iicps4allFSs = new ArrayList<>();
     init();
   }
 
@@ -460,8 +475,9 @@ public class FSIndexRepositoryImpl imple
     this.logProcessed = false;
     this.indexArray = new IndexesForType[numTypes];
     this.usedIndexes = new IntVector();
-    this.isUsed = new boolean[numTypes];
-
+    this.isUsed = new BitSet(numTypes);
+//    this.isUsedChanged = true;
+//    this.iicps4allFSs = new ArrayList<>();
     init();
     // cant do this here because need to have the CAS's ref to this instance set before this is done.
 //    baseIndexRepo.name2indexMap.keySet().stream().forEach(key -> createIndex(baseIndexRepo, key));
@@ -623,10 +639,11 @@ public class FSIndexRepositoryImpl imple
     }
     
     annotationIndexes.clear();
-    
+    isUsed.clear();
+//    isUsedChanged = true;
+//    iicps4allFSs.clear();
     for (int i = 0; i < usedIndexes.size(); i++) {
       int used = this.usedIndexes.get(i);
-      isUsed[used] = false;
       for (FsIndex_iicp<?> iicp : indexArray[used].indexesForType) {
         iicp.fsIndex_singletype.flush();
       }
@@ -1318,9 +1335,10 @@ public class FSIndexRepositoryImpl imple
       ((FsIndex_singletype<T>)(indexes.get(indexes.size() - 1)).fsIndex_singletype).insert(fs);
     }
 
-    if (!this.isUsed[typeCode]) {
+    if (!this.isUsed.get(typeCode)) {
       // mark this type as being in some indexes
-      this.isUsed[typeCode] = true;
+      this.isUsed.set(typeCode);
+//      this.isUsedChanged = true;
       this.usedIndexes.add(typeCode);
     }
   }
@@ -1329,6 +1347,13 @@ public class FSIndexRepositoryImpl imple
     return "_" + type.getName() + "_DefaultBagGeneratedIndex";
   }
 
+  /**
+   * Common remove FS code; all remove operations call this, except bulk remove (flush and removeall...)
+   * Removes FS from all indexes in this view (except bag if skipBagIndexes is true)
+   * @param fs the fs to remove
+   * @param skipBagIndexes set true by protect-indexes style of temporary removal
+   * @return true if it was removed
+   */
   boolean removeFS_ret(TOP fs, boolean skipBagIndexes) {
     if (skipBagIndexes && !fs._inSetSortedIndex()) {
       return false;
@@ -1358,6 +1383,9 @@ public class FSIndexRepositoryImpl imple
       }
     }
     
+    /**
+     * Actual remove loop over all indexes for this type in this view
+     */
     for (FsIndex_iicp<TOP> iicp : indexes4type) {
       FsIndex_singletype<TOP> st = iicp.fsIndex_singletype;
       if (skipBagIndexes && !st.isSetOrSorted()) {
@@ -1377,10 +1405,13 @@ public class FSIndexRepositoryImpl imple
       if (this.cas.getCurrentMark() != null) {
         logIndexOperation(fs, ITEM_REMOVED_FROM_INDEX);
       }
-      if (skipBagIndexes ||              // means called for remove from all corruptable indexes 
-          fs instanceof AnnotationBase) {  // means only indexed in this index
-        fs._resetInSetSortedIndex();
-      } 
+      
+   // oops, might still be indexed in other views if not instance of AnnotationBase
+   // reset in caller (removeFromIndexAnyView)
+//      if (skipBagIndexes ||              // means called for remove only from all corruptable indexes 
+//          fs instanceof AnnotationBase) {  // means only indexed in this view 
+//        fs._resetInSetSortedIndex();     
+//      } 
     }
     return wasRemoved;    
   }
@@ -1396,7 +1427,25 @@ public class FSIndexRepositoryImpl imple
    */
   public <T extends FeatureStructure> LowLevelIterator<T> getAllIndexedFS(Type type) {
     final ArrayList<LowLevelIterator<T>> iteratorList = new ArrayList<>();
-    getAllIndexedFS(type, iteratorList);
+    
+//    TypeImpl ti = (TypeImpl) type;
+//    if (!isUsedChanged && ti.isTopType()) {  
+//      // reuse previously computed iicps4allFSs
+//      for (FsIndex_iicp<?> iicp : iicps4allFSs) {
+//        if (iicp.cachedSubFsLeafIndexes[0].size() != 0) {
+//          LowLevelIterator<T> it = (iicp.getIndexingStrategy() == FSIndex.SORTED_INDEX) 
+//              ? (LowLevelIterator<T>)iicp.iteratorUnordered()
+//              : (LowLevelIterator<T>)iicp.iterator();
+//          iteratorList.add(it);
+//        }
+//      }
+//    } else {
+//      iicps4allFSs.clear();
+      getAllIndexedFS(type, iteratorList);
+//      this.isUsedChanged = false; // above call recomputed the cache  
+//    }    
+
+    
     final int iteratorListSize = iteratorList.size();
     if (iteratorListSize == 0) {
       return (LowLevelIterator<T>) LowLevelIterator.FS_ITERATOR_LOW_LEVEL_EMPTY;
@@ -1422,11 +1471,14 @@ public class FSIndexRepositoryImpl imple
     //   Note that a default bag index is guaranteed to exist if any FS of Type type were added to the indexes
     //     and only a SET index was defined, see https://issues.apache.org/jira/browse/UIMA-4111
 
-    // get all indexes for this type
+    
+    // get all indexes for this type and compute iicps4allFSs
+
     TypeImpl ti = (TypeImpl)type;
-    if (isUsed[ti.getCode()]) {
+    if (isUsed.get(ti.getCode())) {
       FsIndex_iicp<TOP> iicp = getIndexesForType(ti.getCode()).getNonSetIndex();  
       
+//      iicps4allFSs.add(iicp);
       if (null != iicp && !iicp.isEmpty()) {
         LowLevelIterator<T> it = (iicp.getIndexingStrategy() == FSIndex.SORTED_INDEX) 
                                     ? (LowLevelIterator<T>)iicp.iteratorUnordered()

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java?rev=1764717&r1=1764716&r2=1764717&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/LowLevelIndex.java Thu Oct 13 15:51:57 2016
@@ -121,28 +121,28 @@ public interface LowLevelIndex<T extends
   
   
   @Override
-  default SelectFSs<T> select() {
-    return getCasImpl().select().index(this);
+  default <N extends FeatureStructure> SelectFSs<N> select() {
+    return ((SelectFSs_impl)getCasImpl().select()).index(this);
   }
 
   @Override
   default <N extends FeatureStructure> SelectFSs<N> select(Type type) {
-    return select().type(type);
+    return ((SelectFSs_impl)select()).type(type);
   }
 
   @Override
   default <N extends FeatureStructure> SelectFSs<N> select(Class<N> clazz) {
-    return select().type(clazz);
+    return ((SelectFSs_impl)select()).type(clazz);
   }
 
   @Override
   default <N extends FeatureStructure> SelectFSs<N> select(int jcasType) {
-    return select().type(jcasType);
+    return ((SelectFSs_impl)select()).type(jcasType);
   }
 
   @Override
   default <N extends FeatureStructure> SelectFSs<N> select(String fullyQualifiedTypeName) {
-    return select().type(fullyQualifiedTypeName);
+    return ((SelectFSs_impl)select()).type(fullyQualifiedTypeName);
   }
   
 }

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java?rev=1764717&r1=1764716&r2=1764717&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java Thu Oct 13 15:51:57 2016
@@ -20,11 +20,13 @@
 package org.apache.uima.cas.impl;
 
 import java.lang.reflect.Array;
+import java.util.AbstractSequentialList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
+import java.util.ListIterator;
 import java.util.Optional;
 import java.util.Spliterator;
 import java.util.function.BiConsumer;
@@ -134,13 +136,12 @@ public class SelectFSs_impl <T extends F
    * INDEX
    * If not specified, defaults to all FSs (unordered) unless AnnotationIndex implied
    */
-  @Override
+
   public <N extends FeatureStructure> SelectFSs_impl<N> index(String indexName) {
     this.index = view.indexRepository.getIndex(indexName);
     return (SelectFSs_impl<N>) this;
   }
   
-  @Override
   public <N extends FeatureStructure> SelectFSs_impl<N> index(FSIndex<N> aIndex) {
     this.index = (FSIndex<T>) aIndex;
     return (SelectFSs_impl<N>) this;
@@ -150,22 +151,22 @@ public class SelectFSs_impl <T extends F
    * TYPE
    * if not specified defaults to the index's uppermost type.  
    */
-  @Override
+  
   public <N extends FeatureStructure> SelectFSs_impl<N> type(Type uimaType) {
     this.ti = (TypeImpl) uimaType;
     return (SelectFSs_impl<N>) this;
   }
-  @Override
+  
   public <N extends FeatureStructure> SelectFSs_impl<N> type(String fullyQualifiedTypeName) {
     this.ti = view.getTypeSystemImpl().getType(fullyQualifiedTypeName);
     return (SelectFSs_impl<N>) this;
   }
-  @Override
+
   public <N extends FeatureStructure> SelectFSs_impl<N> type(int jcasClass_dot_type) {
     this.ti = (TypeImpl) view.getJCas().getCasType(jcasClass_dot_type);
     return (SelectFSs_impl<N>) this;
   }
-  @Override
+
   public <N extends FeatureStructure> SelectFSs_impl<N> type(Class<N> jcasClass_dot_class) {
     this.ti = (TypeImpl) view.getJCasImpl().getCasType(jcasClass_dot_class);
     return (SelectFSs_impl<N>) this;
@@ -471,8 +472,7 @@ public class SelectFSs_impl <T extends F
         ti = (TypeImpl) index.getType();
       }
     } else {
-      if (index != null &&
-          ((TypeImpl)index.getType()).subsumes(ti)) {
+      if (index != null && ((TypeImpl)index.getType()).subsumes(ti)) {
         index = ((LowLevelIndex)index).getSubIndex(ti);
       }
     }
@@ -618,6 +618,8 @@ public class SelectFSs_impl <T extends F
       if (isAltSource) {
         return altSourceIterator();
       } else {
+        // idx is null after prepareTerminalOp has been called.
+        // guaranteed not annotationindex or any op that requires that
         return v.indexRepository.getAllIndexedFS(ti);
       }
     }
@@ -692,44 +694,52 @@ public class SelectFSs_impl <T extends F
   public Iterator<T> iterator() {
     return fsIterator();
   }
-  
-  
-  /**
-   * Initial simple impl, creates reified list
-   *   Better impl would be to use underlying fsIterator
-   * @return
-   */
+    
   @Override
-  public List<T> asList(Class<T> clazz) {
-    T[] a = asArray(clazz);
-    return Arrays.asList(a);
+  public <N extends T> List<N> asList() {
+    prepareTerminalOp();
+    
+    return new AbstractSequentialList<N>() {
+      
+      @Override
+      public ListIterator<N> listIterator(int index) {
+        return (ListIterator<N>) fsIterator();
+      }
+
+      @Override
+      public int size() {
+        return (index == null) ? -1 : index.size();
+      }
+      
+    };
   }
   
   /* (non-Javadoc)
    * @see org.apache.uima.cas.SelectFSs#asArray()
    */
   @Override
-  public T[] asArray(Class<T> clazz) {
+  public <N extends T> N[] asArray(Class<N> clazz) {
     return asArray(fsIterator(), clazz);
   }
 
-  private T[] asArray(FSIterator<T> it, Class<T> clazz) {
-    List<T> al = new ArrayList<>();
+  private <N extends T> N[] asArray(FSIterator<T> it, Class<N> clazz) {
+    List<N> al = asArray1(it);    
+    N[] r = (N[]) Array.newInstance(clazz, al.size());
+    return al.toArray(r);    
+  }
+  
+  private <N extends T> List<N> asArray1(FSIterator<T> it) {
+    List<N> al = new ArrayList<>();
     while (it.isValid()) {
-      al.add(it.getNvc());  // limit iterator might cause it to become invalid
+      al.add((N) it.getNvc());  // limit iterator might cause it to become invalid
       it.moveToNext();
     }    
-    T[] r = (T[]) Array.newInstance(clazz, al.size());
-    return al.toArray(r);    
+    return al;    
   }
   
   private FeatureStructure[] asArray(FSIterator<T> it) {
-    List<? super T> al = new ArrayList<>();
-    while (it.isValid()) {
-      al.add(it.getNvc());
-      it.moveToNext(); // limit iterator might cause it to become invalid
-    }    
-    FeatureStructure[] r = (FeatureStructure[]) Array.newInstance(FeatureStructure.class,  al.size());
+    List<? super T> al = asArray1(it);
+    FeatureStructure[] r = (FeatureStructure[]) Array.newInstance(FeatureStructure.class, al.size());
     return al.toArray(r);
   }
   
@@ -844,7 +854,7 @@ public class SelectFSs_impl <T extends F
     if (it.isValid()) {
       return it.getNvc();
     }
-    if ((!isDoSetTest || isNullOkSpecified) && !isNullOK) {
+    if ((!isDoSetTest || isNullOkSpecified) && !isNullOK) {  // if not specified, isNullOK == false
       throw new CASRuntimeException(CASRuntimeException.SELECT_GET_NO_INSTANCES, ti.getName(), maybeMsgPosition());
     }
     return null;