Author: pkluegl
Date: Sat Jun  8 18:01:10 2013
New Revision: 1491023

URL: http://svn.apache.org/r1491023
Log:
UIMA-2980
- added optional annotations, which will be filtered by rule match

Added:
    
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java
    
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java
Modified:
    
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
    
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
    
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java
    
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
    
uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml
    
uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml

Modified: 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1491023&r1=1491022&r2=1491023&view=diff
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
 (original)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
 Sat Jun  8 18:01:10 2013
@@ -199,10 +199,7 @@ public class RutaStream extends FSIterat
 
   public void addAnnotation(AnnotationFS annotation, boolean addToIndex,
           AbstractRuleMatch<? extends AbstractRule> creator) {
-    if (addToIndex) {
-      cas.addFsToIndexes(annotation);
-    }
-    addAnnotation(annotation, creator);
+    addAnnotation(annotation, true, true, creator);
   }
 
   public void addAnnotation(AnnotationFS annotation,
@@ -233,6 +230,7 @@ public class RutaStream extends FSIterat
     crowd.annotationAdded(annotation, creator);
   }
 
+
   private boolean checkSpan(AnnotationFS annotation) {
     boolean result = false;
     int begin = annotation.getBegin();

Modified: 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java?rev=1491023&r1=1491022&r2=1491023&view=diff
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
 (original)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
 Sat Jun  8 18:01:10 2013
@@ -85,6 +85,8 @@ public class RutaEngine extends JCasAnno
 
   public static final String BASIC_TYPE = 
"org.apache.uima.ruta.type.RutaBasic";
 
+  public static final String OPTIONAL_TYPE = 
"org.apache.uima.ruta.type.RutaOptional";
+  
   public static final String SEEDERS = "seeders";
 
   public static final String REMOVE_BASICS = "removeBasics";
@@ -131,6 +133,8 @@ public class RutaEngine extends JCasAnno
 
   public static final String SIMPLE_GREEDY_FOR_COMPOSED = 
"simpleGreedyForComposed";
 
+
+
   private String[] seeders;
 
   private Boolean createDebugInfo;

Modified: 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java?rev=1491023&r1=1491022&r2=1491023&view=diff
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java
 (original)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java
 Sat Jun  8 18:01:10 2013
@@ -32,6 +32,7 @@ import org.apache.uima.cas.text.Annotati
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.ScriptApply;
 import org.apache.uima.ruta.action.AbstractRutaAction;
+import org.apache.uima.ruta.engine.RutaEngine;
 
 public class RuleMatch extends AbstractRuleMatch<RutaRule> {
 
@@ -150,10 +151,16 @@ public class RuleMatch extends AbstractR
           for (RuleElementMatch ruleElementMatch : list2) {
             List<AnnotationFS> textsMatched = 
ruleElementMatch.getTextsMatched();
             if (textsMatched != null && !textsMatched.isEmpty()) {
-              begin = Math.min(textsMatched.get(0).getBegin(), begin);
-              end = Math.max(textsMatched.get(textsMatched.size() - 
1).getEnd(), end);
-              if (cas == null) {
-                cas = textsMatched.get(0).getCAS();
+              AnnotationFS first = getFirstNormal(textsMatched);
+              if (first != null) {
+                begin = Math.min(first.getBegin(), begin);
+              }
+              AnnotationFS last = getLastNormal(textsMatched);
+              if (last != null) {
+                end = Math.max(last.getEnd(), end);
+              }
+              if (cas == null && first != null) {
+                cas = first.getCAS();
               }
             }
           }
@@ -167,6 +174,34 @@ public class RuleMatch extends AbstractR
     return result;
   }
 
+  private AnnotationFS getFirstNormal(List<AnnotationFS> textsMatched) {
+    // hotfix for invisible dummy matches
+    int pointer = 0;
+    AnnotationFS annotationFS = null;
+    while (pointer < textsMatched.size() && (annotationFS = 
textsMatched.get(pointer)) != null
+            && 
annotationFS.getType().getName().equals(RutaEngine.OPTIONAL_TYPE)) {
+      pointer++;
+    }
+    if (pointer < textsMatched.size()) {
+      return annotationFS;
+    }
+    return null;
+  }
+
+  private AnnotationFS getLastNormal(List<AnnotationFS> textsMatched) {
+    // hotfix for invisible dummy matches
+    int pointer = textsMatched.size() - 1;
+    AnnotationFS annotationFS = null;
+    while (pointer >= 0 && (annotationFS = textsMatched.get(pointer)) != null
+            && 
annotationFS.getType().getName().equals(RutaEngine.OPTIONAL_TYPE)) {
+      pointer--;
+    }
+    if (pointer >= 0) {
+      return annotationFS;
+    }
+    return null;
+  }
+
   public static List<Integer> extendIndexes(List<Integer> indexes) {
     if (indexes == null || indexes.size() <= 1) {
       return indexes;

Modified: 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java?rev=1491023&r1=1491022&r2=1491023&view=diff
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
 (original)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
 Sat Jun  8 18:01:10 2013
@@ -36,6 +36,7 @@ import org.apache.uima.ruta.RutaBlock;
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.action.AbstractRutaAction;
 import org.apache.uima.ruta.condition.AbstractRutaCondition;
+import org.apache.uima.ruta.engine.RutaEngine;
 import org.apache.uima.ruta.expression.string.StringExpression;
 import org.apache.uima.ruta.type.RutaBasic;
 import org.apache.uima.ruta.type.RutaFrame;
@@ -443,23 +444,30 @@ public class WildCardRuleElement extends
       end = later.getBegin();
     }
 
+    int filteredBegin = begin;
+    int filteredEnd = end;
     RutaBasic beginAnchor = stream.getBeginAnchor(begin);
     RutaBasic endAnchor = stream.getEndAnchor(end);
     if (beginAnchor != null && !stream.isVisible(beginAnchor)) {
       beginAnchor = stream.getBasicNextTo(false, beginAnchor);
-      if(beginAnchor != null) {
-        begin = beginAnchor.getBegin();
+      if (beginAnchor != null) {
+        filteredBegin = beginAnchor.getBegin();
       }
     }
     if (endAnchor != null && !stream.isVisible(endAnchor)) {
       endAnchor = stream.getBasicNextTo(true, endAnchor);
-      if(endAnchor != null) {
-        end = endAnchor.getEnd();
+      if (endAnchor != null) {
+        filteredEnd = endAnchor.getEnd();
       }
     }
 
+    if(filteredBegin < filteredEnd) {
+      begin = filteredBegin;
+      end = filteredEnd;
+    } else {
+      type = cas.getTypeSystem().getType(RutaEngine.OPTIONAL_TYPE);
+    }
     AnnotationFS afs = cas.createAnnotation(type, begin, end);
-
     return afs;
   }
 

Added: 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java?rev=1491023&view=auto
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java
 (added)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional.java
 Sat Jun  8 18:01:10 2013
@@ -0,0 +1,65 @@
+
+
+/* First created by JCasGen Sat Jun 08 19:25:02 CEST 2013 */
+package org.apache.uima.ruta.type;
+
+import org.apache.uima.jcas.JCas; 
+import org.apache.uima.jcas.JCasRegistry;
+import org.apache.uima.jcas.cas.TOP_Type;
+
+import org.apache.uima.jcas.tcas.Annotation;
+
+
+/** 
+ * Updated by JCasGen Sat Jun 08 19:25:02 CEST 2013
+ * XML source: 
D:/work/workspace-tmb5/ruta/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml
+ * @generated */
+public class RutaOptional extends Annotation {
+  /** @generated
+   * @ordered 
+   */
+  @SuppressWarnings ("hiding")
+  public final static int typeIndexID = 
JCasRegistry.register(RutaOptional.class);
+  /** @generated
+   * @ordered 
+   */
+  @SuppressWarnings ("hiding")
+  public final static int type = typeIndexID;
+  /** @generated  */
+  @Override
+  public              int getTypeIndexID() {return typeIndexID;}
+ 
+  /** Never called.  Disable default constructor
+   * @generated */
+  protected RutaOptional() {/* intentionally empty block */}
+    
+  /** Internal - constructor used by generator 
+   * @generated */
+  public RutaOptional(int addr, TOP_Type type) {
+    super(addr, type);
+    readObject();
+  }
+  
+  /** @generated */
+  public RutaOptional(JCas jcas) {
+    super(jcas);
+    readObject();   
+  } 
+
+  /** @generated */  
+  public RutaOptional(JCas jcas, int begin, int end) {
+    super(jcas);
+    setBegin(begin);
+    setEnd(end);
+    readObject();
+  }   
+
+  /** <!-- begin-user-doc -->
+    * Write your own initialization here
+    * <!-- end-user-doc -->
+  @generated modifiable */
+  private void readObject() {/*default - does nothing empty block */}
+     
+}
+
+    
\ No newline at end of file

Added: 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java?rev=1491023&view=auto
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java
 (added)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/type/RutaOptional_Type.java
 Sat Jun  8 18:01:10 2013
@@ -0,0 +1,58 @@
+
+/* First created by JCasGen Sat Jun 08 19:25:02 CEST 2013 */
+package org.apache.uima.ruta.type;
+
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.JCasRegistry;
+import org.apache.uima.cas.impl.CASImpl;
+import org.apache.uima.cas.impl.FSGenerator;
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.impl.TypeImpl;
+import org.apache.uima.cas.Type;
+import org.apache.uima.jcas.tcas.Annotation_Type;
+
+/** 
+ * Updated by JCasGen Sat Jun 08 19:25:02 CEST 2013
+ * @generated */
+public class RutaOptional_Type extends Annotation_Type {
+  /** @generated */
+  @Override
+  protected FSGenerator getFSGenerator() {return fsGenerator;}
+  /** @generated */
+  private final FSGenerator fsGenerator = 
+    new FSGenerator() {
+      public FeatureStructure createFS(int addr, CASImpl cas) {
+                        if (RutaOptional_Type.this.useExistingInstance) {
+                          // Return eq fs instance if already created
+                    FeatureStructure fs = 
RutaOptional_Type.this.jcas.getJfsFromCaddr(addr);
+                    if (null == fs) {
+                      fs = new RutaOptional(addr, RutaOptional_Type.this);
+                          RutaOptional_Type.this.jcas.putJfsFromCaddr(addr, 
fs);
+                          return fs;
+                    }
+                    return fs;
+        } else return new RutaOptional(addr, RutaOptional_Type.this);
+         }
+    };
+  /** @generated */
+  @SuppressWarnings ("hiding")
+  public final static int typeIndexID = RutaOptional.typeIndexID;
+  /** @generated 
+     @modifiable */
+  @SuppressWarnings ("hiding")
+  public final static boolean featOkTst = 
JCasRegistry.getFeatOkTst("org.apache.uima.ruta.type.RutaOptional");
+
+
+
+  /** initialize variables to correspond with Cas Type and Features
+       * @generated */
+  public RutaOptional_Type(JCas jcas, Type casType) {
+    super(jcas, casType);
+    casImpl.getFSClassRegistry().addGeneratorForType((TypeImpl)this.casType, 
getFSGenerator());
+
+  }
+}
+
+
+
+    
\ No newline at end of file

Modified: 
uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml?rev=1491023&r1=1491022&r2=1491023&view=diff
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml
 (original)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/main/resources/org/apache/uima/ruta/engine/InternalTypeSystem.xml
 Sat Jun  8 18:01:10 2013
@@ -37,6 +37,11 @@
       </features>
     </typeDescription>
     <typeDescription>
+      <name>org.apache.uima.ruta.type.RutaOptional</name>
+      <description/>
+      <supertypeName>uima.tcas.Annotation</supertypeName>
+    </typeDescription>
+    <typeDescription>
       <name>org.apache.uima.ruta.type.RutaAnnotation</name>
       <description/>
       <supertypeName>uima.tcas.Annotation</supertypeName>

Modified: 
uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml
URL: 
http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml?rev=1491023&r1=1491022&r2=1491023&view=diff
==============================================================================
--- 
uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml
 (original)
+++ 
uima/sandbox/ruta/trunk/ruta-core/src/test/resources/org/apache/uima/ruta/InternalTypeSystem.xml
 Sat Jun  8 18:01:10 2013
@@ -37,6 +37,11 @@
       </features>
     </typeDescription>
     <typeDescription>
+      <name>org.apache.uima.ruta.type.RutaOptional</name>
+      <description/>
+      <supertypeName>uima.tcas.Annotation</supertypeName>
+    </typeDescription>
+    <typeDescription>
       <name>org.apache.uima.ruta.type.RutaAnnotation</name>
       <description/>
       <supertypeName>uima.tcas.Annotation</supertypeName>


Reply via email to