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{-> 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. Definition:"><div class="titlepage"><div><div><h4 class="title" id="d5e2257">2.8.42.1.
+ <div class="section" title="2.8.42.1. Definition:"><div class="titlepage"><div><div><h4 class="title" id="d5e2259">2.8.42.1.
<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. Example:"><div class="titlepage"><div><div><h4 class="title" id="d5e2264">2.8.42.2.
+ <div class="section" title="2.8.42.2. Example:"><div class="titlepage"><div><div><h4 class="title" id="d5e2267">2.8.42.2.
<span class="bold"><strong>Example:</strong></span>
</h4></div></div></div>
@@ -1409,6 +1410,12 @@ Document{-> MARKTABLE(Struct, 1, Test
<p>
Here, all Headline annotations are removed that start with a capitalized word.
</p>
+ <p>
+ </p><pre class="programlisting">Complex{->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
+ )
;