blob: 0d24944223c037f53e9999e8bc3e4ec589adbf4e [file] [log] [blame]
/*
* 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.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.Feature;
import org.apache.uima.cas.FeatureStructure;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.fit.util.FSCollectionFactory;
import org.apache.uima.jcas.cas.FSArray;
import org.apache.uima.ruta.engine.Ruta;
import org.apache.uima.ruta.engine.RutaTestUtils;
import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;
import org.junit.Test;
public class AnnotationFeatureExpressionTest {
@Test
public void testList() throws Exception {
String document = "Some text.";
String script = "";
script += "W{-> CREATE(Inner, \"a\"=W)};";
script += "Document{-> CREATE(Struct, \"as\"=Inner)};";
script += "Struct.as{->T1};";
script += "Struct.as.a{->T2};";
script += "Struct{-> TRIM(PERIOD)};";
script += "Struct.as{->T3} @PERIOD;";
script += "Struct.as.a{->T4} @PERIOD;";
Map<String, String> typeMap = new TreeMap<String, String>();
String typeName1 = "Struct";
typeMap.put(typeName1, "uima.tcas.Annotation");
String typeName2 = "Inner";
typeMap.put(typeName2, "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 = "as";
list.add(new TestFeature(fn1, "", "uima.cas.FSArray"));
list = new ArrayList<RutaTestUtils.TestFeature>();
featureMap.put(typeName2, list);
String fn2 = "a";
list.add(new TestFeature(fn2, "", "uima.cas.FSArray"));
CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "Some", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "Some", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 3, 2, "Some", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 4, 2, "Some", "text");
}
@Test
public void testIndex() throws Exception {
String document = "Some text.";
String script = "";
script += "W{-> CREATE(Inner, \"a\"=W)};";
script += "Document{-> CREATE(Struct, \"as\"=Inner)};";
script += "Struct.as[0]{->T1};";
script += "Struct.as[1]{->T2};";
script += "Struct.as[0].a{->T3};";
script += "Struct.as[1].a{->T4};";
Map<String, String> typeMap = new TreeMap<String, String>();
String typeName1 = "Struct";
typeMap.put(typeName1, "uima.tcas.Annotation");
String typeName2 = "Inner";
typeMap.put(typeName2, "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 = "as";
list.add(new TestFeature(fn1, "", "uima.cas.FSArray"));
list = new ArrayList<RutaTestUtils.TestFeature>();
featureMap.put(typeName2, list);
String fn2 = "a";
list.add(new TestFeature(fn2, "", "uima.cas.FSArray"));
CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some");
RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "text");
RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Some");
RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "text");
}
@Test
public void testStringArray() throws Exception {
String document = "Some text.";
String script = "";
script += "W{-> CREATE(Struct, \"as\"={\"text\"})};\n";
script += "Struct{CONTAINS(Struct.as, Struct.ct)-> T1};\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 = "as";
list.add(new TestFeature(fn1, "", "uima.cas.StringArray"));
CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "text");
}
@Test
public void testFeatureStructureFeature() throws Exception {
String document = "Some text.";
Map<String, String> typeMap = new TreeMap<String, String>();
String typeName1 = "A1";
typeMap.put(typeName1, "uima.tcas.Annotation");
String typeName2 = "FS1";
typeMap.put(typeName2, "uima.cas.TOP");
Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
featureMap.put(typeName1, list);
String fn1 = "fss";
list.add(new TestFeature(fn1, "", "uima.cas.FSArray"));
String fn2 = "fs";
list.add(new TestFeature(fn2, "", "uima.cas.TOP"));
list = new ArrayList<RutaTestUtils.TestFeature>();
featureMap.put(typeName2, list);
String fn3 = "fss";
list.add(new TestFeature(fn3, "", "uima.cas.FSArray"));
String fn4 = "fs";
list.add(new TestFeature(fn4, "", "uima.cas.TOP"));
String fn5 = "s";
list.add(new TestFeature(fn5, "", "uima.cas.String"));
CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
Type type1 = cas.getTypeSystem().getType(typeName1);
Feature type1fss = type1.getFeatureByBaseName(fn1);
Feature type1fs = type1.getFeatureByBaseName(fn2);
Type type2 = cas.getTypeSystem().getType(typeName2);
Feature type2fss = type2.getFeatureByBaseName(fn3);
Feature type2fs = type2.getFeatureByBaseName(fn4);
Feature type2s = type2.getFeatureByBaseName(fn5);
AnnotationFS a1 = cas.createAnnotation(type1, 0, 4);
AnnotationFS a2 = cas.createAnnotation(type1, 5, 9);
FeatureStructure fs1 = cas.createFS(type2);
FeatureStructure fs2 = cas.createFS(type2);
FSArray<FeatureStructure> fsArray1 = FSCollectionFactory.createFSArray(cas.getJCas(),
new FeatureStructure[] { fs1, fs2 });
fs1.setStringValue(type2s, "1");
fs2.setStringValue(type2s, "2");
fs1.setFeatureValue(type2fs, a2);
fs2.setFeatureValue(type2fs, a1);
fs1.setFeatureValue(type2fss, fsArray1);
fs2.setFeatureValue(type2fss, fsArray1);
a1.setFeatureValue(type1fs, fs1);
a1.setFeatureValue(type1fss, fsArray1);
a2.setFeatureValue(type1fs, fs2);
a2.setFeatureValue(type1fss, fsArray1);
cas.addFsToIndexes(a1);
cas.addFsToIndexes(a2);
StringBuilder script = new StringBuilder();
script.append("A1.fs.s==\"1\"{-> T1};\n");
script.append("A1.fs.s==\"2\"{-> T2};\n");
script.append("A1.fs{-> T3};\n");
script.append("A1.fss{-> T4};\n");
script.append("A1.fss.fs{-> T5};\n");
script.append("A1.fss.fs.fs{-> T6};\n");
script.append("A1.fss.fs.fs.s == \"1\"{-> T7};\n");
script.append("A1.fss.fss.s == \"1\"{-> T8};\n");
script.append("a:A1 {a.fss.fss.s == \"1\" -> T9};\n");
script.append("a:A1 {a.fs.s==\"1\" -> T10};\n");
Ruta.apply(cas, script.toString());
RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some");
RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "text");
RutaTestUtils.assertAnnotationsEquals(cas, 3, 2, "Some", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 4, 4, "Some", "Some", "text", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 5, 4, "Some", "Some", "text", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 6, 4, "Some", "Some", "text", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 7, 2, "Some", "Some");
RutaTestUtils.assertAnnotationsEquals(cas, 8, 4, "Some", "Some", "text", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 9, 2, "Some", "text");
RutaTestUtils.assertAnnotationsEquals(cas, 10, 1, "Some");
}
@Test
public void testFeatureMatch() throws Exception {
String document = "This is a test.";
String script = "";
script += "Document{-> CREATE(Struct1, \"a\" = SW.begin == 8)};\n";
script += "Struct1.a{-> T1};\n";
Map<String, String> complexTypes = new TreeMap<String, String>();
complexTypes.put("Struct1", "uima.tcas.Annotation");
Map<String, List<TestFeature>> features = new TreeMap<String, List<TestFeature>>();
List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
features.put("Struct1", list);
list.add(new TestFeature("a", "", "uima.tcas.Annotation"));
list.add(new TestFeature("as", "", "uima.cas.FSArray"));
CAS cas = RutaTestUtils.getCAS(document, complexTypes, features);
Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "a");
}
@Test
public void testFeatureAssignmentByFeatureMatch() throws Exception {
String document = "This is a Test.";
String script = "";
script += "SW{-> Word, Word.small = true};\n";
script += "CW{-> Word, Word.small = false};\n";
script += "Document{-> CREATE(Struct1, \"smallW\" = Word.small == true, \"capitalW\" = Word.small == false)};\n";
script += "Struct1.smallW{-> T1};\n";
script += "Struct1.capitalW{-> T2};\n";
Map<String, String> complexTypes = new TreeMap<String, String>();
complexTypes.put("Struct1", "uima.tcas.Annotation");
complexTypes.put("Word", "uima.tcas.Annotation");
Map<String, List<TestFeature>> features = new TreeMap<String, List<TestFeature>>();
List<TestFeature> struct1Features = new ArrayList<RutaTestUtils.TestFeature>();
features.put("Struct1", struct1Features);
struct1Features.add(new TestFeature("smallW", "", "uima.cas.FSArray"));
struct1Features.add(new TestFeature("capitalW", "", "uima.cas.FSArray"));
List<TestFeature> wordFeatures = new ArrayList<RutaTestUtils.TestFeature>();
features.put("Word", wordFeatures);
wordFeatures.add(new TestFeature("small", "", "uima.cas.Boolean"));
CAS cas = RutaTestUtils.getCAS(document, complexTypes, features);
Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "is", "a");
RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "This", "Test");
}
@Test
public void testPartofOnNullMatch() throws Exception {
String document = "Some text.";
String script = "";
script += "W{-> CREATE(Struct)};\n";
script += "Struct.a{PARTOF(CW)-> T1};\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 = "a";
list.add(new TestFeature(fn1, "", "uima.tcas.Annotation"));
CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
Ruta.apply(cas, script);
}
@Test
public void testAnnotationComparison() throws Exception {
String document = "Some text for testing.";
String t40String = "for testing.";
String script = "ANNOTATION a;\n";
script += "ANNOTATIONLIST as;\n";
script += "ANNOTATION a2;\n";
script += "ANNOTATIONLIST as2;\n";
script += "Document{-> a = CW};\n";
script += "Document{-> as = SW};\n";
script += "(W W @PERIOD){-> T40};\n";
script += "T40{-> a2 = PERIOD};\n";
script += "T40{-> as2 = SW};\n";
script += "Document{-> CREATE(Struct1, \"a\" = CW, \"as\" = SW )};\n";
script += "T40{-> CREATE(Struct2, \"a\" = PERIOD, \"as\" = SW )};\n";
script += "Document{Struct1.a == a -> T1};\n";
script += "Document{Struct1.as == as -> T2};\n";
script += "Document{Struct1.a != a -> T3};\n";
script += "Document{Struct1.as != as -> T4};\n";
script += "Struct1.a == a { -> T5};\n";
script += "Struct1.as == as { -> T6};\n";
script += "T40{Struct2.a == a2 -> T7};\n";
script += "T40{Struct2.as == as2 -> T8};\n";
script += "T40{Struct2.a != a2 -> T9};\n";
script += "T40{Struct2.as != as2 -> T10};\n";
script += "Struct2.a == a2 { -> T11};\n";
script += "Struct2.as == as2 { -> T12};\n";
script += "Document{a != a2 -> T13};\n";
script += "Document{as != as2 -> T14};\n";
Map<String, String> typeMap = new TreeMap<String, String>();
String typeName1 = "Struct1";
typeMap.put(typeName1, "uima.tcas.Annotation");
String typeName2 = "Struct2";
typeMap.put(typeName2, "uima.tcas.Annotation");
Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
featureMap.put(typeName1, list);
featureMap.put(typeName2, list);
String fn1 = "a";
list.add(new TestFeature(fn1, "", "uima.tcas.Annotation"));
String fn2 = "as";
list.add(new TestFeature(fn2, "", "uima.cas.FSArray"));
CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
Ruta.apply(cas, script);
RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, document);
RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, document);
RutaTestUtils.assertAnnotationsEquals(cas, 3, 0);
RutaTestUtils.assertAnnotationsEquals(cas, 4, 0);
RutaTestUtils.assertAnnotationsEquals(cas, 5, 1, document);
RutaTestUtils.assertAnnotationsEquals(cas, 6, 1, document);
RutaTestUtils.assertAnnotationsEquals(cas, 7, 1, t40String);
RutaTestUtils.assertAnnotationsEquals(cas, 8, 1, t40String);
RutaTestUtils.assertAnnotationsEquals(cas, 9, 0);
RutaTestUtils.assertAnnotationsEquals(cas, 10, 0);
RutaTestUtils.assertAnnotationsEquals(cas, 11, 1, t40String);
RutaTestUtils.assertAnnotationsEquals(cas, 12, 1, t40String);
RutaTestUtils.assertAnnotationsEquals(cas, 13, 1, document);
RutaTestUtils.assertAnnotationsEquals(cas, 14, 1, document);
}
}