| /* |
| * 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; |
| |
| import java.util.LinkedHashMap; |
| import java.util.Map; |
| |
| import org.apache.uima.cas.CAS; |
| import org.apache.uima.cas.text.AnnotationFS; |
| import org.apache.uima.fit.util.CasUtil; |
| import org.apache.uima.ruta.engine.Ruta; |
| import org.apache.uima.ruta.engine.RutaEngine; |
| import org.apache.uima.ruta.engine.RutaTestUtils; |
| import org.junit.Test; |
| |
| public class ReindexUpdateModeTest { |
| |
| @Test |
| public void testComplete() throws Exception { |
| |
| Map<String, Object> params = new LinkedHashMap<>(); |
| params.put(RutaEngine.PARAM_REINDEX_UPDATE_MODE, ReindexUpdateMode.COMPLETE); |
| |
| CAS cas = RutaTestUtils.getCAS("This is 1 TEST."); |
| |
| // initial indexing and create some annotations |
| Ruta.apply(cas, "NUM{-> T1}; CAP{-> T2};", params); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "TEST"); |
| |
| // add T1 on CW, remove T2 on CAP |
| AnnotationFS at3 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 3), 0, 4); |
| cas.addFsToIndexes(at3); |
| CasUtil.select(cas, RutaTestUtils.getTestType(cas, 2)).forEach(a -> { |
| cas.removeFsFromIndexes(a); |
| }); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "This"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T1)->T11};ANY{PARTOF(T2)->T12};ANY{PARTOF(T3)->T13};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T1)->T21};ANY{STARTSWITH(T2)->T22};ANY{STARTSWITH(T3)->T23};", |
| params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T1)->T31};ANY{ENDSWITH(T2)->T32};ANY{ENDSWITH(T3)->T33};", |
| params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 11, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 12, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 13, 1, "This"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 21, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 22, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 23, 1, "This"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 31, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 32, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 33, 1, "This"); |
| |
| // new round with multiple overlapping annotations |
| Ruta.apply(cas, "PERIOD{-> T4, T4}; SW{-> T5};", params); |
| |
| // remove one T4, add another T5 |
| AnnotationFS at4 = CasUtil.select(cas, RutaTestUtils.getTestType(cas, 4)).iterator().next(); |
| cas.removeFsFromIndexes(at4); |
| AnnotationFS at5 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 5), 5, 7); |
| cas.addFsToIndexes(at5); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 5, 2, "is", "is"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T14};ANY{PARTOF(T5)->T15};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T24};ANY{STARTSWITH(T5)->T25};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T34};ANY{ENDSWITH(T5)->T35};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 14, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 15, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 24, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 25, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 34, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 35, 1, "is"); |
| |
| // further modify in ruta, remove T4 completely, remove one T5 |
| Ruta.apply(cas, "t4:T4{-> UNMARK(t4)};", params); |
| Ruta.apply(cas, "t5:T5{CONTAINS(T5,2,10) -> UNMARK(t5)};", params); |
| // T4 -> Tx6, T5 -> Tx7 |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T16};ANY{PARTOF(T5)->T17};"); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T26};ANY{STARTSWITH(T5)->T27};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T36};ANY{ENDSWITH(T5)->T37};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 16, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 17, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 26, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 27, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 36, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 37, 1, "is"); |
| } |
| |
| @Test |
| public void testAdditiveWithExternalUpdate() throws Exception { |
| |
| Map<String, Object> params = new LinkedHashMap<>(); |
| params.put(RutaEngine.PARAM_REINDEX_UPDATE_MODE, ReindexUpdateMode.ADDITIVE); |
| |
| CAS cas = RutaTestUtils.getCAS("This is 1 TEST."); |
| |
| // initial indexing and create some annotations |
| Ruta.apply(cas, "NUM{-> T1}; CAP{-> T2};", params); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "TEST"); |
| |
| // add T1 on CW, remove T2 on CAP |
| AnnotationFS at3 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 3), 0, 4); |
| cas.addFsToIndexes(at3); |
| // RutaBasicUtils.addAnnotation(at3); |
| CasUtil.select(cas, RutaTestUtils.getTestType(cas, 2)).forEach(a -> { |
| cas.removeFsFromIndexes(a); |
| RutaBasicUtils.removeAnnotation(a); |
| }); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "This"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T1)->T11};ANY{PARTOF(T2)->T12};ANY{PARTOF(T3)->T13};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T1)->T21};ANY{STARTSWITH(T2)->T22};ANY{STARTSWITH(T3)->T23};", |
| params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T1)->T31};ANY{ENDSWITH(T2)->T32};ANY{ENDSWITH(T3)->T33};", |
| params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 11, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 12, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 13, 1, "This"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 21, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 22, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 23, 1, "This"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 31, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 32, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 33, 1, "This"); |
| |
| // new round with multiple overlapping annotations |
| Ruta.apply(cas, "PERIOD{-> T4, T4}; SW{-> T5};", params); |
| |
| // remove one T4, add another T5 |
| AnnotationFS at4 = CasUtil.select(cas, RutaTestUtils.getTestType(cas, 4)).iterator().next(); |
| cas.removeFsFromIndexes(at4); |
| RutaBasicUtils.removeAnnotation(at4); |
| AnnotationFS at5 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 5), 5, 7); |
| cas.addFsToIndexes(at5); |
| // RutaBasicUtils.addAnnotation(at5); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 5, 2, "is", "is"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T14};ANY{PARTOF(T5)->T15};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T24};ANY{STARTSWITH(T5)->T25};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T34};ANY{ENDSWITH(T5)->T35};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 14, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 15, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 24, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 25, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 34, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 35, 1, "is"); |
| |
| // further modify in ruta, remove T4 completely, remove one T5 |
| Ruta.apply(cas, "t4:T4{-> UNMARK(t4)};", params); |
| Ruta.apply(cas, "t5:T5{CONTAINS(T5,2,10) -> UNMARK(t5)};", params); |
| // T4 -> Tx6, T5 -> Tx7 |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T16};ANY{PARTOF(T5)->T17};"); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T26};ANY{STARTSWITH(T5)->T27};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T36};ANY{ENDSWITH(T5)->T37};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 16, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 17, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 26, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 27, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 36, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 37, 1, "is"); |
| } |
| |
| @Test |
| public void testSafeAdditive() throws Exception { |
| |
| Map<String, Object> params = new LinkedHashMap<>(); |
| params.put(RutaEngine.PARAM_REINDEX_UPDATE_MODE, ReindexUpdateMode.SAFE_ADDITIVE); |
| |
| CAS cas = RutaTestUtils.getCAS("This is 1 TEST."); |
| |
| // initial indexing and create some annotations |
| Ruta.apply(cas, "NUM{-> T1}; CAP{-> T2};", params); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "TEST"); |
| |
| // add T1 on CW, remove T2 on CAP |
| AnnotationFS at3 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 3), 0, 4); |
| cas.addFsToIndexes(at3); |
| CasUtil.select(cas, RutaTestUtils.getTestType(cas, 2)).forEach(a -> { |
| cas.removeFsFromIndexes(a); |
| }); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "This"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T1)->T11};ANY{PARTOF(T2)->T12};ANY{PARTOF(T3)->T13};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T1)->T21};ANY{STARTSWITH(T2)->T22};ANY{STARTSWITH(T3)->T23};", |
| params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T1)->T31};ANY{ENDSWITH(T2)->T32};ANY{ENDSWITH(T3)->T33};", |
| params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 11, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 12, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 13, 1, "This"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 21, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 22, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 23, 1, "This"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 31, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 32, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 33, 1, "This"); |
| |
| // new round with multiple overlapping annotations |
| Ruta.apply(cas, "PERIOD{-> T4, T4}; SW{-> T5};", params); |
| |
| // remove one T4, add another T5 |
| AnnotationFS at4 = CasUtil.select(cas, RutaTestUtils.getTestType(cas, 4)).iterator().next(); |
| cas.removeFsFromIndexes(at4); |
| AnnotationFS at5 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 5), 5, 7); |
| cas.addFsToIndexes(at5); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 5, 2, "is", "is"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T14};ANY{PARTOF(T5)->T15};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T24};ANY{STARTSWITH(T5)->T25};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T34};ANY{ENDSWITH(T5)->T35};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 14, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 15, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 24, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 25, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 34, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 35, 1, "is"); |
| |
| // further modify in ruta, remove T4 completely, remove one T5 |
| Ruta.apply(cas, "t4:T4{-> UNMARK(t4)};", params); |
| Ruta.apply(cas, "t5:T5{CONTAINS(T5,2,10) -> UNMARK(t5)};", params); |
| // T4 -> Tx6, T5 -> Tx7 |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T16};ANY{PARTOF(T5)->T17};"); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T26};ANY{STARTSWITH(T5)->T27};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T36};ANY{ENDSWITH(T5)->T37};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 16, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 17, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 26, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 27, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 36, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 37, 1, "is"); |
| } |
| |
| @Test |
| public void testNoneWithExternalUpdate() throws Exception { |
| |
| Map<String, Object> params = new LinkedHashMap<>(); |
| params.put(RutaEngine.PARAM_REINDEX_UPDATE_MODE, ReindexUpdateMode.NONE); |
| |
| CAS cas = RutaTestUtils.getCAS("This is 1 TEST."); |
| |
| // initial indexing and create some annotations |
| Ruta.apply(cas, "NUM{-> T1}; CAP{-> T2};", params); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "TEST"); |
| |
| // add T1 on CW, remove T2 on CAP |
| AnnotationFS at3 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 3), 0, 4); |
| cas.addFsToIndexes(at3); |
| RutaBasicUtils.addAnnotation(at3); |
| CasUtil.select(cas, RutaTestUtils.getTestType(cas, 2)).forEach(a -> { |
| cas.removeFsFromIndexes(a); |
| RutaBasicUtils.removeAnnotation(a); |
| }); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 2, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "This"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T1)->T11};ANY{PARTOF(T2)->T12};ANY{PARTOF(T3)->T13};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T1)->T21};ANY{STARTSWITH(T2)->T22};ANY{STARTSWITH(T3)->T23};", |
| params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T1)->T31};ANY{ENDSWITH(T2)->T32};ANY{ENDSWITH(T3)->T33};", |
| params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 11, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 12, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 13, 1, "This"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 21, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 22, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 23, 1, "This"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 31, 1, "1"); |
| RutaTestUtils.assertAnnotationsEquals(cas, 32, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 33, 1, "This"); |
| |
| // new round with multiple overlapping annotations |
| Ruta.apply(cas, "PERIOD{-> T4, T4}; SW{-> T5};", params); |
| |
| // remove one T4, add another T5 |
| AnnotationFS at4 = CasUtil.select(cas, RutaTestUtils.getTestType(cas, 4)).iterator().next(); |
| cas.removeFsFromIndexes(at4); |
| RutaBasicUtils.removeAnnotation(at4); |
| AnnotationFS at5 = cas.createAnnotation(RutaTestUtils.getTestType(cas, 5), 5, 7); |
| cas.addFsToIndexes(at5); |
| RutaBasicUtils.addAnnotation(at5); |
| |
| RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 5, 2, "is", "is"); |
| |
| // apply rules on modifications, 1x partof, 2x startswith, 3x endswith |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T14};ANY{PARTOF(T5)->T15};", params); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T24};ANY{STARTSWITH(T5)->T25};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T34};ANY{ENDSWITH(T5)->T35};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 14, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 15, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 24, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 25, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 34, 1, "."); |
| RutaTestUtils.assertAnnotationsEquals(cas, 35, 1, "is"); |
| |
| // further modify in ruta, remove T4 completely, remove one T5 |
| Ruta.apply(cas, "t4:T4{-> UNMARK(t4)};", params); |
| Ruta.apply(cas, "t5:T5{CONTAINS(T5,2,10) -> UNMARK(t5)};", params); |
| // T4 -> Tx6, T5 -> Tx7 |
| Ruta.apply(cas, "ANY{PARTOF(T4)->T16};ANY{PARTOF(T5)->T17};"); |
| Ruta.apply(cas, "ANY{STARTSWITH(T4)->T26};ANY{STARTSWITH(T5)->T27};", params); |
| Ruta.apply(cas, "ANY{ENDSWITH(T4)->T36};ANY{ENDSWITH(T5)->T37};", params); |
| |
| // partof |
| RutaTestUtils.assertAnnotationsEquals(cas, 16, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 17, 1, "is"); |
| |
| // startswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 26, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 27, 1, "is"); |
| |
| // endswith |
| RutaTestUtils.assertAnnotationsEquals(cas, 36, 0); |
| RutaTestUtils.assertAnnotationsEquals(cas, 37, 1, "is"); |
| } |
| } |