Author: pkluegl
Date: Tue Nov  5 15:59:38 2019
New Revision: 1869414

URL: http://svn.apache.org/viewvc?rev=1869414&view=rev
Log:
UIMA-6119: allow composed rule elements as side step origin in order to avoid 
workarounds

Modified:
    
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/ConjunctRulesRuleElement.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/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/rule/SidestepInComposedTest.java

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=1869414&r1=1869413&r2=1869414&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
 Tue Nov  5 15:59:38 2019
@@ -79,6 +79,52 @@ public abstract class AbstractRuleElemen
     }
   }
 
+  @Override
+  public List<RuleMatch> continueSideStep(boolean after, RuleMatch ruleMatch, 
RuleApply ruleApply,
+          ComposedRuleElementMatch containerMatch, RuleElement entryPoint, 
RutaStream stream,
+          InferenceCrowd crowd) {
+    List<RuleMatch> result = new ArrayList<RuleMatch>();
+    boolean newDirection = !after;
+    List<AnnotationFS> matchedAnnotationsOf = 
ruleMatch.getMatchedAnnotationsOfElement(this);
+    AnnotationFS annotation = null;
+    if (!matchedAnnotationsOf.isEmpty()) {
+      if (newDirection) {
+        annotation = matchedAnnotationsOf.get(matchedAnnotationsOf.size() - 1);
+      } else {
+        annotation = matchedAnnotationsOf.get(0);
+      }
+      ComposedRuleElementMatch sideStepContainerMatch = containerMatch;
+      if (!containerMatch.getRuleElement().equals(getContainer())) {
+        List<List<RuleElementMatch>> matchInfo = ruleMatch
+                .getMatchInfo((ComposedRuleElement) getContainer());
+        if (newDirection) {
+          List<RuleElementMatch> list = matchInfo.get(matchInfo.size() - 1);
+          sideStepContainerMatch = (ComposedRuleElementMatch) 
list.get(list.size() - 1);
+        } else {
+          List<RuleElementMatch> list = matchInfo.get(0);
+          sideStepContainerMatch = (ComposedRuleElementMatch) list.get(0);
+        }
+      }
+      MatchContext context = new MatchContext(this, ruleMatch, newDirection);
+      if (quantifier.continueMatch(newDirection, context, annotation, 
sideStepContainerMatch,
+              stream, crowd)) {
+        continueMatch(newDirection, annotation, ruleMatch, ruleApply, 
sideStepContainerMatch, null,
+                entryPoint, stream, crowd);
+      } else {
+        RuleElement nextRuleElement = 
getContainer().getNextElement(newDirection, this);
+        if (nextRuleElement != null) {
+          result = nextRuleElement.continueMatch(newDirection, annotation, 
ruleMatch, ruleApply,
+                  sideStepContainerMatch, null, null, stream, crowd);
+        } else if (getContainer() instanceof ComposedRuleElement) {
+          ComposedRuleElement composed = (ComposedRuleElement) getContainer();
+          result = composed.fallbackContinue(newDirection, false, annotation, 
ruleMatch, ruleApply,
+                  sideStepContainerMatch, null, entryPoint, stream, crowd);
+        }
+      }
+    }
+    return result;
+  }
+
   protected void doneMatching(RuleMatch ruleMatch, RuleApply ruleApply, 
RutaStream stream,
           InferenceCrowd crowd) {
     if (!ruleMatch.isApplied()) {

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=1869414&r1=1869413&r2=1869414&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
 Tue Nov  5 15:59:38 2019
@@ -104,14 +104,9 @@ public class ComposedRuleElement extends
         MatchContext context = new MatchContext(null, this, eachRuleMatch, 
true);
         AnnotationFS lastAnnotation = 
eachRuleMatch.getLastMatchedAnnotation(context, stream);
         boolean failed = !eachComposedMatch.matched();
-        RuleElement anchoringRuleElement = getAnchoringRuleElement(stream);
-        RutaRuleElement sideStepOrigin = null;
 
-        anchoringRuleElement = updateAnchorForDisjunctMatch(eachComposedMatch, 
stream);
+        RuleElement sideStepOrigin = hasAncestor(false) ? this : null;
 
-        if (anchoringRuleElement instanceof RutaRuleElement && 
hasAncestor(false)) {
-          sideStepOrigin = (RutaRuleElement) anchoringRuleElement;
-        }
         List<RuleMatch> fallbackContinue = fallbackContinue(true, failed, 
lastAnnotation,
                 eachRuleMatch, ruleApply, eachComposedMatch, sideStepOrigin, 
entryPoint, stream,
                 crowd);
@@ -121,11 +116,7 @@ public class ComposedRuleElement extends
       // conjunctive
       Map<RuleMatch, ComposedRuleElementMatch> ruleMatches = new 
LinkedHashMap<RuleMatch, ComposedRuleElementMatch>();
       RuleElement anchoringRuleElement = getAnchoringRuleElement(stream);
-      RutaRuleElement sideStepOrigin = null;
 
-      if (anchoringRuleElement instanceof RutaRuleElement && 
hasAncestor(false)) {
-        sideStepOrigin = (RutaRuleElement) anchoringRuleElement;
-      }
       ComposedRuleElementMatch composedMatch = createComposedMatch(ruleMatch, 
containerMatch,
               stream);
       List<RuleMatch> startRuleMatches = 
anchoringRuleElement.startMatch(ruleMatch, null,
@@ -162,6 +153,9 @@ public class ComposedRuleElement extends
         List<AnnotationFS> textsMatched = eachComposedMatch.getTextsMatched();
         if ((!stream.isGreedyAnchoring() && !stream.isOnlyOnce())
                 || !earlyExit(textsMatched.get(0), ruleApply, stream)) {
+
+          RuleElement sideStepOrigin = hasAncestor(false) ? this : null;
+
           List<RuleMatch> fallbackContinue = fallbackContinue(true, failed, 
lastAnnotation,
                   eachRuleMatch, ruleApply, eachComposedMatch, sideStepOrigin, 
entryPoint, stream,
                   crowd);
@@ -172,25 +166,6 @@ public class ComposedRuleElement extends
     return result;
   }
 
-  private RuleElement updateAnchorForDisjunctMatch(ComposedRuleElementMatch 
eachComposedMatch,
-          RutaStream stream) {
-
-    Map<RuleElement, List<RuleElementMatch>> innerMatches = 
eachComposedMatch.getInnerMatches();
-    RuleElement anchoringRuleElement = getAnchoringRuleElement(stream);
-
-    for (Entry<RuleElement, List<RuleElementMatch>> match : 
innerMatches.entrySet()) {
-      if (match.getValue() != null) {
-        List<RuleElementMatch> matchRuleElements = match.getValue();
-        for (RuleElementMatch elem : matchRuleElements) {
-          if (elem.conditionsMatched) {
-            anchoringRuleElement = match.getKey();
-          }
-        }
-      }
-    }
-    return anchoringRuleElement;
-  }
-
   private AnnotationFS getPrefixAnnotation(RuleMatch ruleMatch, RutaStream 
stream) {
     MatchContext context = new MatchContext(this, ruleMatch);
     AnnotationFS lastMatchedAnnotation = 
ruleMatch.getLastMatchedAnnotation(context, stream);
@@ -211,9 +186,8 @@ public class ComposedRuleElement extends
 
   @Override
   public List<RuleMatch> continueMatch(boolean after, AnnotationFS annotation, 
RuleMatch ruleMatch,
-          RuleApply ruleApply, ComposedRuleElementMatch containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
-          InferenceCrowd crowd) {
+          RuleApply ruleApply, ComposedRuleElementMatch containerMatch, 
RuleElement sideStepOrigin,
+          RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     if (conjunct == null) {
       // inner next sequential
@@ -389,7 +363,7 @@ public class ComposedRuleElement extends
   @Override
   public List<RuleMatch> continueOwnMatch(boolean after, AnnotationFS 
annotation,
           RuleMatch ruleMatch, RuleApply ruleApply, ComposedRuleElementMatch 
containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
+          RuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
           InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     if (!stream.isSimpleGreedyForComposed()) {
@@ -439,7 +413,7 @@ public class ComposedRuleElement extends
 
   public List<RuleMatch> fallbackContinue(boolean after, boolean failed, 
AnnotationFS annotation,
           RuleMatch ruleMatch, RuleApply ruleApply, ComposedRuleElementMatch 
containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
+          RuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
           InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     RuleElementContainer container = getContainer();
@@ -539,7 +513,7 @@ public class ComposedRuleElement extends
 
   private List<RuleMatch> fallback(boolean after, boolean failed, AnnotationFS 
annotation,
           RuleMatch ruleMatch, RuleApply ruleApply, ComposedRuleElementMatch 
containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
+          RuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
           InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     RuleElementContainer parentContainer = getContainer();

Modified: 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ConjunctRulesRuleElement.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ConjunctRulesRuleElement.java?rev=1869414&r1=1869413&r2=1869414&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ConjunctRulesRuleElement.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ConjunctRulesRuleElement.java
 Tue Nov  5 15:59:38 2019
@@ -82,16 +82,15 @@ public class ConjunctRulesRuleElement ex
 
   @Override
   public List<RuleMatch> continueMatch(boolean after, AnnotationFS annotation, 
RuleMatch ruleMatch,
-          RuleApply ruleApply, ComposedRuleElementMatch containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
-          InferenceCrowd crowd) {
+          RuleApply ruleApply, ComposedRuleElementMatch containerMatch, 
RuleElement sideStepOrigin,
+          RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd) {
     throw new UnsupportedOperationException();
   }
 
   @Override
   public List<RuleMatch> continueOwnMatch(boolean after, AnnotationFS 
annotation,
           RuleMatch ruleMatch, RuleApply ruleApply, ComposedRuleElementMatch 
containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
+          RuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
           InferenceCrowd crowd) {
     throw new UnsupportedOperationException();
   }

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=1869414&r1=1869413&r2=1869414&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
 Tue Nov  5 15:59:38 2019
@@ -40,13 +40,15 @@ public interface RuleElement {
           InferenceCrowd crowd);
 
   List<RuleMatch> continueMatch(boolean after, AnnotationFS annotation, 
RuleMatch ruleMatch,
-          RuleApply ruleApply, ComposedRuleElementMatch containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
-          InferenceCrowd crowd);
+          RuleApply ruleApply, ComposedRuleElementMatch containerMatch, 
RuleElement sideStepOrigin,
+          RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd);
 
   List<RuleMatch> continueOwnMatch(boolean after, AnnotationFS annotation, 
RuleMatch ruleMatch,
-          RuleApply ruleApply, ComposedRuleElementMatch containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
+          RuleApply ruleApply, ComposedRuleElementMatch containerMatch, 
RuleElement sideStepOrigin,
+          RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd);
+
+  List<RuleMatch> continueSideStep(boolean after, RuleMatch ruleMatch, 
RuleApply ruleApply,
+          ComposedRuleElementMatch containerMatch, RuleElement entryPoint, 
RutaStream stream,
           InferenceCrowd crowd);
 
   void doMatch(boolean after, AnnotationFS annotation, RuleMatch ruleMatch,

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=1869414&r1=1869413&r2=1869414&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
 Tue Nov  5 15:59:38 2019
@@ -127,7 +127,7 @@ public class RutaRuleElement extends Abs
   @Override
   public List<RuleMatch> continueOwnMatch(boolean after, AnnotationFS 
annotation,
           RuleMatch ruleMatch, RuleApply ruleApply, ComposedRuleElementMatch 
containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
+          RuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
           InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     MatchContext context = new MatchContext(this, ruleMatch, after);
@@ -187,7 +187,7 @@ public class RutaRuleElement extends Abs
 
   protected List<RuleMatch> continueMatchSomewhereElse(boolean after, boolean 
failed,
           AnnotationFS eachAnchor, RuleMatch extendedMatch, RuleApply 
ruleApply,
-          ComposedRuleElementMatch extendedContainerMatch, RutaRuleElement 
sideStepOrigin,
+          ComposedRuleElementMatch extendedContainerMatch, RuleElement 
sideStepOrigin,
           RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     RuleElement nextRuleElement = getContainer().getNextElement(after, this);
@@ -204,9 +204,8 @@ public class RutaRuleElement extends Abs
 
   @Override
   public List<RuleMatch> continueMatch(boolean after, AnnotationFS annotation, 
RuleMatch ruleMatch,
-          RuleApply ruleApply, ComposedRuleElementMatch containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
-          InferenceCrowd crowd) {
+          RuleApply ruleApply, ComposedRuleElementMatch containerMatch, 
RuleElement sideStepOrigin,
+          RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     // if() for really lazy quantifiers
     MatchContext context = new MatchContext(this, ruleMatch, after);
@@ -271,7 +270,7 @@ public class RutaRuleElement extends Abs
 
   protected List<RuleMatch> stepbackMatch(boolean after, AnnotationFS 
annotation,
           RuleMatch ruleMatch, RuleApply ruleApply, ComposedRuleElementMatch 
containerMatch,
-          RutaRuleElement sideStepOrigin, RutaStream stream, InferenceCrowd 
crowd,
+          RuleElement sideStepOrigin, RutaStream stream, InferenceCrowd crowd,
           RuleElement entryPoint) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     if (this.equals(entryPoint) && ruleApply == null) {
@@ -324,51 +323,6 @@ public class RutaRuleElement extends Abs
         }
       }
     }
-    return result;
-  }
-
-  public List<RuleMatch> continueSideStep(boolean after, RuleMatch ruleMatch, 
RuleApply ruleApply,
-          ComposedRuleElementMatch containerMatch, RuleElement entryPoint, 
RutaStream stream,
-          InferenceCrowd crowd) {
-    List<RuleMatch> result = new ArrayList<RuleMatch>();
-    boolean newDirection = !after;
-    List<AnnotationFS> matchedAnnotationsOf = 
ruleMatch.getMatchedAnnotationsOfElement(this);
-    AnnotationFS annotation = null;
-    if (!matchedAnnotationsOf.isEmpty()) {
-      if (newDirection) {
-        annotation = matchedAnnotationsOf.get(matchedAnnotationsOf.size() - 1);
-      } else {
-        annotation = matchedAnnotationsOf.get(0);
-      }
-      ComposedRuleElementMatch sideStepContainerMatch = containerMatch;
-      if (!containerMatch.getRuleElement().equals(getContainer())) {
-        List<List<RuleElementMatch>> matchInfo = ruleMatch
-                .getMatchInfo((ComposedRuleElement) getContainer());
-        if (newDirection) {
-          List<RuleElementMatch> list = matchInfo.get(matchInfo.size() - 1);
-          sideStepContainerMatch = (ComposedRuleElementMatch) 
list.get(list.size() - 1);
-        } else {
-          List<RuleElementMatch> list = matchInfo.get(0);
-          sideStepContainerMatch = (ComposedRuleElementMatch) list.get(0);
-        }
-      }
-      MatchContext context = new MatchContext(this, ruleMatch, newDirection);
-      if (quantifier.continueMatch(newDirection, context, annotation, 
sideStepContainerMatch,
-              stream, crowd)) {
-        continueMatch(newDirection, annotation, ruleMatch, ruleApply, 
sideStepContainerMatch, null,
-                entryPoint, stream, crowd);
-      } else {
-        RuleElement nextRuleElement = 
getContainer().getNextElement(newDirection, this);
-        if (nextRuleElement != null) {
-          result = nextRuleElement.continueMatch(newDirection, annotation, 
ruleMatch, ruleApply,
-                  sideStepContainerMatch, null, null, stream, crowd);
-        } else if (getContainer() instanceof ComposedRuleElement) {
-          ComposedRuleElement composed = (ComposedRuleElement) getContainer();
-          result = composed.fallbackContinue(newDirection, false, annotation, 
ruleMatch, ruleApply,
-                  sideStepContainerMatch, null, entryPoint, stream, crowd);
-        }
-      }
-    }
     return result;
   }
 

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=1869414&r1=1869413&r2=1869414&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
 Tue Nov  5 15:59:38 2019
@@ -62,9 +62,8 @@ public class WildCardRuleElement extends
 
   @Override
   public List<RuleMatch> continueMatch(boolean after, AnnotationFS annotation, 
RuleMatch ruleMatch,
-          RuleApply ruleApply, ComposedRuleElementMatch containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
-          InferenceCrowd crowd) {
+          RuleApply ruleApply, ComposedRuleElementMatch containerMatch, 
RuleElement sideStepOrigin,
+          RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd) {
     Pair<RuleElement, Integer> next = getNextRuleElement(after, this);
     RuleElement nextElement = next.getLeft();
     int nextDepth = next.getRight().intValue();
@@ -95,7 +94,7 @@ public class WildCardRuleElement extends
 
   private List<RuleMatch> tryWithNextRuleElement(RuleElement nextElement, 
boolean after,
           AnnotationFS annotation, RuleMatch ruleMatch, RuleApply ruleApply,
-          ComposedRuleElementMatch containerMatch, int nextDepth, 
RutaRuleElement sideStepOrigin,
+          ComposedRuleElementMatch containerMatch, int nextDepth, RuleElement 
sideStepOrigin,
           RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     // what is the next stuff that should match?
@@ -132,7 +131,7 @@ public class WildCardRuleElement extends
 
   private List<RuleMatch> tryWithNextComposed(boolean after, AnnotationFS 
annotation,
           ComposedRuleElement cre, RuleMatch ruleMatch, RuleApply ruleApply,
-          ComposedRuleElementMatch containerMatch, int nextDepth, 
RutaRuleElement sideStepOrigin,
+          ComposedRuleElementMatch containerMatch, int nextDepth, RuleElement 
sideStepOrigin,
           RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     AnnotationFS nextOne = annotation;
@@ -304,7 +303,7 @@ public class WildCardRuleElement extends
 
   private List<RuleMatch> tryWithNextAnnotationType(boolean after, 
AnnotationFS annotation,
           RuleElement nextElement, Type defaultType, RuleMatch ruleMatch, 
RuleApply ruleApply,
-          ComposedRuleElementMatch containerMatch, int nextDepth, 
RutaRuleElement sideStepOrigin,
+          ComposedRuleElementMatch containerMatch, int nextDepth, RuleElement 
sideStepOrigin,
           RuleElement entryPoint, RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     FSIterator<AnnotationFS> iterator = getIterator(after, annotation, 
nextElement, defaultType,
@@ -402,7 +401,7 @@ public class WildCardRuleElement extends
 
   private AnnotationFS getNextAnchor(boolean after, AnnotationFS annotation,
           RuleElement nextElement, RuleMatch ruleMatch, 
ComposedRuleElementMatch containerMatch,
-          RutaRuleElement sideStepOrigin, RutaStream stream, InferenceCrowd 
crowd) {
+          RuleElement sideStepOrigin, RutaStream stream, InferenceCrowd crowd) 
{
     AnnotationFS nextAnchor = null;
     Pair<RuleElement, Integer> nextNext = getNextRuleElement(after, 
nextElement);
     if (nextNext != null && nextNext.getLeft() != null) {
@@ -580,7 +579,7 @@ public class WildCardRuleElement extends
 
   private List<RuleMatch> tryWithNextLiteral(boolean after, AnnotationFS 
annotation,
           RutaRuleElement nextElement, RuleMatch ruleMatch, RuleApply 
ruleApply,
-          ComposedRuleElementMatch containerMatch, int nextDepth, 
RutaRuleElement sideStepOrigin,
+          ComposedRuleElementMatch containerMatch, int nextDepth, RuleElement 
sideStepOrigin,
           RutaStream stream, InferenceCrowd crowd) {
     List<RuleMatch> result = new ArrayList<RuleMatch>();
     RutaLiteralMatcher matcher = (RutaLiteralMatcher) nextElement.getMatcher();
@@ -761,7 +760,7 @@ public class WildCardRuleElement extends
   @Override
   public List<RuleMatch> continueOwnMatch(boolean after, AnnotationFS 
annotation,
           RuleMatch ruleMatch, RuleApply ruleApply, ComposedRuleElementMatch 
containerMatch,
-          RutaRuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
+          RuleElement sideStepOrigin, RuleElement entryPoint, RutaStream 
stream,
           InferenceCrowd crowd) {
     // won't happen
     return Collections.emptyList();

Modified: 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/SidestepInComposedTest.java
URL: 
http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/SidestepInComposedTest.java?rev=1869414&r1=1869413&r2=1869414&view=diff
==============================================================================
--- 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/SidestepInComposedTest.java
 (original)
+++ 
uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/rule/SidestepInComposedTest.java
 Tue Nov  5 15:59:38 2019
@@ -36,19 +36,34 @@ public class SidestepInComposedTest {
     Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "15");
-
-    cas.release();
   }
 
   @Test
   public void testAnchorAtDisjunct() throws Exception {
     String document = "15. Mai 2005";
     String script = "(NUM PERIOD @(SW | CW) NUM){-> T1};\n";
+    script += "(NUM PERIOD (@((SW | CW))) NUM){-> T2};\n";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "15. Mai 2005");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "15. Mai 2005");
+
+  }
+
+  @Test
+  public void testAnchorAtConjunct() throws Exception {
+    String document = "15. Mai 2005";
+    String script = "(NUM PERIOD @(W & CW) NUM){-> T1};\n";
+    script += "(NUM PERIOD (@((CW & W))) NUM){-> T2};\n";
 
     CAS cas = RutaTestUtils.getCAS(document);
     Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "15. Mai 2005");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "15. Mai 2005");
 
   }
+
 }


Reply via email to