Author: pkluegl Date: Fri Nov 8 13:08:01 2019 New Revision: 1869556 URL: http://svn.apache.org/viewvc?rev=1869556&view=rev Log: UIMA-6148: define also a list for single annotation, so that features expression could later be used by the list interface
Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListDelegateVariableExpression.java Modified: 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/rule/RutaAnnotationTypeMatcher.java uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java 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=1869556&r1=1869555&r2=1869556&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 Nov 8 13:08:01 2019 @@ -208,7 +208,7 @@ public class AnnotationTypeExpression ex } if (annotationListExpression != null) { List<AnnotationFS> result = annotationListExpression.getAnnotationList(context, stream); - if (featureExpression != null) { + if (result != null && featureExpression != null) { return new ArrayList<>(featureExpression.getAnnotations(result, true, context, stream)); } else { return result; 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=1869556&r1=1869555&r2=1869556&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 Nov 8 13:08:01 2019 @@ -27,6 +27,7 @@ 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.AnnotationListDelegateVariableExpression; import org.apache.uima.ruta.expression.annotation.AnnotationListVariableExpression; import org.apache.uima.ruta.expression.annotation.AnnotationListVariableIndexExpression; import org.apache.uima.ruta.expression.annotation.AnnotationVariableExpression; @@ -164,6 +165,7 @@ public class MatchReference extends Ruta return true; } else if (environment.isVariableOfType(candidate, RutaConstants.RUTA_VARIABLE_ANNOTATION)) { annotationExpression = new AnnotationVariableExpression(candidate); + annotationListExpression = new AnnotationListDelegateVariableExpression(candidate); return true; } else if (environment.isVariableOfType(candidate, RutaConstants.RUTA_VARIABLE_ANNOTATION_LIST)) { Added: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListDelegateVariableExpression.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListDelegateVariableExpression.java?rev=1869556&view=auto ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListDelegateVariableExpression.java (added) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/expression/annotation/AnnotationListDelegateVariableExpression.java Fri Nov 8 13:08:01 2019 @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.uima.ruta.expression.annotation; + +import java.util.Arrays; +import java.util.List; + +import org.apache.uima.cas.text.AnnotationFS; +import org.apache.uima.ruta.RutaStream; +import org.apache.uima.ruta.block.RutaBlock; +import org.apache.uima.ruta.rule.MatchContext; + +public class AnnotationListDelegateVariableExpression extends AbstractAnnotationListExpression { + + private String var; + + public AnnotationListDelegateVariableExpression(String var) { + super(); + this.var = var; + } + + @Override + public List<AnnotationFS> getList(MatchContext context, RutaStream stream) { + + RutaBlock parent = context.getParent(); + AnnotationFS variableValue = parent.getEnvironment().getVariableValue(var, AnnotationFS.class, + stream); + + if (variableValue != null) { + return Arrays.asList(variableValue); + } + + return null; + } + +} Modified: uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaAnnotationTypeMatcher.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaAnnotationTypeMatcher.java?rev=1869556&r1=1869555&r2=1869556&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaAnnotationTypeMatcher.java (original) +++ uima/ruta/trunk/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaAnnotationTypeMatcher.java Fri Nov 8 13:08:01 2019 @@ -53,11 +53,15 @@ public class RutaAnnotationTypeMatcher i // just for forcing expression top initialize // TODO this is maybe a bit expensive sometimes expression.getType(context, stream); - if (expression.getAnnotationExpression() != null) { + if (expression.getAnnotationListExpression() != null) { + result = expression.getAnnotationList(context, stream); + if (result == null) { + // avoid null lists here + result = Collections.emptyList(); + } + } else if (expression.getAnnotationExpression() != null) { result = new ArrayList<>(1); result.add(expression.getAnnotation(context, stream)); - } else if (expression.getAnnotationListExpression() != null) { - result = expression.getAnnotationList(context, stream); } else { // TODO defer to getter of expression? Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java?rev=1869556&r1=1869555&r2=1869556&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java (original) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java Fri Nov 8 13:08:01 2019 @@ -19,13 +19,17 @@ package org.apache.uima.ruta.block; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.TreeMap; import org.apache.uima.cas.CAS; import org.apache.uima.ruta.engine.Ruta; import org.apache.uima.ruta.engine.RutaEngine; import org.apache.uima.ruta.engine.RutaTestUtils; +import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature; import org.apache.uima.ruta.seed.TextSeeder; import org.junit.Ignore; import org.junit.Test; @@ -209,4 +213,27 @@ public class ForEachBlockTest { RutaTestUtils.assertAnnotationsEquals(cas, 1, 3, "1", "22", "333"); } + @Test + public void testFSArrayFeatureMatch() throws Exception { + String script = "Document {-> s:Struct, s.elements = SW};"; + script += "FOREACH(struct) Struct{} {\n"; + script += "struct.elements{-> T1};\n"; + script += "}\n"; + + Map<String, String> typeMap = new TreeMap<String, String>(); + String typeName1 = "Struct"; + typeMap.put(typeName1, "uima.tcas.Annotation"); + + Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>(); + List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>(); + featureMap.put(typeName1, list); + String fn1 = "elements"; + list.add(new TestFeature(fn1, "", "uima.cas.FSArray")); + + CAS cas = RutaTestUtils.getCAS("This is a test.", typeMap, featureMap); + Ruta.apply(cas, script); + + RutaTestUtils.assertAnnotationsEquals(cas, 1, 3, "is", "a", "test"); + } + } Modified: uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java URL: http://svn.apache.org/viewvc/uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java?rev=1869556&r1=1869555&r2=1869556&view=diff ============================================================================== --- uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java (original) +++ uima/ruta/trunk/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java Fri Nov 8 13:08:01 2019 @@ -28,7 +28,7 @@ import org.junit.Test; public class RutaScriptBlockTest { @Test - public void testInnerDocumentMatch() { + public void testInnerDocumentMatch() throws Exception { String document = "Some text"; String script = ""; script += "CW{ -> CREATE(RutaAnnotation, \"score\"=1)};"; @@ -39,19 +39,12 @@ public class RutaScriptBlockTest { script += "RutaAnnotation{-> T3};"; script += "}"; - CAS cas = null; - try { - cas = RutaTestUtils.getCAS(document); - Ruta.apply(cas, script); - } catch (Exception e) { - e.printStackTrace(); - } + CAS cas = RutaTestUtils.getCAS(document); + Ruta.apply(cas, script); RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some"); RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some"); RutaTestUtils.assertAnnotationsEquals(cas, 3, 2, "Some", "Some"); - - cas.release(); } @Test @@ -78,7 +71,6 @@ public class RutaScriptBlockTest { Ruta.apply(cas, script); RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); - cas.release(); } @Test @@ -92,7 +84,6 @@ public class RutaScriptBlockTest { Ruta.apply(cas, script); RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "1", "22", "333"); - cas.release(); } }