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/26 15:12:25 UTC
svn commit: r1757875 - in /uima/ruta/trunk/ruta-core/src:
main/java/org/apache/uima/ruta/ main/java/org/apache/uima/ruta/expression/
main/java/org/apache/uima/ruta/expression/annotation/
main/java/org/apache/uima/ruta/expression/feature/ main/java/org/...
Author: pkluegl
Date: Fri Aug 26 15:12:25 2016
New Revision: 1757875
URL: http://svn.apache.org/viewvc?rev=1757875&view=rev
Log:
UIMA-4851
- preparations for labels as local variables
Modified:
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.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/expression/MatchReference.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpression.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/LazyFeature.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/AbstractRuleElement.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleElement.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRule.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaEnvironment.java Fri Aug 26 15:12:25 2016
@@ -77,6 +77,8 @@ import org.apache.uima.ruta.resource.Rut
import org.apache.uima.ruta.resource.RutaWordList;
import org.apache.uima.ruta.resource.TreeWordList;
import org.apache.uima.ruta.rule.MatchContext;
+import org.apache.uima.ruta.rule.RuleElement;
+import org.apache.uima.ruta.rule.RuleMatch;
import org.apache.uima.ruta.verbalize.RutaVerbalizer;
import org.apache.uima.util.InvalidXMLException;
import org.springframework.core.io.Resource;
@@ -210,7 +212,7 @@ public class RutaEnvironment {
availableTypes.put("ACTION", AbstractRutaAction.class);
availableTypes.put("WORDLIST", RutaWordList.class);
availableTypes.put("WORDTABLE", RutaTable.class);
- availableTypes.put("ANNOTATIONLIST", List.class);
+ availableTypes.put(RutaConstants.RUTA_VARIABLE_ANNOTATION_LIST, List.class);
availableTypes.put("BOOLEANLIST", List.class);
availableTypes.put("INTLIST", List.class);
availableTypes.put("DOUBLELIST", List.class);
@@ -218,7 +220,7 @@ public class RutaEnvironment {
availableTypes.put("STRINGLIST", List.class);
availableTypes.put("TYPELIST", List.class);
availableListTypes = new HashMap<String, Class<?>>();
- availableListTypes.put("ANNOTATIONLIST", AnnotationFS.class);
+ availableListTypes.put(RutaConstants.RUTA_VARIABLE_ANNOTATION_LIST, AnnotationFS.class);
availableListTypes.put("BOOLEANLIST", Boolean.class);
availableListTypes.put("INTLIST", Integer.class);
availableListTypes.put("DOUBLELIST", Double.class);
@@ -1088,4 +1090,41 @@ public class RutaEnvironment {
return namespaces;
}
+// public void addAnnotationToVariable(AnnotationFS annotation, String var, RutaStream stream) {
+// Class<?> variableType = getVariableType(var);
+// if(List.class.equals(variableType) && AnnotationFS.class.equals(getVariableGenericType(var))) {
+// @SuppressWarnings("unchecked")
+// List<AnnotationFS> value = getVariableValue(var, List.class, stream);
+// if(value == null) {
+// value = new ArrayList<>();
+// setVariableValue(var, value);
+// }
+// value.add(annotation);
+// } else if(AnnotationFS.class.equals(variableType)) {
+// setVariableValue(var, annotation);
+// }
+// }
+
+ public void addMatchToVariable(RuleMatch ruleMatch, RuleElement element, MatchContext context, RutaStream stream) {
+ String var = element.getLabel();
+ if(StringUtils.isBlank(var)) {
+ return;
+ }
+ List<AnnotationFS> annotations = ruleMatch.getMatchedAnnotationsOfElement(element);
+ Class<?> variableType = getVariableType(var);
+ if(List.class.equals(variableType) && AnnotationFS.class.equals(getVariableGenericType(var))) {
+ setVariableValue(var, annotations);
+ } else if(AnnotationFS.class.equals(variableType)) {
+ if(context.getDirection()) {
+ AnnotationFS annotation = null;
+ if(context.getDirection()) {
+ annotation = annotations.get(annotations.size()-1);
+ } else {
+ annotation = annotations.get(0);
+ }
+ setVariableValue(var, annotation);
+ }
+ }
+ }
+
}
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=1757875&r1=1757874&r2=1757875&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 Fri Aug 26 15:12:25 2016
@@ -69,8 +69,13 @@ public class AnnotationTypeExpression ex
return annotationExpression.getAnnotation(context, stream);
} else if (annotationListExpression != null) {
List<AnnotationFS> annotations = annotationListExpression.getAnnotationList(context, stream);
- if (annotations != null && !annotations.isEmpty())
- return annotations.get(0);
+ if (annotations != null && !annotations.isEmpty()) {
+ if(context.getDirection()) {
+ return annotations.get(annotations.size()-1);
+ } else {
+ return annotations.get(0);
+ }
+ }
} else {
Type type = getType(context, stream);
if (type != null) {
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java Fri Aug 26 15:12:25 2016
@@ -27,8 +27,6 @@ import org.apache.uima.ruta.RutaConstant
import org.apache.uima.ruta.RutaEnvironment;
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.block.RutaBlock;
-import org.apache.uima.ruta.expression.annotation.AnnotationLabelExpression;
-import org.apache.uima.ruta.expression.annotation.AnnotationListLabelExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationListVariableExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationListVariableIndexExpression;
import org.apache.uima.ruta.expression.annotation.AnnotationVariableExpression;
@@ -40,8 +38,6 @@ import org.apache.uima.ruta.expression.t
import org.apache.uima.ruta.expression.type.SimpleTypeExpression;
import org.apache.uima.ruta.expression.type.TypeVariableExpression;
import org.apache.uima.ruta.rule.MatchContext;
-import org.apache.uima.ruta.rule.RuleElement;
-import org.apache.uima.ruta.rule.RuleMatch;
import org.apache.uima.ruta.utils.IndexedReference;
import org.apache.uima.ruta.utils.ParsingUtils;
@@ -115,7 +111,6 @@ public class MatchReference extends Ruta
}
} else {
-
if (e.isVariableOfType(candidate, RutaConstants.RUTA_VARIABLE_TYPE)) {
typeExpression = new TypeVariableExpression(candidate);
return true;
@@ -128,14 +123,6 @@ public class MatchReference extends Ruta
} else if (e.getType(candidate) != null) {
typeExpression = new SimpleTypeExpression(candidate);
return true;
- } else if (context.getRuleMatch() != null) {
- RuleMatch ruleMatch = context.getRuleMatch();
- RuleElement ruleElementWithLabel = ruleMatch.getRule().getRuleElementWithLabel(candidate);
- if (ruleElementWithLabel != null) {
- annotationExpression = new AnnotationLabelExpression(candidate);
- annotationListExpression = new AnnotationListLabelExpression(candidate);
- return true;
- }
}
}
return false;
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpression.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpression.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpression.java Fri Aug 26 15:12:25 2016
@@ -24,7 +24,6 @@ import java.util.List;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.rule.MatchContext;
-import org.apache.uima.ruta.rule.RuleMatch;
/**
* An expression referring to an annotation matched by a rule element identified by a label.
@@ -42,10 +41,9 @@ private String label;
@Override
public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
- RuleMatch ruleMatch = context.getRuleMatch();
- List<AnnotationFS> annotations = ruleMatch.getMatchedAnnotationsOfLabel(label);
+ @SuppressWarnings("unchecked")
+ List<AnnotationFS> annotations = context.getParent().getEnvironment().getVariableValue(label, List.class, stream);
AnnotationFS annotation = null;
- // TODO which one to return?
if(annotations != null && !annotations.isEmpty()) {
if(context.getDirection()) {
annotation = annotations.get(annotations.size()-1);
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListLabelExpression.java Fri Aug 26 15:12:25 2016
@@ -24,7 +24,6 @@ import java.util.List;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.rule.MatchContext;
-import org.apache.uima.ruta.rule.RuleMatch;
/**
* An expression referring to an annotation matched by a rule element identified by a label.
@@ -39,11 +38,10 @@ private String label;
this.label = label;
}
+ @SuppressWarnings("unchecked")
@Override
public List<AnnotationFS> getList(MatchContext context, RutaStream stream) {
- RuleMatch ruleMatch = context.getRuleMatch();
- List<AnnotationFS> annotations = ruleMatch.getMatchedAnnotationsOfLabel(label);
- return annotations;
+ return context.getParent().getEnvironment().getVariableValue(label, List.class, stream);
}
public String getLabel() {
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/LazyFeature.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/LazyFeature.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/LazyFeature.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/LazyFeature.java Fri Aug 26 15:12:25 2016
@@ -77,4 +77,9 @@ public class LazyFeature implements Feat
return delegate.isMultipleReferencesAllowed();
}
+ public String getFeatureName() {
+ return featureName;
+ }
+
+
}
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/SimpleFeatureExpression.java Fri Aug 26 15:12:25 2016
@@ -58,7 +58,7 @@ public class SimpleFeatureExpression ext
Feature feature = features.get(features.size() - 1);
if (feature instanceof LazyFeature) {
LazyFeature lazyFeature = (LazyFeature) feature;
- lazyFeature.initialize(context.getAnnotation());
+ feature = lazyFeature.initialize(context.getAnnotation());
}
return feature;
} else {
@@ -120,7 +120,21 @@ public class SimpleFeatureExpression ext
if (annotation != null) {
return annotation.getType();
}
- }
+ }
+// else {
+// IAnnotationListExpression annotationListExpression = mr.getAnnotationListExpression(context, stream);
+// if (annotationListExpression != null) {
+// CAS cas = stream.getCas();
+// TypeSystem typeSystem = cas.getTypeSystem();
+// typeSystem.
+// Type mostGeneralType = null;
+// cas.g
+// List<AnnotationFS> annotationList = annotationListExpression.getAnnotationList(context, stream);
+// for (AnnotationFS annotationFS : annotationList) {
+//
+// }
+// }
+// }
}
return null;
}
@@ -167,8 +181,7 @@ public class SimpleFeatureExpression ext
LazyFeature lazyFeature = (LazyFeature) currentFeature;
Feature delegate = lazyFeature.initialize(annotation);
if (delegate == null) {
- // invalid feature
- return;
+ throw new RuntimeException("Invalid feature! Feature '"+lazyFeature.getFeatureName()+"' is not defined for type '"+annotation.getType()+"'.");
} else {
currentFeature = delegate;
}
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/AbstractRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/AbstractRuleElement.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/AbstractRuleElement.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/AbstractRuleElement.java Fri Aug 26 15:12:25 2016
@@ -126,6 +126,7 @@ public abstract class AbstractRuleElemen
return result;
}
+ @Override
public void apply(RuleMatch ruleMatch, RutaStream stream, InferenceCrowd crowd) {
for (AbstractRutaAction action : actions) {
crowd.beginVisit(action, null);
@@ -163,11 +164,13 @@ public abstract class AbstractRuleElemen
return matchInfo;
}
+ @Override
public List<RuleElementMatch> evaluateMatches(List<RuleElementMatch> matches,
MatchContext context, RutaStream stream) {
return quantifier.evaluateMatches(matches, context, stream, emptyCrowd);
}
+ @Override
public List<Integer> getSelfIndexList() {
List<Integer> result = new ArrayList<Integer>(1);
if (getContainer() == null) {
@@ -178,6 +181,7 @@ public abstract class AbstractRuleElemen
return result;
}
+ @Override
public boolean hasAncestor(boolean after) {
RuleElementContainer c = getContainer();
if (c == null) {
@@ -232,14 +236,17 @@ public abstract class AbstractRuleElemen
return false;
}
+ @Override
public RuleElementQuantifier getQuantifier() {
return quantifier;
}
+ @Override
public RutaBlock getParent() {
return parent;
}
+ @Override
public List<AbstractRutaCondition> getConditions() {
return conditions;
}
@@ -248,6 +255,7 @@ public abstract class AbstractRuleElemen
this.conditions = conditions;
}
+ @Override
public List<AbstractRutaAction> getActions() {
return actions;
}
@@ -260,46 +268,57 @@ public abstract class AbstractRuleElemen
this.quantifier = quantifier;
}
+ @Override
public RutaRule getRule() {
return container.getRule();
}
+ @Override
public RuleElementContainer getContainer() {
return container;
}
+ @Override
public void setContainer(RuleElementContainer container) {
this.container = container;
}
+ @Override
public void setStartAnchor(boolean start) {
this.startAnchor = start;
}
+ @Override
public boolean isStartAnchor() {
return startAnchor;
}
+ @Override
public String getLabel() {
return label;
}
+ @Override
public void setLabel(String label) {
this.label = label;
}
+ @Override
public void setInlinedConditionRules(List<RutaStatement> innerRules) {
this.inlinedConditionRules = innerRules;
}
+ @Override
public List<RutaStatement> getInlinedConditionRules() {
return inlinedConditionRules;
}
+ @Override
public void setInlinedActionRules(List<RutaStatement> innerRules) {
this.inlinedActionRules = innerRules;
}
+ @Override
public List<RutaStatement> getInlinedActionRules() {
return inlinedActionRules;
}
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java Fri Aug 26 15:12:25 2016
@@ -545,7 +545,8 @@ public class ComposedRuleElement extends
begin, end);
MatchContext context = new MatchContext(annotation, this, ruleMatch, after);
-
+ context.getParent().getEnvironment().addMatchToVariable(ruleMatch, this, context, stream);
+
List<EvaluatedCondition> evaluatedConditions = new ArrayList<EvaluatedCondition>(
conditions.size());
for (AbstractRutaCondition condition : conditions) {
@@ -553,6 +554,9 @@ public class ComposedRuleElement extends
EvaluatedCondition eval = condition.eval(context, stream, crowd);
crowd.endVisit(condition, null);
evaluatedConditions.add(eval);
+ if(!eval.isValue()) {
+ break;
+ }
}
match.setConditionInfo(evaluatedConditions);
match.evaluateInnerMatches(true, stream);
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleElement.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleElement.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleElement.java Fri Aug 26 15:12:25 2016
@@ -85,5 +85,9 @@ public interface RuleElement {
void setLabel(String label);
String getLabel();
+
+ List<RutaStatement> getInlinedConditionRules();
+
+ List<RutaStatement> getInlinedActionRules();
}
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleMatch.java Fri Aug 26 15:12:25 2016
@@ -54,17 +54,6 @@ public class RuleMatch extends AbstractR
return getMatchedAnnotations(element.getSelfIndexList(), element.getContainer());
}
- public List<AnnotationFS> getMatchedAnnotationsOfLabel(String label) {
- RuleElement element = getRuleElementWithLabel(label);
- return getMatchedAnnotationsOfElement(element);
- }
-
- private RuleElement getRuleElementWithLabel(String label) {
- RutaRule rule = getRule();
- RuleElement element = rule.getRuleElementWithLabel(label);
- return element;
- }
-
public AnnotationFS getLastMatchedAnnotation(MatchContext context, RutaStream stream) {
RuleElement element = context.getElement();
AnnotationFS annotation = context.getAnnotation();
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRule.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRule.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRule.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRule.java Fri Aug 26 15:12:25 2016
@@ -22,9 +22,13 @@ package org.apache.uima.ruta.rule;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaConstants;
import org.apache.uima.ruta.RutaEnvironment;
+import org.apache.uima.ruta.RutaStatement;
import org.apache.uima.ruta.RutaStream;
import org.apache.uima.ruta.block.RutaBlock;
import org.apache.uima.ruta.visitor.InferenceCrowd;
@@ -33,12 +37,16 @@ public class RutaRule extends AbstractRu
private ComposedRuleElement root;
- private Map<String, RuleElement> label2Element;
+ /**
+ * labels of all rule elements including those in inlined rules.
+ * The values store the values of overridden variables.
+ */
+ private Map<String, Object> labels;
public RutaRule(List<RuleElement> elements, RutaBlock parent, int id) {
super(parent, id);
this.root = new ComposedRuleElement(elements, null, null, null, null, parent);
- this.label2Element = new HashMap<>();
+ this.labels = new HashMap<>();
}
@Override
@@ -48,10 +56,13 @@ public class RutaRule extends AbstractRu
public RuleApply apply(RutaStream stream, InferenceCrowd crowd, boolean remember) {
RuleApply ruleApply = new RuleApply(this, remember);
+ MatchContext context = new MatchContext(getParent());
+ prepareEnvironment(context, stream);
crowd.beginVisit(this, ruleApply);
RuleMatch ruleMatch = new RuleMatch(this);
root.startMatch(ruleMatch, ruleApply, null, null, stream, crowd);
crowd.endVisit(this, ruleApply);
+ cleanupEnvironment(context, stream);
return ruleApply;
}
@@ -64,10 +75,6 @@ public class RutaRule extends AbstractRu
return root.getRuleElements();
}
- public RuleElement getRuleElementWithLabel(String label) {
- return label2Element.get(label);
- }
-
@Override
public RutaEnvironment getEnvironment() {
return getParent().getEnvironment();
@@ -91,7 +98,7 @@ public class RutaRule extends AbstractRu
private void fillLabelMap(RuleElement ruleElement) {
if (!StringUtils.isBlank(ruleElement.getLabel())) {
- label2Element.put(ruleElement.getLabel(), ruleElement);
+ labels.put(ruleElement.getLabel(), null);
}
if (ruleElement instanceof ComposedRuleElement) {
ComposedRuleElement cre = (ComposedRuleElement) ruleElement;
@@ -100,8 +107,57 @@ public class RutaRule extends AbstractRu
fillLabelMap(each);
}
}
+ fillLabelMapWithInlinedRules(ruleElement.getInlinedConditionRules());
+ fillLabelMapWithInlinedRules(ruleElement.getInlinedActionRules());
}
+ private void fillLabelMapWithInlinedRules(List<RutaStatement> rules) {
+ if (rules != null) {
+ for (RutaStatement eachInlined : rules) {
+ if (eachInlined instanceof RutaRule) {
+ RutaRule inlinedRule = (RutaRule) eachInlined;
+ fillLabelMap(inlinedRule.getRoot());
+ }
+ }
+ }
+ }
+
+ private void prepareEnvironment(MatchContext context, RutaStream stream) {
+ RutaBlock parent = context.getParent();
+ RutaEnvironment environment = parent.getEnvironment();
+ for (Entry<String, Object> entry : labels.entrySet()) {
+ String label = entry.getKey();
+ if(environment.isVariable(label)) {
+ Class<?> variableType = environment.getVariableType(label);
+ Class<?> variableGenericType = environment.getVariableGenericType(label);
+ if(variableType != null && variableGenericType!= null && variableType.isAssignableFrom(List.class) && variableGenericType.isAssignableFrom(AnnotationFS.class)) {
+ labels.put(label, environment.getVariableValue(label, stream));
+ } else if(variableType != null && variableType.isAssignableFrom(AnnotationFS.class)) {
+ } else {
+ String type = variableType== null ? "unknown" : variableType.getSimpleName();
+ throw new RuntimeException("Overriding global variable '"+label+"' of type '"+ type+ "' with a local label variable is not allowed!");
+ }
+ } else {
+ environment.addVariable(label, RutaConstants.RUTA_VARIABLE_ANNOTATION_LIST);
+ }
+ }
+ }
+
+ private void cleanupEnvironment(MatchContext context, RutaStream stream) {
+ RutaBlock parent = context.getParent();
+ RutaEnvironment environment = parent.getEnvironment();
+ for (Entry<String, Object> entry : labels.entrySet()) {
+ String label = entry.getKey();
+ Object value = entry.getValue();
+ if(value == null) {
+ environment.removeVariable(label);
+ } else {
+ environment.setVariableValue(label, value);
+ }
+ }
+ }
+
+
public ComposedRuleElement getRoot() {
return root;
}
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java Fri Aug 26 15:12:25 2016
@@ -386,12 +386,16 @@ public class RutaRuleElement extends Abs
}
// already set the matched text and inform others
result.setMatchInfo(base, textsMatched, stream);
+ context.getParent().getEnvironment().addMatchToVariable(ruleMatch, this, context, stream);
if (base) {
for (AbstractRutaCondition condition : conditions) {
crowd.beginVisit(condition, null);
EvaluatedCondition eval = condition.eval(context, stream, crowd);
crowd.endVisit(condition, null);
evaluatedConditions.add(eval);
+ if(!eval.isValue()) {
+ break;
+ }
}
}
result.setConditionInfo(base, evaluatedConditions);
Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/WildCardRuleElement.java Fri Aug 26 15:12:25 2016
@@ -640,12 +640,16 @@ public class WildCardRuleElement extends
textsMatched.add(annotation);
}
result.setMatchInfo(base, textsMatched, stream);
+ context.getParent().getEnvironment().addMatchToVariable(ruleMatch, this, context, stream);
if (base) {
for (AbstractRutaCondition condition : conditions) {
crowd.beginVisit(condition, null);
EvaluatedCondition eval = condition.eval(context, stream, crowd);
crowd.endVisit(condition, null);
evaluatedConditions.add(eval);
+ if(!eval.isValue()) {
+ break;
+ }
}
}
result.setConditionInfo(base, evaluatedConditions);
Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java?rev=1757875&r1=1757874&r2=1757875&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java (original)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java Fri Aug 26 15:12:25 2016
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertEqu
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
+import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -36,6 +37,7 @@ import org.apache.uima.cas.Feature;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.cas.text.AnnotationIndex;
+import org.apache.uima.resource.ResourceConfigurationException;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.ruta.engine.Ruta;
import org.apache.uima.ruta.engine.RutaTestUtils;
@@ -48,7 +50,7 @@ import org.junit.Test;
public class AnnotationLabelExpressionTest {
@Test
- public void testSimple() {
+ public void testSimple() throws Exception {
String document = "Some text.";
String script = "a:W W{-> CREATE(Struct, \"a\"=a)};";
@@ -62,13 +64,8 @@ public class AnnotationLabelExpressionTe
String fn = "a";
list.add(new TestFeature(fn, "", "uima.tcas.Annotation"));
- CAS cas = null;
- try {
- cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
- Ruta.apply(cas, script);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+ Ruta.apply(cas, script);
Type t = null;
AnnotationIndex<AnnotationFS> ai = null;
@@ -88,7 +85,7 @@ public class AnnotationLabelExpressionTe
}
@Test
- public void testMultiple() {
+ public void testMultiple() throws Exception {
String document = "Some text.";
String script = "b:(a:W)+{-PARTOF(Struct) -> CREATE(Struct, \"a\"=a, \"b\"=b, \"c\"=a, \"d\"=b)};";
script += "Struct.a{-> T1};";
@@ -108,13 +105,8 @@ public class AnnotationLabelExpressionTe
list.add(new TestFeature("c", "", "uima.cas.FSArray"));
list.add(new TestFeature("d", "", "uima.cas.FSArray"));
- CAS cas = null;
- try {
- cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
- Ruta.apply(cas, script);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+ Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "text");
RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some text");
@@ -123,7 +115,7 @@ public class AnnotationLabelExpressionTe
}
@Test
- public void testLayers() {
+ public void testLayers() throws Exception {
String document = "Some text.";
String script = "d:(a:W b:W{-> CREATE(Struct, \"a\"=a, \"b\"=b, \"c\"=c, \"d\"=d)} c:PERIOD);";
@@ -139,13 +131,8 @@ public class AnnotationLabelExpressionTe
list.add(new TestFeature("c", "", "uima.tcas.Annotation"));
list.add(new TestFeature("d", "", "uima.tcas.Annotation"));
- CAS cas = null;
- try {
- cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
- Ruta.apply(cas, script);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+ Ruta.apply(cas, script);
Type t = null;
AnnotationIndex<AnnotationFS> ai = null;
@@ -186,7 +173,7 @@ public class AnnotationLabelExpressionTe
}
@Test
- public void testActions() {
+ public void testActions() throws Exception {
String script = "a:W W{-> CREATE(Struct1, \"a\"=a)};";
script += "W W{-> Struct2, Struct3};";
script += "a:W Struct2{-> SETFEATURE(\"a\", a)};";
@@ -238,7 +225,7 @@ public class AnnotationLabelExpressionTe
@Test
@Ignore
- public void testInsideOut() {
+ public void testInsideOut() throws Exception {
String document = "Some text.";
String script = "(a:W{-PARTOF(Struct) -> CREATE(Struct, \"a\"=a, \"c\"=a)})+;";
script += "Struct.a{-> T1};";
@@ -254,25 +241,19 @@ public class AnnotationLabelExpressionTe
list.add(new TestFeature("a", "", "uima.tcas.Annotation"));
list.add(new TestFeature("c", "", "uima.cas.FSArray"));
- CAS cas = null;
- try {
- cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
- Ruta.apply(cas, script);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+ Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "Some", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 3, 2, "Some", "text");
}
@Test
- public void testInlined() throws AnalysisEngineProcessException, ResourceInitializationException,
- InvalidXMLException, IOException, CASException {
+ public void testWithinInlined() throws Exception {
String script = "ANNOTATION c;";
script += "Document{-> Struct1, Struct1.a = c}<-{i:SW{-> c=i} PERIOD;};";
script += "i:Document{-> c=i}->{PERIOD{-> Struct2, Struct2.a = c};};";
-// script += "i:Document<-{PERIOD{-> Struct2, Struct2.a = i};};";
+ // script += "i:Document<-{PERIOD{-> Struct2, Struct2.a = i};};";
CAS cas = applyOnStruct4Cas(script);
@@ -308,16 +289,14 @@ public class AnnotationLabelExpressionTe
}
@Test
- public void testFeature() throws ResourceInitializationException, InvalidXMLException,
- IOException, AnalysisEngineProcessException, CASException {
+ public void testFeature() throws Exception {
CAS cas = RutaTestUtils.getCAS("Some text.");
Assert.assertTrue(Ruta.matches(cas.getJCas(), "a:W b:W{a.end == (b.begin-1)-> T1};"));
RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "text");
}
@Test
- public void testComplexFeature() throws ResourceInitializationException, InvalidXMLException,
- IOException, AnalysisEngineProcessException, CASException {
+ public void testComplexFeature() throws Exception {
String script = "a:W W{-> CREATE(Struct1, \"a\"=a)};";
CAS cas = applyOnStruct4Cas(script);
Assert.assertTrue(Ruta.matches(cas.getJCas(), "a:Struct1{a.a.begin == 0 -> T1};"));
@@ -330,15 +309,28 @@ public class AnnotationLabelExpressionTe
CAS cas = RutaTestUtils.getCAS("Some text.");
Ruta.matches(cas.getJCas(), "a:W b:W{a.x == (b.y-1)-> T1};");
}
-
+
@Test(expected = AnalysisEngineProcessException.class)
- public void testSequentialLabelSelfMatch() throws ResourceInitializationException, InvalidXMLException,
- IOException, AnalysisEngineProcessException, CASException {
+ public void testSequentialLabelSelfMatch() throws ResourceInitializationException,
+ InvalidXMLException, IOException, AnalysisEngineProcessException, CASException {
CAS cas = RutaTestUtils.getCAS("Some text.");
Assert.assertFalse(Ruta.matches(cas.getJCas(), "e:CW e;"));
}
- private CAS applyOnStruct4Cas(String script) {
+ @Test
+ public void testAcrossInlinedRules() throws Exception {
+// String script = "(# PERIOD){->T1};\n";
+// script += "T1{-> Struct1, Struct1.a = i}<-{i:SW;};\n";
+// script += "o:T1<-{SW{->Struct2, Struct2.a = o};};\n";
+// script += "Struct1.a{->T2};\n";
+// script += "Struct1{Struct1.a.ct==\"text\"->T3};\n";
+// CAS cas = applyOnStruct4Cas(script);
+// RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "text");
+// RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Some text.");
+ }
+
+
+ private CAS applyOnStruct4Cas(String script) throws Exception {
String document = "Some text.";
Map<String, String> typeMap = new TreeMap<String, String>();
typeMap.put("Struct1", "uima.tcas.Annotation");
@@ -354,14 +346,8 @@ public class AnnotationLabelExpressionTe
featureMap.put("Struct4", list);
list.add(new TestFeature("a", "", "uima.tcas.Annotation"));
- CAS cas = null;
- try {
- cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
- Ruta.apply(cas, script);
- } catch (Exception e) {
- e.printStackTrace();
- }
+ CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+ Ruta.apply(cas, script);
return cas;
}
-
}