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 2018/12/20 08:30:47 UTC

svn commit: r1849363 - in /uima/ruta/trunk: ruta-core/src/main/java/org/apache/uima/ruta/ ruta-core/src/main/java/org/apache/uima/ruta/engine/ ruta-core/src/main/java/org/apache/uima/ruta/rule/ ruta-core/src/test/java/org/apache/uima/ruta/engine/ ruta-...

Author: pkluegl
Date: Thu Dec 20 08:30:47 2018
New Revision: 1849363

URL: http://svn.apache.org/viewvc?rev=1849363&view=rev
Log:
UIMA-5414: added two params+impl, added test, added doc mention

Modified:
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.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/ComposedRuleElementMatch.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/RegExpRule.java
    uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleApply.java
    uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
    uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.overview.xml

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java?rev=1849363&r1=1849362&r2=1849363&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java Thu Dec 20 08:30:47 2018
@@ -130,6 +130,10 @@ public class RutaStream extends FSIterat
 
   private boolean emptyIsInvisible;
 
+  private long maxRuleMatches;
+
+  private long maxRuleElementMatches;
+
   public RutaStream(CAS cas, Type basicType, FilterManager filter, boolean lowMemoryProfile,
           boolean simpleGreedyForComposed, boolean emptyIsInvisible, TypeUsageInformation typeUsage,
           InferenceCrowd crowd) {
@@ -484,6 +488,8 @@ public class RutaStream extends FSIterat
     stream.setDynamicAnchoring(dynamicAnchoring);
     stream.setGreedyRuleElement(greedyRuleElement);
     stream.setGreedyRule(greedyRule);
+    stream.setMaxRuleMatches(maxRuleMatches);
+    stream.setMaxRuleElementMatches(maxRuleElementMatches);
     return stream;
   }
 
@@ -494,6 +500,8 @@ public class RutaStream extends FSIterat
     stream.setDynamicAnchoring(dynamicAnchoring);
     stream.setGreedyRuleElement(greedyRuleElement);
     stream.setGreedyRule(greedyRule);
+    stream.setMaxRuleMatches(maxRuleMatches);
+    stream.setMaxRuleElementMatches(maxRuleElementMatches);
     return stream;
   }
 
@@ -1353,4 +1361,20 @@ public class RutaStream extends FSIterat
     }
     return null;
   }
+
+  public void setMaxRuleMatches(long maxRuleMatches) {
+    this.maxRuleMatches = maxRuleMatches;
+  }
+
+  public void setMaxRuleElementMatches(long maxRuleElementMatches) {
+    this.maxRuleElementMatches = maxRuleElementMatches;
+  }
+
+  public long getMaxRuleMatches() {
+    return this.maxRuleMatches;
+  }
+
+  public long getMaxRuleElementMatches() {
+    return this.maxRuleElementMatches;
+  }
 }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java?rev=1849363&r1=1849362&r2=1849363&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java Thu Dec 20 08:30:47 2018
@@ -492,6 +492,24 @@ public class RutaEngine extends JCasAnno
   @ConfigurationParameter(name = PARAM_INFERENCE_VISITORS, mandatory = false, defaultValue = {})
   private String[] inferenceVisitors;
 
+  /**
+   * Maximum amount of allowed matches of a single rule.
+   */
+  public static final String PARAM_MAX_RULE_MATCHES = "maxRuleMatches";
+
+  @ConfigurationParameter(name = PARAM_MAX_RULE_MATCHES, mandatory = false, defaultValue = ""
+          + Integer.MAX_VALUE)
+  private int maxRuleMatches;
+
+  /**
+   * Maximum amount of allowed matches of a single rule element.
+   */
+  public static final String PARAM_MAX_RULE_ELEMENT_MATCHES = "maxRuleElementMatches";
+
+  @ConfigurationParameter(name = PARAM_MAX_RULE_ELEMENT_MATCHES, mandatory = false, defaultValue = ""
+          + Integer.MAX_VALUE)
+  private int maxRuleElementMatches;
+
   private UimaContext context;
 
   private RutaModule script;
@@ -578,6 +596,8 @@ public class RutaEngine extends JCasAnno
     stream.setDynamicAnchoring(dynamicAnchoring);
     stream.setGreedyRuleElement(greedyRuleElement);
     stream.setGreedyRule(greedyRule);
+    stream.setMaxRuleMatches(maxRuleMatches);
+    stream.setMaxRuleElementMatches(maxRuleElementMatches);
     try {
       script.apply(stream, crowd);
     } catch (Throwable e) {

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=1849363&r1=1849362&r2=1849363&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 Thu Dec 20 08:30:47 2018
@@ -81,7 +81,7 @@ public abstract class AbstractRuleElemen
   protected void doneMatching(RuleMatch ruleMatch, RuleApply ruleApply, RutaStream stream,
           InferenceCrowd crowd) {
     if (!ruleMatch.isApplied()) {
-      ruleApply.add(ruleMatch);
+      ruleApply.add(ruleMatch, stream);
       if (ruleMatch.matchedCompletely()) {
         ruleMatch.getRule().getRoot().applyRuleElements(ruleMatch, stream, crowd);
       }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElementMatch.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElementMatch.java?rev=1849363&r1=1849362&r2=1849363&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElementMatch.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElementMatch.java Thu Dec 20 08:30:47 2018
@@ -29,6 +29,7 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 
 import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.ruta.RutaProcessRuntimeException;
 import org.apache.uima.ruta.RutaStream;
 
 public class ComposedRuleElementMatch extends RuleElementMatch {
@@ -79,6 +80,11 @@ public class ComposedRuleElementMatch ex
       innerMatches.put(ruleElement, list);
     }
     list.add(ruleElementMatch);
+
+    if (list.size() > stream.getMaxRuleElementMatches()) {
+      throw new RutaProcessRuntimeException("Rule element exceeded the allowed amount of matches ("
+              + stream.getMaxRuleElementMatches() + "): " + ruleElement.toString());
+    }
     evaluateInnerMatches(included, stream);
     enforceUpdate();
   }

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=1849363&r1=1849362&r2=1849363&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 Thu Dec 20 08:30:47 2018
@@ -58,10 +58,10 @@ public class ConjunctRulesRuleElement ex
         }
       }
       allMatched &= oneMatched;
-      
+
       // only the matches that actually matched successfully
       for (RuleMatch eachRuleMatch : startMatch) {
-        if(eachRuleMatch.matched()) {
+        if (eachRuleMatch.matched()) {
           result.add(eachRuleMatch);
         }
       }
@@ -70,7 +70,7 @@ public class ConjunctRulesRuleElement ex
     for (RuleMatch each : result) {
       if (!each.isApplied()) {
         each.setMatched(allMatched);
-        ruleApply.add(each);
+        ruleApply.add(each, stream);
         if (each.matched() && allMatched) {
           each.getRule().getRoot().applyRuleElements(each, stream, crowd);
         }

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RegExpRule.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RegExpRule.java?rev=1849363&r1=1849362&r2=1849363&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RegExpRule.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RegExpRule.java Thu Dec 20 08:30:47 2018
@@ -100,7 +100,7 @@ public class RegExpRule extends Abstract
       }
       List<AnnotationFS> matchedAnnotationsOfRoot = ruleMatch.getMatchedAnnotationsOfRoot();
       if (matchedAnnotationsOfRoot != null && !matchedAnnotationsOfRoot.isEmpty()) {
-        ruleApply.add(ruleMatch);
+        ruleApply.add(ruleMatch, stream);
       }
     }
 

Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleApply.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleApply.java?rev=1849363&r1=1849362&r2=1849363&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleApply.java (original)
+++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RuleApply.java Thu Dec 20 08:30:47 2018
@@ -22,7 +22,9 @@ package org.apache.uima.ruta.rule;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.uima.ruta.RutaProcessRuntimeException;
 import org.apache.uima.ruta.RutaStatement;
+import org.apache.uima.ruta.RutaStream;
 import org.apache.uima.ruta.ScriptApply;
 
 public class RuleApply extends ScriptApply {
@@ -45,7 +47,7 @@ public class RuleApply extends ScriptApp
     return list;
   }
 
-  public void add(AbstractRuleMatch<? extends AbstractRule> match) {
+  public void add(AbstractRuleMatch<? extends AbstractRule> match, RutaStream stream) {
     if (match.matchedCompletely()) {
       applied++;
     }
@@ -53,6 +55,10 @@ public class RuleApply extends ScriptApp
     if (acceptMatches) {
       list.add(match);
     }
+    if (tried > stream.getMaxRuleMatches()) {
+      throw new RutaProcessRuntimeException("Rule exceeded the allowed amount of matches ("
+              + stream.getMaxRuleMatches() + "): " + match.getRule().toString());
+    }
   }
 
   public int getTried() {
@@ -71,9 +77,9 @@ public class RuleApply extends ScriptApp
     this.acceptMatches = acceptMatches;
   }
 
-  public void addAll(List<RuleMatch> matches) {
+  public void addAll(List<RuleMatch> matches, RutaStream stream) {
     for (RuleMatch ruleMatch : matches) {
-      add(ruleMatch);
+      add(ruleMatch, stream);
     }
   }
 

Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java?rev=1849363&r1=1849362&r2=1849363&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java (original)
+++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java Thu Dec 20 08:30:47 2018
@@ -31,6 +31,7 @@ import org.apache.uima.analysis_engine.A
 import org.apache.uima.cas.CAS;
 import org.apache.uima.fit.factory.AnalysisEngineFactory;
 import org.apache.uima.jcas.JCas;
+import org.apache.uima.ruta.RutaProcessRuntimeException;
 import org.apache.uima.ruta.TypeUsageInformation;
 import org.junit.Assert;
 import org.junit.Test;
@@ -104,4 +105,50 @@ public class RutaEngineTest {
     }
   }
 
+  @Test
+  public void testMaxRuleMatches() throws Throwable {
+
+    String document = "This is some text.";
+    String script = "W;";
+
+    AnalysisEngine ae = AnalysisEngineFactory.createEngine(RutaEngine.class, RutaEngine.PARAM_RULES,
+            script, RutaEngine.PARAM_MAX_RULE_MATCHES, Long.valueOf(2));
+
+    CAS cas = RutaTestUtils.getCAS(document);
+
+    try {
+      ae.process(cas);
+    } catch (AnalysisEngineProcessException e) {
+      Throwable cause = e.getCause();
+      Assert.assertTrue(cause instanceof RutaProcessRuntimeException);
+      String message = cause.getMessage();
+      Assert.assertTrue(message.startsWith("Rule exceeded the allowed amount of matches"));
+      return;
+    }
+    Assert.fail("expected RutaProcessRuntimeException");
+  }
+
+  @Test
+  public void testMaxRuleElementMatches() throws Throwable {
+
+    String document = "This is some text.";
+    String script = "W+;";
+
+    AnalysisEngine ae = AnalysisEngineFactory.createEngine(RutaEngine.class, RutaEngine.PARAM_RULES,
+            script, RutaEngine.PARAM_MAX_RULE_ELEMENT_MATCHES, Long.valueOf(2));
+
+    CAS cas = RutaTestUtils.getCAS(document);
+
+    try {
+      ae.process(cas);
+    } catch (AnalysisEngineProcessException e) {
+      Throwable cause = e.getCause();
+      Assert.assertTrue(cause instanceof RutaProcessRuntimeException);
+      String message = cause.getMessage();
+      Assert.assertTrue(message.startsWith("Rule element exceeded the allowed amount of matches"));
+      return;
+    }
+    Assert.fail("expected RutaProcessRuntimeException");
+  }
+
 }

Modified: uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.overview.xml
URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.overview.xml?rev=1849363&r1=1849362&r2=1849363&view=diff
==============================================================================
--- uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.overview.xml (original)
+++ uima/ruta/trunk/ruta-docbook/src/docbook/tools.ruta.overview.xml Thu Dec 20 08:30:47 2018
@@ -972,6 +972,23 @@ Document{-> EXEC(MyAnalysisEngine, {MyTy
                   </entry>
                   <entry>Multi String</entry>
                 </row>
+                <row>
+                  <entry>
+                    <link linkend='ugr.tools.ruta.ae.basic.parameter.maxRuleMatches'>maxRuleMatches</link>
+                  </entry>
+                  <entry>Maximum amount of allowed matches of a single rule.
+                  </entry>
+                  <entry>Single Integer</entry>
+                </row>
+                <row>
+                  <entry>
+                    <link linkend='ugr.tools.ruta.ae.basic.parameter.maxRuleMatches'>maxRuleElementMatches</link>
+                  </entry>
+                  <entry>Maximum amount of allowed matches of a single rule element.
+                  </entry>
+                  <entry>Single Integer</entry>
+                </row>
+                
               </tbody>
             </tgroup>
           </table>
@@ -1266,6 +1283,18 @@ Document{-> EXEC(MyAnalysisEngine, {MyTy
    			applying the rules.
           </para>
         </section>
+        <section id="ugr.tools.ruta.ae.basic.parameter.maxRuleMatches">
+          <title>maxRuleMatches</title>
+          <para>
+             Maximum amount of allowed matches of a single rule.
+          </para>
+        </section>
+        <section id="ugr.tools.ruta.ae.basic.parameter.maxRuleElementMatches">
+          <title>maxRuleElementMatches</title>
+          <para>
+             Maximum amount of allowed matches of a single rule element.
+          </para>
+        </section>
       </section>
     </section>
     <section id="ugr.tools.ruta.ae.annotationwriter">