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");
+
+  }
+
 }


Reply via email to