Author: pkluegl Date: Fri Dec 21 11:03:52 2018 New Revision: 1849458 URL: http://svn.apache.org/viewvc?rev=1849458&view=rev Log: UIMA-5863: reassign label for removed match
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/quantifier/AbstractRuleElementQuantifier.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxGreedy.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxReluctant.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusGreedy.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusReluctant.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionGreedy.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionReluctant.java uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/StarGreedy.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=1849458&r1=1849457&r2=1849458&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 Dec 21 11:03:52 2018 @@ -1117,6 +1117,15 @@ public class RutaEnvironment { return; } List<AnnotationFS> annotations = ruleMatch.getMatchedAnnotationsOfElement(element); + addAnnotationsToVariable(annotations, var, context); + } + + public void addAnnotationsToVariable(List<AnnotationFS> annotations, String var, + MatchContext context) { + if (StringUtils.isBlank(var)) { + return; + } + Class<?> variableType = getVariableType(var); if (List.class.equals(variableType) && AnnotationFS.class.equals(getVariableGenericType(var))) { setVariableValue(var, annotations); 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=1849458&r1=1849457&r2=1849458&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 Fri Dec 21 11:03:52 2018 @@ -21,7 +21,12 @@ package org.apache.uima.ruta.rule.quanti import java.util.List; +import org.apache.commons.lang.StringUtils; +import org.apache.uima.cas.text.AnnotationFS; +import org.apache.uima.ruta.RutaEnvironment; +import org.apache.uima.ruta.RutaStream; import org.apache.uima.ruta.rule.ComposedRuleElement; +import org.apache.uima.ruta.rule.MatchContext; import org.apache.uima.ruta.rule.RuleElement; import org.apache.uima.ruta.rule.RuleElementContainer; import org.apache.uima.ruta.rule.RuleElementMatch; @@ -54,12 +59,32 @@ public abstract class AbstractRuleElemen RuleElement nextElement = null; RuleElementContainer container = ruleElement.getContainer(); RuleElement previousElement = ruleElement; - while(nextElement == null && container instanceof ComposedRuleElement) { + while (nextElement == null && container instanceof ComposedRuleElement) { nextElement = container.getNextElement(after, previousElement); - previousElement = ((ComposedRuleElement)container); - container = ((ComposedRuleElement)container).getContainer(); + previousElement = ((ComposedRuleElement) container); + container = ((ComposedRuleElement) container).getContainer(); } return nextElement; } - + + protected void updateLabelAssignment(List<RuleElementMatch> matches, MatchContext context, + RutaStream stream) { + + RutaEnvironment environment = context.getParent().getEnvironment(); + RuleElement ruleElement = context.getElement(); + String label = ruleElement.getLabel(); + + if (matches == null || matches.isEmpty()) { + environment.addAnnotationsToVariable(null, label, context); + return; + } + + if (!StringUtils.isBlank(label)) { + + RuleElementMatch ruleElementMatch = matches.get(matches.size() - 1); + List<AnnotationFS> textsMatched = ruleElementMatch.getTextsMatched(); + environment.addAnnotationsToVariable(textsMatched, label, context); + } + } + } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxGreedy.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxGreedy.java?rev=1849458&r1=1849457&r2=1849458&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxGreedy.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxGreedy.java Fri Dec 21 11:03:52 2018 @@ -60,6 +60,7 @@ public class MinMaxGreedy extends Abstra RuleElementMatch ruleElementMatch = matches.get(matches.size() - 1); if (!ruleElementMatch.matched()) { matches.remove(ruleElementMatch); + updateLabelAssignment(matches, context, stream); } } Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxReluctant.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxReluctant.java?rev=1849458&r1=1849457&r2=1849458&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxReluctant.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/MinMaxReluctant.java Fri Dec 21 11:03:52 2018 @@ -69,6 +69,7 @@ public class MinMaxReluctant extends Abs RuleElementMatch ruleElementMatch = matches.get(matches.size() - 1); if (!ruleElementMatch.matched()) { matches.remove(ruleElementMatch); + updateLabelAssignment(matches, context, stream); } } int matchedSize = matches.size(); Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusGreedy.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusGreedy.java?rev=1849458&r1=1849457&r2=1849458&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusGreedy.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusGreedy.java Fri Dec 21 11:03:52 2018 @@ -49,6 +49,7 @@ public class PlusGreedy extends Abstract } if (!result && matches.size() > 1) { matches.remove(matches.size() - 1); + updateLabelAssignment(matches, context, stream); result = true; } if (matches.size() < 1 || allEmpty) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusReluctant.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusReluctant.java?rev=1849458&r1=1849457&r2=1849458&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusReluctant.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/PlusReluctant.java Fri Dec 21 11:03:52 2018 @@ -44,6 +44,7 @@ public class PlusReluctant extends Abstr } if (!result && matches.size() > 1) { matches.remove(matches.size() - 1); + updateLabelAssignment(matches, context, stream); result = true; } if (matches.size() < 1 || allEmpty) { @@ -68,7 +69,7 @@ public class PlusReluctant extends Abstr if (ownList == null || ownList.isEmpty()) { return true; } - + RuleElement nextElement = getNextRuleElement(after, ruleElement); if (nextElement == null) { return false; Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionGreedy.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionGreedy.java?rev=1849458&r1=1849457&r2=1849458&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionGreedy.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionGreedy.java Fri Dec 21 11:03:52 2018 @@ -40,11 +40,12 @@ public class QuestionGreedy extends Abst return Collections.emptyList(); } for (RuleElementMatch match : matches) { - result &= match.matched() - || (!(match instanceof ComposedRuleElementMatch) && match.getTextsMatched().isEmpty()); + result &= match.matched() || (!(match instanceof ComposedRuleElementMatch) + && match.getTextsMatched().isEmpty()); } if (!result) { matches.remove(0); + updateLabelAssignment(matches, context, stream); result = true; } if (result) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionReluctant.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionReluctant.java?rev=1849458&r1=1849457&r2=1849458&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionReluctant.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/QuestionReluctant.java Fri Dec 21 11:03:52 2018 @@ -41,6 +41,7 @@ public class QuestionReluctant extends A } if (!result) { matches.remove(0); + updateLabelAssignment(matches, context, stream); result = true; } if (result) { Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/StarGreedy.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/StarGreedy.java?rev=1849458&r1=1849457&r2=1849458&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/StarGreedy.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/quantifier/StarGreedy.java Fri Dec 21 11:03:52 2018 @@ -42,11 +42,12 @@ public class StarGreedy extends Abstract return null; } for (RuleElementMatch match : matches) { - result &= match.matched() - || (!(match instanceof ComposedRuleElementMatch) && match.getTextsMatched().isEmpty()); + result &= match.matched() || (!(match instanceof ComposedRuleElementMatch) + && match.getTextsMatched().isEmpty()); } if (!result && matches.size() > 0) { matches.remove(matches.size() - 1); + updateLabelAssignment(matches, context, stream); result = true; } if (result) { 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=1849458&r1=1849457&r2=1849458&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 Dec 21 11:03:52 2018 @@ -654,9 +654,9 @@ public class AnnotationLabelExpressionTe script += "s1:Struct{IS(PERIOD), s1.a.b -> T8};"; CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap); Ruta.apply(cas, script); - + RutaTestUtils.storeCas(cas, "testStackedReinitLazyFeature"); - + RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some"); RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some"); RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Some"); @@ -712,4 +712,40 @@ public class AnnotationLabelExpressionTe return cas; } + @Test + public void testLabelAssignmentInFailedQuantifier() throws Exception { + + String document = "a 1 a a 1 a a 1 a"; + + String script = "NUM{-> T1, T2, T3, T4, T7, T8};\n"; + script += "SW{-> T5, T6};\n"; + + script += "ps:T1{-> ps.end = a.end} a:ANY[1,10]{-PARTOF(T1)};\n"; + script += "a:ANY[1,10]{-PARTOF(T2)} ps:@T2{-> ps.begin = a.begin};\n"; + + script += "ps:T3{-> ps.end = a.end} a:ANY+{-PARTOF(T3)};\n"; + script += "a:ANY+{-PARTOF(T4)} ps:@T4{-> ps.begin = a.begin};\n"; + +// script += "ps:T5{-> ps.end = a.end} a:ANY?{-PARTOF(T5)};\n"; +// script += "a:ANY?{-PARTOF(T6)} ps:@T6{-> ps.begin = a.begin};\n"; + +// script += "ps:T7{-> ps.end = a.end} a:ANY*?{-PARTOF(T7)};\n"; +// script += "a:ANY*?{-PARTOF(T8)} ps:@T8{-> ps.begin = a.begin};\n"; + + CAS cas = RutaTestUtils.getCAS(document); + Ruta.apply(cas, script); + + RutaTestUtils.assertAnnotationsEquals(cas, 1, 3, "1 a a", "1 a a", "1 a"); + RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "a 1", "a a 1", "a a 1"); + + RutaTestUtils.assertAnnotationsEquals(cas, 3, 3, "1 a a", "1 a a", "1 a"); + RutaTestUtils.assertAnnotationsEquals(cas, 4, 3, "a 1", "a a 1", "a a 1"); + +// RutaTestUtils.assertAnnotationsEquals(cas, 5, 6, "a 1", "a", "a 1", "a", "a 1", "a"); +// RutaTestUtils.assertAnnotationsEquals(cas, 6, 6, "a", "1 a", "a", "1 a", "a", "1 a"); + +// RutaTestUtils.assertAnnotationsEquals(cas, 7, 3, "1 a a", "1 a a", "1 a"); +// RutaTestUtils.assertAnnotationsEquals(cas, 8, 3, "a 1", "a a 1", "a a 1"); + } + }