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


Reply via email to