From bb25f8ac4aa27e7e80e736d508005b236f916ea4 Mon Sep 17 00:00:00 2001 From: Richard Eckart de Castilho Date: Wed, 11 Jan 2023 17:39:01 +0100 Subject: [PATCH] Issue #272: select on FSArray seems broken - Added a few simple tests for select on FSArray and FSList - Fixed a bug in FSArray preventing the use of select --- .../apache/uima/cas/impl/SelectFSs_impl.java | 2 +- .../uima/cas/impl/SelectFsFSArrayTest.java | 86 +++++++++++++++++++ .../uima/cas/impl/SelectFsFSListTest.java | 86 +++++++++++++++++++ 3 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSArrayTest.java create mode 100644 uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSListTest.java diff --git a/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java b/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java index c0d6abaa80..6c28ee621d 100644 --- a/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java +++ b/uimaj-core/src/main/java/org/apache/uima/cas/impl/SelectFSs_impl.java @@ -603,7 +603,7 @@ private void prepareTerminalOp() { index = ((LowLevelIndex) index).getSubIndex(ti); } } else { - if (ti.isAnnotationType()) { + if (ti.isAnnotationType() && !isAltSource) { forceAnnotationIndex(); // when index is null, but ti is not null and is annotation } } diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSArrayTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSArrayTest.java new file mode 100644 index 0000000000..c3077d4566 --- /dev/null +++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSArrayTest.java @@ -0,0 +1,86 @@ +/* + * 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.cas.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.uima.cas.FeatureStructure; +import org.apache.uima.jcas.JCas; +import org.apache.uima.jcas.cas.AnnotationBase; +import org.apache.uima.jcas.cas.FSArray; +import org.apache.uima.jcas.tcas.Annotation; +import org.apache.uima.util.CasCreationUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class SelectFsFSArrayTest { + private JCas jcas; + + @BeforeEach + void setup() throws Exception { + jcas = CasCreationUtils.createCas().getJCas(); + jcas.setDocumentText("This is a test."); + } + + @Test + void thatSelectCountWithTypeIsConsistentWithArraySize() throws Exception { + int size = 10; + + FSArray array = new FSArray<>(jcas, size); + for (int i = 0; i < array.size(); i++) { + array.set(i, new Annotation(jcas)); + } + + assertThat(array) // + .hasSize(size) // + .hasSize((int) array.select(Annotation.class).count()) // + .hasSameSizeAs(array.select(Annotation.class)); + + array.addToIndexes(); + + assertThat(array) // + .hasSize(size) // + .hasSize((int) array.select(Annotation.class).count()) // + .hasSameSizeAs(array.select(Annotation.class)); + } + + @Test + void thatSelectCountWithSubTypeIsConsistentWithArraySize() throws Exception { + int size = 10; + + FSArray array = new FSArray<>(jcas, size); + for (int i = 0; i < array.size(); i++) { + switch (i % 2) { + case 0: + array.set(i, new Annotation(jcas)); + break; + case 1: + array.set(i, new AnnotationBase(jcas)); + break; + } + } + + assertThat(array) // + .hasSize(size) // + .hasSize((int) array.select(AnnotationBase.class).count()) + .hasSameSizeAs(array.select(AnnotationBase.class)); + + assertThat(array.select(Annotation.class).count()).isEqualTo(5); + } +} diff --git a/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSListTest.java b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSListTest.java new file mode 100644 index 0000000000..99120503db --- /dev/null +++ b/uimaj-core/src/test/java/org/apache/uima/cas/impl/SelectFsFSListTest.java @@ -0,0 +1,86 @@ +/* + * 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.cas.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.uima.jcas.JCas; +import org.apache.uima.jcas.cas.AnnotationBase; +import org.apache.uima.jcas.cas.NonEmptyFSList; +import org.apache.uima.jcas.cas.TOP; +import org.apache.uima.jcas.tcas.Annotation; +import org.apache.uima.util.CasCreationUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class SelectFsFSListTest { + private JCas jcas; + + @BeforeEach + void setup() throws Exception { + jcas = CasCreationUtils.createCas().getJCas(); + jcas.setDocumentText("This is a test."); + } + + @Test + void thatSelectCountWithTypeIsConsistentWithArraySize() throws Exception { + int size = 10; + + NonEmptyFSList list = new NonEmptyFSList(jcas, new Annotation(jcas)); + for (int i = 1; i < size; i++) { + list = new NonEmptyFSList(jcas, new Annotation(jcas), list); + } + + assertThat(list) // + .hasSize(size) // + .hasSize((int) list.select(Annotation.class).count()) // + .hasSameSizeAs(list.select(Annotation.class)); + + list.addToIndexes(); + + assertThat(list) // + .hasSize(size) // + .hasSize((int) list.select(Annotation.class).count()) // + .hasSameSizeAs(list.select(Annotation.class)); + } + + @Test + void thatSelectCountWithSubTypeIsConsistentWithArraySize() throws Exception { + int size = 10; + + NonEmptyFSList list = new NonEmptyFSList(jcas, new Annotation(jcas)); + for (int i = 1; i < size; i++) { + switch (i % 2) { + case 0: + list = new NonEmptyFSList(jcas, new Annotation(jcas), list); + break; + case 1: + list = new NonEmptyFSList(jcas, new AnnotationBase(jcas), list); + break; + } + } + + assertThat(list) // + .hasSize(size) // + .hasSize((int) list.select(AnnotationBase.class).count()) + .hasSameSizeAs(list.select(AnnotationBase.class)); + + assertThat(list.select(Annotation.class).count()).isEqualTo(5); + } +}