Author: pkluegl
Date: Wed May 29 16:03:48 2019
New Revision: 1860353
URL: http://svn.apache.org/viewvc?rev=1860353&view=rev
Log:
UIMA-6052: added additional layer in environment for temporary variable values
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/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/RutaOptionalRuleElement.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/main/java/org/apache/uima/ruta/rule/quantifier/AbstractRuleElementQuantifier.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=1860353&r1=1860352&r2=1860353&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
Wed May 29 16:03:48 2019
@@ -156,6 +156,8 @@ public class RutaEnvironment {
private Map<String, Object> variableValues;
+ private Map<String, Object> tempVariableValues;
+
private Map<String, Class<?>> variableTypes;
private Map<String, Class<?>> availableTypes;
@@ -195,6 +197,7 @@ public class RutaEnvironment {
wordLists = new HashMap<String, RutaWordList>();
tables = new HashMap<String, RutaTable>();
variableValues = new HashMap<String, Object>();
+ tempVariableValues = new HashMap<String, Object>();
variableTypes = new HashMap<String, Class<?>>();
variableGenericTypes = new HashMap<String, Class<?>>();
macroConditions = new HashMap<>();
@@ -775,6 +778,7 @@ public class RutaEnvironment {
variableTypes.remove(name);
variableGenericTypes.remove(name);
variableValues.remove(name);
+ tempVariableValues.remove(name);
}
public boolean ownsVariable(String name) {
@@ -841,8 +845,12 @@ public class RutaEnvironment {
if (variableAliases.containsKey(name)) {
name = variableAliases.get(name);
}
+ Object result = null;
boolean containsKey = variableValues.containsKey(name);
- Object result = variableValues.get(name);
+ result = tempVariableValues.get(name);
+ if (result == null) {
+ result = variableValues.get(name);
+ }
if (result instanceof String && type.equals(Type.class)) {
// "cast" string to type, because initial values were set when there
@@ -976,6 +984,13 @@ public class RutaEnvironment {
}
}
+ public void setTempVariableValue(String name, Object value) {
+ if (variableAliases.containsKey(name)) {
+ name = variableAliases.get(name);
+ }
+ tempVariableValues.put(name, value);
+ }
+
@SuppressWarnings("rawtypes")
private List getList(ListExpression value) {
if (value instanceof SimpleBooleanListExpression) {
@@ -1130,6 +1145,13 @@ public class RutaEnvironment {
addAnnotationsToVariable(annotations, var, context);
}
+ public void removeVariableValue(String var, MatchContext context) {
+ if (StringUtils.isBlank(var)) {
+ return;
+ }
+ setTempVariableValue(var, null);
+ }
+
public void addAnnotationsToVariable(List<AnnotationFS> annotations, String
var,
MatchContext context) {
if (StringUtils.isBlank(var)) {
@@ -1138,7 +1160,7 @@ public class RutaEnvironment {
Class<?> variableType = getVariableType(var);
if (List.class.equals(variableType) &&
AnnotationFS.class.equals(getVariableGenericType(var))) {
- setVariableValue(var, annotations);
+ setTempVariableValue(var, annotations);
} else if (AnnotationFS.class.equals(variableType)) {
if (context.getDirection()) {
AnnotationFS annotation = null;
@@ -1149,9 +1171,26 @@ public class RutaEnvironment {
annotation = annotations.get(0);
}
}
- setVariableValue(var, annotation);
+ setTempVariableValue(var, annotation);
+ }
+ }
+ }
+
+ public void acceptTempVariableValues(Collection<String> localVariables) {
+ for (String variableName : localVariables) {
+ if (tempVariableValues.containsKey(variableName)) {
+ Object value = tempVariableValues.get(variableName);
+ setVariableValue(variableName, value);
}
}
+
+ clearTempVariables(localVariables);
+ }
+
+ public void clearTempVariables(Collection<String> localVariables) {
+ for (String variableName : localVariables) {
+ tempVariableValues.remove(variableName);
+ }
}
}
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=1860353&r1=1860352&r2=1860353&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
Wed May 29 16:03:48 2019
@@ -20,6 +20,7 @@
package org.apache.uima.ruta.rule;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -82,23 +83,28 @@ public abstract class AbstractRuleElemen
InferenceCrowd crowd) {
if (!ruleMatch.isApplied()) {
ruleApply.add(ruleMatch, stream);
+ RutaRule rule = ruleMatch.getRule();
+ Collection<String> localVariables = rule.getLabels();
if (ruleMatch.matchedCompletely()) {
- ruleMatch.getRule().getRoot().applyRuleElements(ruleMatch, stream,
crowd);
+ rule.getEnvironment().acceptTempVariableValues(localVariables);
+ rule.getRoot().applyRuleElements(ruleMatch, stream, crowd);
+ } else {
+ rule.getEnvironment().clearTempVariables(localVariables);
}
ruleMatch.setApplied(true);
}
}
- protected List<List<ScriptApply>> processInlinedActionRules(RuleMatch
ruleMatch, RutaStream stream,
- InferenceCrowd crowd) {
+ protected List<List<ScriptApply>> processInlinedActionRules(RuleMatch
ruleMatch,
+ RutaStream stream, InferenceCrowd crowd) {
if (inlinedActionRuleBlocks != null && !inlinedActionRuleBlocks.isEmpty())
{
return processInlinedRules(inlinedActionRuleBlocks, ruleMatch, stream,
crowd);
}
return null;
}
- protected List<List<ScriptApply>> processInlinedConditionRules(RuleMatch
ruleMatch, RutaStream stream,
- InferenceCrowd crowd) {
+ protected List<List<ScriptApply>> processInlinedConditionRules(RuleMatch
ruleMatch,
+ RutaStream stream, InferenceCrowd crowd) {
if (inlinedConditionRuleBlocks != null &&
!inlinedConditionRuleBlocks.isEmpty()) {
return processInlinedRules(inlinedConditionRuleBlocks, ruleMatch,
stream, crowd);
}
@@ -146,7 +152,7 @@ public abstract class AbstractRuleElemen
if (blockResults == null) {
return true;
}
-
+
boolean matched = true;
for (List<ScriptApply> list : blockResults) {
matched &= atLeastOneRuleMatched(list);
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=1860353&r1=1860352&r2=1860353&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
Wed May 29 16:03:48 2019
@@ -574,7 +574,7 @@ public class ComposedRuleElement extends
match.setInlinedRulesMatched(inlinedRulesMatched);
} else {
// update label for failed match after evaluating conditions
- environment.addAnnotationsToVariable(null, getLabel(), context);
+ environment.removeVariableValue(getLabel(), context);
}
}
Modified:
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaOptionalRuleElement.java
URL:
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaOptionalRuleElement.java?rev=1860353&r1=1860352&r2=1860353&view=diff
==============================================================================
---
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaOptionalRuleElement.java
(original)
+++
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaOptionalRuleElement.java
Wed May 29 16:03:48 2019
@@ -92,7 +92,7 @@ public class RutaOptionalRuleElement ext
result.setInlinedRulesMatched(inlinedRulesMatched);
} else {
// update label for failed match after evaluating conditions
- environment.addAnnotationsToVariable(null, getLabel(), context);
+ environment.removeVariableValue(getLabel(), context);
}
ruleMatch.setMatched(ruleMatch.matched() && result.matched());
}
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=1860353&r1=1860352&r2=1860353&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
Wed May 29 16:03:48 2019
@@ -19,6 +19,7 @@
package org.apache.uima.ruta.rule;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -188,4 +189,8 @@ public class RutaRule extends AbstractRu
return root;
}
+ public Collection<String> getLabels() {
+ return labels.keySet();
+ }
+
}
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=1860353&r1=1860352&r2=1860353&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
Wed May 29 16:03:48 2019
@@ -408,7 +408,7 @@ public class RutaRuleElement extends Abs
result.setInlinedRulesMatched(inlinedRulesMatched);
} else {
// update label for failed match after evaluating conditions
- environment.addAnnotationsToVariable(null, getLabel(), context);
+ environment.removeVariableValue(getLabel(), context);
}
ruleMatch.setMatched(ruleMatch.matched() && result.matched());
}
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=1860353&r1=1860352&r2=1860353&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
Wed May 29 16:03:48 2019
@@ -65,7 +65,7 @@ public class WildCardRuleElement extends
RuleApply ruleApply, ComposedRuleElementMatch containerMatch,
RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream
stream,
InferenceCrowd crowd) {
- Pair<RuleElement,Integer> next = getNextRuleElement(after, this);
+ Pair<RuleElement, Integer> next = getNextRuleElement(after, this);
RuleElement nextElement = next.getLeft();
int nextDepth = next.getRight().intValue();
List<RuleMatch> result = tryWithNextRuleElement(nextElement, after,
annotation, ruleMatch,
@@ -322,8 +322,9 @@ public class WildCardRuleElement extends
AnnotationFS nextAnchor = getNextAnchor(after, annotation,
nextElement, ruleMatch,
containerMatch, sideStepOrigin, stream, crowd);
-
- AnnotationFS coveredByWildCard = getCoveredByWildCard(after,
annotation, nextAnchor, stream);
+
+ AnnotationFS coveredByWildCard = getCoveredByWildCard(after,
annotation, nextAnchor,
+ stream);
doMatch(coveredByWildCard, ruleMatch, containerMatch, annotation ==
null, stream, crowd);
if (ruleMatch.matched()) {
ComposedRuleElementMatch nextContainerMatch =
getContainerMatchOfNextElement(
@@ -342,7 +343,7 @@ public class WildCardRuleElement extends
}
} else {
- if(ruleApply == null && entryPoint != null &&
entryPoint.equals(nextElement)) {
+ if (ruleApply == null && entryPoint != null &&
entryPoint.equals(nextElement)) {
return result;
} else {
result = cre.fallbackContinue(after, true, annotation, ruleMatch,
ruleApply,
@@ -395,18 +396,22 @@ public class WildCardRuleElement extends
return result;
}
- private AnnotationFS getNextAnchor(boolean after, AnnotationFS annotation,
RuleElement nextElement,
- RuleMatch ruleMatch, ComposedRuleElementMatch containerMatch,
+ private AnnotationFS getNextAnchor(boolean after, AnnotationFS annotation,
+ RuleElement nextElement, RuleMatch ruleMatch,
ComposedRuleElementMatch containerMatch,
RutaRuleElement sideStepOrigin, RutaStream stream, InferenceCrowd
crowd) {
AnnotationFS nextAnchor = null;
Pair<RuleElement, Integer> nextNext = getNextRuleElement(after,
nextElement);
if (nextNext != null && nextNext.getLeft() != null) {
- List<RuleMatch> tryWithNextNextRuleElement =
tryWithNextRuleElement(nextNext.getLeft(), after, annotation, ruleMatch, null,
containerMatch, nextNext.getRight().intValue(), sideStepOrigin,
nextNext.getLeft(), stream, crowd);
+ List<RuleMatch> tryWithNextNextRuleElement =
tryWithNextRuleElement(nextNext.getLeft(), after,
+ annotation, ruleMatch, null, containerMatch,
nextNext.getRight().intValue(),
+ sideStepOrigin, nextNext.getLeft(), stream, crowd);
for (RuleMatch eachNextRuleMatch : tryWithNextNextRuleElement) {
- if(eachNextRuleMatch.matched()) {
- List<AnnotationFS> matchedAnnotationsOfElement =
eachNextRuleMatch.getMatchedAnnotationsOfElement(nextNext.getLeft());
+ if (eachNextRuleMatch.matched()) {
+ List<AnnotationFS> matchedAnnotationsOfElement = eachNextRuleMatch
+ .getMatchedAnnotationsOfElement(nextNext.getLeft());
if (matchedAnnotationsOfElement != null &&
!matchedAnnotationsOfElement.isEmpty()) {
- nextAnchor = after ? matchedAnnotationsOfElement.get(0) :
matchedAnnotationsOfElement.get(matchedAnnotationsOfElement.size()-1);
+ nextAnchor = after ? matchedAnnotationsOfElement.get(0)
+ :
matchedAnnotationsOfElement.get(matchedAnnotationsOfElement.size() - 1);
break;
}
}
@@ -739,7 +744,7 @@ public class WildCardRuleElement extends
result.setInlinedRulesMatched(inlinedRulesMatched);
} else {
// update label for failed match after evaluating conditions
- environment.addAnnotationsToVariable(null, getLabel(), context);
+ environment.removeVariableValue(getLabel(), context);
}
ruleMatch.setMatched(ruleMatch.matched() && result.matched());
}
Modified:
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/AbstractRuleElementQuantifier.java
URL:
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/AbstractRuleElementQuantifier.java?rev=1860353&r1=1860352&r2=1860353&view=diff
==============================================================================
---
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/AbstractRuleElementQuantifier.java
(original)
+++
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/AbstractRuleElementQuantifier.java
Wed May 29 16:03:48 2019
@@ -75,7 +75,7 @@ public abstract class AbstractRuleElemen
String label = ruleElement.getLabel();
if (matches == null || matches.isEmpty()) {
- environment.addAnnotationsToVariable(null, label, context);
+ environment.removeVariableValue(label, context);
return;
}
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=1860353&r1=1860352&r2=1860353&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
Wed May 29 16:03:48 2019
@@ -762,4 +762,37 @@ public class AnnotationLabelExpressionTe
}
+ @Test
+ public void testTemporalFailingLabelAssignment() throws Exception {
+
+ String document = "Some text.";
+ Map<String, String> typeMap = new TreeMap<String, String>();
+ typeMap.put("Struct1", "uima.tcas.Annotation");
+ typeMap.put("Struct2", "uima.tcas.Annotation");
+
+ Map<String, List<TestFeature>> featureMap = new TreeMap<String,
List<TestFeature>>();
+ List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+ featureMap.put("Struct1", list);
+ featureMap.put("Struct2", list);
+ list.add(new TestFeature("a", "", "uima.tcas.Annotation"));
+ list.add(new TestFeature("b", "", "uima.tcas.Annotation"));
+
+ String script = "";
+ script += "Document{->CREATE(Struct1, \"a\" = a, \"b\" = b)} <-{a:W
b:W;};\n";
+ script += "Document{->CREATE(Struct2, \"a\" = a, \"b\" = b)}
<-{a:W{STARTSWITH(Document)} b:W;};\n";
+ script += "Struct1.a{-> T1};\n";
+ script += "Struct1.b{-> T2};\n";
+ script += "Struct2.a{-> T3};\n";
+ script += "Struct2.b{-> T4};\n";
+
+ CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+ Ruta.apply(cas, script);
+
+ RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some");
+ RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "text");
+ RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Some");
+ RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "text");
+
+ }
+
}