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 2017/09/01 12:52:48 UTC

svn commit: r1806955 - /uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasCompare.java

Author: schor
Date: Fri Sep  1 12:52:47 2017
New Revision: 1806955

URL: http://svn.apache.org/viewvc?rev=1806955&view=rev
Log:
no Jira - slight speedup of cas compare

Modified:
    uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasCompare.java

Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasCompare.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasCompare.java?rev=1806955&r1=1806954&r2=1806955&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasCompare.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/CasCompare.java Fri Sep  1 12:52:47 2017
@@ -280,7 +280,26 @@ public class CasCompare {
       return true;
     }    
   }
+
+  private static class FeatLists {
+    /**
+     * first index is easy, easyArrays, refs, refArrays
+     */
+    final FeatureImpl[][] featsByEase = new FeatureImpl[4][];
     
+    FeatLists(List<FeatureImpl> easy, 
+              List<FeatureImpl> easyArrays, 
+              List<FeatureImpl> refs, 
+              List<FeatureImpl> refArrays) {
+      featsByEase[0] = (FeatureImpl[]) easy.toArray(new FeatureImpl[easy.size()]);
+      featsByEase[1] = (FeatureImpl[]) easyArrays.toArray(new FeatureImpl[easyArrays.size()]);
+      featsByEase[2] = (FeatureImpl[]) refs.toArray(new FeatureImpl[refs.size()]);
+      featsByEase[3] = (FeatureImpl[]) refArrays.toArray(new FeatureImpl[refArrays.size()]);
+    }
+  }
+  
+  final private Map<TypeImpl, FeatLists> type2featLists = new HashMap<>();
+  
   final private CASImpl c1;
   final private CASImpl c2;
   final private TypeSystemImpl ts1;      
@@ -628,37 +647,20 @@ public class CasCompare {
       return compareFssArray(fs1, fs2, callerTi, callerFi);
     } 
 
-    // compare features, non-refs first (for performance)
-    List<FeatureImpl> featuresToCompareNext = new ArrayList<>();
-    
-    for (FeatureImpl fi1 : ti1.getFeatureImpls()) {
-      if (fi1.getRangeImpl().isRefType) {
-        featuresToCompareNext.add(fi1);
-      } else if (0 != (r = compareFeature(fs1, fs2, ti1, fi1))) {
-          return r;
-      }
+    FeatLists featLists = type2featLists.get(ti1);
+    if (featLists == null) {
+      type2featLists.put(ti1, featLists = computeFeatLists(ti1));
     }
-    
-    // compare non-fs arrays next
-    List<FeatureImpl> refFeatures = new ArrayList<>();
-    
-    for (FeatureImpl fi1 : featuresToCompareNext) {
-      TypeImpl ri = fi1.getRangeImpl();
-      if (ri.isPrimitiveArrayType() && ri != fsArrayType) {
+
+    // compare features, non-refs first (for performance)
+    for (FeatureImpl[] featSet : featLists.featsByEase) {
+      for (FeatureImpl fi1 : featSet) {
         if (0 != (r = compareFeature(fs1, fs2, ti1, fi1))) {
           return r;
         }
-      } else {
-        refFeatures.add(fi1);
-      }
-    }
-
-    for (FeatureImpl fi1 : refFeatures) {
-      if (0 != (r = compareFeature(fs1, fs2, ti1, fi1))) {
-        return r;
-      }
+      } 
     }
-    return 0; 
+    return 0;
   }
      
   private int compareFeature(TOP fs1, TOP fs2, TypeImpl ti1, FeatureImpl fi1) {
@@ -687,6 +689,54 @@ public class CasCompare {
     return r;
   }
   
+  /**
+   * called during sort phase
+   * @param ti - type being sorted
+   * @return the feature lists for that type
+   */
+  private FeatLists computeFeatLists(TypeImpl ti) {
+    List<FeatureImpl> easy = new ArrayList<>();  
+    List<FeatureImpl> easyArrays = new ArrayList<>();  
+    List<FeatureImpl> ref = new ArrayList<>();  
+    List<FeatureImpl> refArrays = new ArrayList<>();
+    
+    for (FeatureImpl fi : ti.getFeatureImpls()) {
+      
+      if (isTypeMapping) {
+
+        if (isSrcCas && typeMapper.getTgtFeature(ti, fi) == null) {
+          continue; // skip for features not in target type system
+                    // so when comparing CASs, the src value won't cause a miscompare
+        }
+        
+        // probably not executed, since types discovered on first sort
+        // except for a type that exists only the the target
+        if (!isSrcCas && typeMapper.getSrcFeature(ti,  fi) == null) {
+          continue; // types/features belong to target in this case
+        }
+        
+      }
+            
+      TypeImpl range = fi.getRangeImpl();
+      if (range.isArray()) {
+        TypeImpl_array ra = (TypeImpl_array)range;
+        if (ra.getComponentType().isRefType) {
+          refArrays.add(fi);
+        } else {
+          easyArrays.add(fi);
+        }
+      } else {
+        if (range.isRefType) {
+          ref.add(fi);
+        } else {
+          easy.add(fi);
+        }
+      }
+    }
+    return new FeatLists(easy, easyArrays, ref, refArrays);
+  }
+  
+  
 //    private int compareFssArray() {
 //      int r = compareFssArray((CommonArrayFS) fs1, (CommonArrayFS) fs2);
 //      if (r != 0) {