You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by re...@apache.org on 2023/01/11 16:39:10 UTC

[uima-uimaj] 01/01: Issue #272: select on FSArray seems broken

This is an automated email from the ASF dual-hosted git repository.

rec pushed a commit to branch bugfix/272-select-on-FSArray-seems-broken
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git

commit bb25f8ac4aa27e7e80e736d508005b236f916ea4
Author: Richard Eckart de Castilho <re...@apache.org>
AuthorDate: Wed Jan 11 17:39:01 2023 +0100

    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
---
 .../org/apache/uima/cas/impl/SelectFSs_impl.java   |  2 +-
 .../apache/uima/cas/impl/SelectFsFSArrayTest.java  | 86 ++++++++++++++++++++++
 .../apache/uima/cas/impl/SelectFsFSListTest.java   | 86 ++++++++++++++++++++++
 3 files changed, 173 insertions(+), 1 deletion(-)

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 c0d6abaa8..6c28ee621 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 @@ public class SelectFSs_impl<T extends FeatureStructure> implements SelectFSs<T>
           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 000000000..c3077d456
--- /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<FeatureStructure> 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<FeatureStructure> 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 000000000..99120503d
--- /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<TOP> list = new NonEmptyFSList<TOP>(jcas, new Annotation(jcas));
+    for (int i = 1; i < size; i++) {
+      list = new NonEmptyFSList<TOP>(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<TOP> list = new NonEmptyFSList<TOP>(jcas, new Annotation(jcas));
+    for (int i = 1; i < size; i++) {
+      switch (i % 2) {
+        case 0:
+          list = new NonEmptyFSList<TOP>(jcas, new Annotation(jcas), list);
+          break;
+        case 1:
+          list = new NonEmptyFSList<TOP>(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);
+  }
+}