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;
   }
-
 }