You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by pk...@apache.org on 2016/08/01 14:33:04 UTC

svn commit: r1754758 - in /uima/ruta/trunk: ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/ ruta-core/src/main/java/org/apache/uima/ruta/ ruta-core/src/main/java/org/apache/uima/ruta/action/ ruta-core/src/main/java/org/apache/uima/ruta/expressio...

Author: pkluegl
Date: Mon Aug  1 14:33:04 2016
New Revision: 1754758

URL: http://svn.apache.org/viewvc?rev=1754758&view=rev
Log:
UIMA-5033
- allow annotation expression and feature match expression in UNMARK
- added test
- mentioned in documentation

Modified:
    uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/UnmarkAction.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/UnmarkTest.java
    uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml
    uima/ruta/trunk/ruta-ep-ide-ui/src/main/resources/org/apache/uima/ruta/ide/ui/documentation/Actions.html
    uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g

Modified: uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g Mon Aug  1 14:33:04 2016
@@ -2141,7 +2141,9 @@ List<INumberExpression> list = new Array
     :
     name = UNMARK LPAREN 
     
-    f = typeExpression 
+    (
+    
+    (typeExpression COMMA)=>f = typeExpression 
 
     (COMMA 
     (
@@ -2151,12 +2153,14 @@ List<INumberExpression> list = new Array
   	index = numberExpression {list.add(index);} 
   	(COMMA index = numberExpression {list.add(index);})*
   	)
+    ) 
     )
-      
-    )?
-
      RPAREN
     {action = ActionFactory.createUnmarkAction(f, list, b,$blockDeclaration::env);}
+    |
+    (annotationOrTypeExpression)=>a = annotationOrTypeExpression RPAREN {action = ActionFactory.createUnmarkAction(a, $blockDeclaration::env);}
+    
+    )
     ;
 
 

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Mon Aug  1 14:33:04 2016
@@ -1196,6 +1196,9 @@ public class RutaStream extends FSIterat
 
   public List<AnnotationFS> getBestGuessedAnnotationsAt(AnnotationFS window, Type type) {
     List<AnnotationFS> result = new ArrayList<AnnotationFS>();
+    if(window == null) {
+      return result;
+    }
     TypeSystem typeSystem = getCas().getTypeSystem();
     if (typeSystem.subsumes(type, window.getType())) {
       result.add(window);

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/ActionFactory.java Mon Aug  1 14:33:04 2016
@@ -27,6 +27,7 @@ import java.util.logging.Level;
 import org.antlr.runtime.Token;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.uima.ruta.block.RutaBlock;
+import org.apache.uima.ruta.expression.AnnotationTypeExpression;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
 import org.apache.uima.ruta.expression.feature.FeatureMatchExpression;
@@ -162,6 +163,14 @@ public class ActionFactory {
     return new UnmarkAction(f, list, b);
   }
 
+  public static AbstractRutaAction createUnmarkAction(IRutaExpression a, RutaBlock env) {
+    if(a instanceof AnnotationTypeExpression) {
+      return new UnmarkAction((AnnotationTypeExpression) a);
+    }
+    throw new IllegalArgumentException("Expression " + a + " is nto a valid argument for UNMARK.");
+  }
+  
+  
   public static AbstractRutaAction createUnmarkAllAction(ITypeExpression f,
           AbstractTypeListExpression list, RutaBlock env) {
     return new UnmarkAllAction(f, list);
@@ -313,4 +322,6 @@ public class ActionFactory {
     return new MacroAction(name, definition, actions, vars, args);
   }
 
+  
+
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/UnmarkAction.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/UnmarkAction.java?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/UnmarkAction.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/action/UnmarkAction.java Mon Aug  1 14:33:04 2016
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.ruta.RutaStream;
+import org.apache.uima.ruta.expression.AnnotationTypeExpression;
 import org.apache.uima.ruta.expression.bool.IBooleanExpression;
 import org.apache.uima.ruta.expression.number.INumberExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
@@ -41,17 +42,43 @@ public class UnmarkAction extends TypeSe
 
   private IBooleanExpression allAnchor;
 
+  private AnnotationTypeExpression expression;
+
   public UnmarkAction(ITypeExpression type, List<INumberExpression> list, IBooleanExpression b) {
     super(type);
     this.list = list;
     this.allAnchor = b;
   }
 
+  public UnmarkAction(AnnotationTypeExpression expression) {
+    super(null);
+    this.expression = expression;
+  }
+
   @Override
   public void execute(MatchContext context, RutaStream stream, InferenceCrowd crowd) {
     RuleMatch match = context.getRuleMatch();
     RuleElement element = context.getElement();
-    Type t = type.getType(context, stream);
+
+    if (expression != null) {
+      List<AnnotationFS> annotationList = expression.getAnnotationList(context, stream);
+      if(expression.getTypeExpression() != null && expression.getFeatureExpression() == null && expression.getAnnotationExpression() == null && expression.getAnnotationListExpression()== null) {
+        // type-based like old behavior
+        Type t = expression.getTypeExpression().getType(context, stream);
+        removeTypeBased(context, stream, match, element, t);
+      } else {
+      for (AnnotationFS annotationFS : annotationList) {
+        stream.removeAnnotation(annotationFS);
+      }
+      }
+    } else {
+      Type t = type.getType(context, stream);
+      removeTypeBased(context, stream, match, element, t);
+    }
+  }
+
+  private void removeTypeBased(MatchContext context, RutaStream stream, RuleMatch match,
+          RuleElement element, Type t) {
     boolean allAtAnchor = false;
     if (allAnchor != null) {
       allAtAnchor = allAnchor.getBooleanValue(context, stream);
@@ -77,7 +104,6 @@ public class UnmarkAction extends TypeSe
       }
 
     }
-
   }
 
   public List<INumberExpression> getList() {
@@ -108,4 +134,9 @@ public class UnmarkAction extends TypeSe
     }
     return indexList;
   }
+
+  public AnnotationTypeExpression getExpression() {
+    return expression;
+  }
+
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java Mon Aug  1 14:33:04 2016
@@ -20,6 +20,7 @@
 package org.apache.uima.ruta.expression;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.uima.cas.Type;
@@ -27,11 +28,12 @@ import org.apache.uima.cas.text.Annotati
 import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.expression.annotation.IAnnotationExpression;
 import org.apache.uima.ruta.expression.annotation.IAnnotationListExpression;
+import org.apache.uima.ruta.expression.feature.FeatureExpression;
 import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
-public class AnnotationTypeExpression extends RutaExpression implements ITypeExpression,
-        IAnnotationExpression, IAnnotationListExpression {
+public class AnnotationTypeExpression extends RutaExpression
+        implements ITypeExpression, IAnnotationExpression, IAnnotationListExpression {
 
   private MatchReference reference;
 
@@ -41,6 +43,8 @@ public class AnnotationTypeExpression ex
 
   private IAnnotationListExpression annotationListExpression;
 
+  private FeatureExpression featureExpression;
+
   private boolean initialized = false;
 
   public AnnotationTypeExpression(MatchReference reference) {
@@ -51,6 +55,7 @@ public class AnnotationTypeExpression ex
   private void initialize(MatchContext context, RutaStream stream) {
     annotationExpression = reference.getAnnotationExpression(context, stream);
     annotationListExpression = reference.getAnnotationListExpression(context, stream);
+    featureExpression = reference.getFeatureExpression(context, stream);
     typeExpression = reference.getTypeExpression(context, stream);
     initialized = true;
   }
@@ -69,7 +74,19 @@ public class AnnotationTypeExpression ex
     } else {
       Type type = getType(context, stream);
       if (type != null) {
-        return stream.getSingleAnnotationByTypeInContext(type, context);
+        if (getFeatureExpression() != null) {
+          List<AnnotationFS> bestGuessedAnnotationsAt = stream
+                  .getBestGuessedAnnotationsAt(context.getAnnotation(), type);
+          Collection<AnnotationFS> annotations = new ArrayList<>();
+          annotations.addAll(bestGuessedAnnotationsAt);
+          Collection<AnnotationFS> featureAnnotations = getFeatureExpression()
+                  .getFeatureAnnotations(annotations, stream, context, false);
+          if (featureAnnotations != null && !featureAnnotations.isEmpty()) {
+            return featureAnnotations.iterator().next();
+          }
+        } else {
+          return stream.getSingleAnnotationByTypeInContext(type, context);
+        }
       }
     }
     return null;
@@ -115,9 +132,18 @@ public class AnnotationTypeExpression ex
       result.add(annotationExpression.getAnnotation(context, stream));
       return result;
     } else {
+
       Type type = getType(context, stream);
       if (type != null) {
-        return stream.getAnnotationsByTypeInContext(type, context);
+        if (getFeatureExpression() != null) {
+          List<AnnotationFS> bestGuessedAnnotationsAt = stream
+                  .getBestGuessedAnnotationsAt(context.getAnnotation(), type);
+          Collection<AnnotationFS> featureAnnotations = getFeatureExpression()
+                  .getFeatureAnnotations(bestGuessedAnnotationsAt, stream, context, false);
+          return new ArrayList<>(featureAnnotations);
+        } else {
+          return stream.getAnnotationsByTypeInContext(type, context);
+        }
       }
     }
     return null;
@@ -131,4 +157,21 @@ public class AnnotationTypeExpression ex
     this.reference = reference;
   }
 
+  public ITypeExpression getTypeExpression() {
+    return typeExpression;
+  }
+
+  public IAnnotationExpression getAnnotationExpression() {
+    return annotationExpression;
+  }
+
+  public IAnnotationListExpression getAnnotationListExpression() {
+    return annotationListExpression;
+  }
+
+  public FeatureExpression getFeatureExpression() {
+    return featureExpression;
+  }
+
+
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ActionVerbalizer.java Mon Aug  1 14:33:04 2016
@@ -373,6 +373,11 @@ public class ActionVerbalizer {
               + ")";
     } else if (action instanceof UnmarkAction) {
       UnmarkAction a = (UnmarkAction) action;
+      
+      if(a.getExpression()!= null) {
+        return name + verbalizer.verbalize(a.getExpression()) + ")";
+      }
+      
       if (a.getAllAnchor() == null) {
         if (a.getList() == null) {
           return name + verbalizer.verbalize(a.getType()) + ")";

Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/UnmarkTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/UnmarkTest.java?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/UnmarkTest.java (original)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/action/UnmarkTest.java Mon Aug  1 14:33:04 2016
@@ -19,8 +19,15 @@
 
 package org.apache.uima.ruta.action;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
 import org.apache.uima.cas.CAS;
+import org.apache.uima.ruta.engine.Ruta;
 import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;
 import org.junit.Test;
 
 public class UnmarkTest {
@@ -36,4 +43,45 @@ public class UnmarkTest {
 
     cas.release();
   }
+  
+  
+  @Test
+  public void testAnnotationExpression() throws Exception {
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    typeMap.put("Complex", "uima.tcas.Annotation");
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put("Complex", list);
+    list.add(new TestFeature("inner", "", "uima.tcas.Annotation"));
+    
+    CAS cas = RutaTestUtils.getCAS("This is a test.", typeMap, featureMap);
+    String script = "";
+    script += "CW{->T1};t:T1 SW SW{-> UNMARK(t)};";
+    script += "CW{->T2};\n t:T2 # PERIOD{-> Complex, Complex.inner=t};\n Complex{-> UNMARK(Complex.inner)};\n";
+    Ruta.apply(cas, script);
+    
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 0);
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 0);
+    
+  }
+  
+  @Test
+  public void testAnnotationListExpression()  throws Exception {
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    typeMap.put("Complex", "uima.tcas.Annotation");
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put("Complex", list);
+    list.add(new TestFeature("inner", "", "uima.cas.FSArray"));
+    
+    CAS cas = RutaTestUtils.getCAS("This is a test.", typeMap, featureMap);
+    String script = "";
+    script += "W{->T1}; Document{-> Complex, Complex.inner = T1};";
+    script += "Complex{-> UNMARK(Complex.inner)};\n";
+    Ruta.apply(cas, script);
+    
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 0);
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 0);
+  }
+  
 }

Modified: uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml (original)
+++ uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.language.actions.xml Mon Aug  1 14:33:04 2016
@@ -1445,6 +1445,7 @@ Document{-> MARKTABLE(Struct, 1, TestTab
         <emphasis role="bold">Definition:</emphasis>
       </title>
       <para>
+        <programlisting><![CDATA[UNMARK(AnnotationExpression)]]></programlisting>
         <programlisting><![CDATA[UNMARK(TypeExpression)]]></programlisting>
         <programlisting><![CDATA[UNMARK(TypeExpression (,NumberExpression)*)]]></programlisting>
         <programlisting><![CDATA[UNMARK(TypeExpression, BooleanExpression)]]></programlisting>
@@ -1472,6 +1473,12 @@ Document{-> MARKTABLE(Struct, 1, TestTab
       <para>
         Here, all Headline annotations are removed that start with a capitalized word.
       </para>
+      <para>
+        <programlisting><![CDATA[Complex{->UNMARK(Complex.inner)};]]></programlisting>
+      </para>
+      <para>
+        Here, the annotation stored in the feature <code>inner</code> will be removed.
+      </para>
     </section>
   </section>
 

Modified: uima/ruta/trunk/ruta-ep-ide-ui/src/main/resources/org/apache/uima/ruta/ide/ui/documentation/Actions.html
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide-ui/src/main/resources/org/apache/uima/ruta/ide/ui/documentation/Actions.html?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide-ui/src/main/resources/org/apache/uima/ruta/ide/ui/documentation/Actions.html (original)
+++ uima/ruta/trunk/ruta-ep-ide-ui/src/main/resources/org/apache/uima/ruta/ide/ui/documentation/Actions.html Mon Aug  1 14:33:04 2016
@@ -1377,17 +1377,18 @@ Document{-&gt; MARKTABLE(Struct, 1, Test
       If instead a boolean is given as an additional argument, then all annotations of the given type are removed
       that start at the matched position.
     </p>
-    <div class="section" title="2.8.42.1.&nbsp; Definition:"><div class="titlepage"><div><div><h4 class="title" id="d5e2257">2.8.42.1.&nbsp;
+    <div class="section" title="2.8.42.1.&nbsp; Definition:"><div class="titlepage"><div><div><h4 class="title" id="d5e2259">2.8.42.1.&nbsp;
         <span class="bold"><strong>Definition:</strong></span>
       </h4></div></div></div>
       
       <p>
+        </p><pre class="programlisting">UNMARK(AnnotationExpression)</pre><p>
         </p><pre class="programlisting">UNMARK(TypeExpression)</pre><p>
         </p><pre class="programlisting">UNMARK(TypeExpression (,NumberExpression)*)</pre><p>
         </p><pre class="programlisting">UNMARK(TypeExpression, BooleanExpression)</pre><p>
       </p>
     </div>
-    <div class="section" title="2.8.42.2.&nbsp; Example:"><div class="titlepage"><div><div><h4 class="title" id="d5e2264">2.8.42.2.&nbsp;
+    <div class="section" title="2.8.42.2.&nbsp; Example:"><div class="titlepage"><div><div><h4 class="title" id="d5e2267">2.8.42.2.&nbsp;
         <span class="bold"><strong>Example:</strong></span>
       </h4></div></div></div>
       
@@ -1409,6 +1410,12 @@ Document{-&gt; MARKTABLE(Struct, 1, Test
       <p>
         Here, all Headline annotations are removed that start with a capitalized word.
       </p>
+      <p>
+        </p><pre class="programlisting">Complex{-&gt;UNMARK(Complex.inner)};</pre><p>
+      </p>
+      <p>
+        Here, the annotation stored in the feature <code class="code">inner</code> will be removed.
+      </p>
     </div>
   </div>
 

Modified: uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1754758&r1=1754757&r2=1754758&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original)
+++ uima/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Mon Aug  1 14:33:04 2016
@@ -2080,7 +2080,10 @@ actionUnmark returns [RutaAction action
 List<Expression> list = new ArrayList<Expression>();
 }
     :
-    name = UNMARK LPAREN f = typeExpression
+    name = UNMARK LPAREN (
+   
+    
+    f = typeExpression
     {action = ActionFactory.createAction(name, f);}
     
     (COMMA 
@@ -2099,6 +2102,7 @@ List<Expression> list = new ArrayList<Ex
     )?
     {action = ActionFactory.createAction(name, f , b, list);}
      RPAREN
+     )
     ;