You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2017/07/18 17:26:45 UTC
svn commit: r1802321 -
/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java
Author: schor
Date: Tue Jul 18 17:26:45 2017
New Revision: 1802321
URL: http://svn.apache.org/viewvc?rev=1802321&view=rev
Log:
[UIMA-5497] fixes for copy on write, also have common api methods return most specific impl class
Modified:
uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java
Modified: uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java
URL: http://svn.apache.org/viewvc/uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java?rev=1802321&r1=1802320&r2=1802321&view=diff
==============================================================================
--- uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java (original)
+++ uima/uv3/uimaj-v3/trunk/uimaj-core/src/main/java/org/apache/uima/cas/impl/FsIterator_aggregation_common.java Tue Jul 18 17:26:45 2017
@@ -19,7 +19,6 @@
package org.apache.uima.cas.impl;
-import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
@@ -45,15 +44,15 @@ import org.apache.uima.cas.Type;
class FsIterator_aggregation_common<T extends FeatureStructure>
implements LowLevelIterator<T> {
- final private FSIterator<T>[] allIterators; // not just for single-type iterators
- private FSIterator<T>[] nonEmptyIterators;
+ final private LowLevelIterator<T>[] allIterators; // not just for single-type iterators
+ private LowLevelIterator<T>[] nonEmptyIterators;
private FSIterator<T>[] emptyIterators;
private int lastValidIndex;
final private FSIndex<T> index; // not used here, but returned via the ll_getIndex api.
- FsIterator_aggregation_common(FSIterator<T>[] iterators, FSIndex<T> index) {
+ FsIterator_aggregation_common(LowLevelIterator<T>[] iterators, FSIndex<T> index) {
this.allIterators = iterators;
// can't see the reason for needing to copy the iterators
// There's a separate call copy() to do that if needed
@@ -68,17 +67,17 @@ class FsIterator_aggregation_common<T ex
}
private void separateIntoEmptyAndNonEmptyIterators() {
- List<FSIterator<T>> nonEmptyOnes = new ArrayList<>();
- List<FSIterator<T>> emptyOnes = new ArrayList<>();
- for (FSIterator<T> it : allIterators) {
- if (((LowLevelIterator<T>)it).ll_indexSize() == 0) {
+ List<LowLevelIterator<T>> nonEmptyOnes = new ArrayList<>();
+ List<LowLevelIterator<T>> emptyOnes = new ArrayList<>();
+ for (LowLevelIterator<T> it : allIterators) {
+ if (it.ll_indexSize() == 0) {
emptyOnes.add(it);
} else {
nonEmptyOnes.add(it);
}
}
- nonEmptyIterators = nonEmptyOnes.toArray(new FSIterator[nonEmptyOnes.size()]);
- emptyIterators = emptyOnes.toArray(new FSIterator[emptyOnes.size()]);
+ nonEmptyIterators = nonEmptyOnes.toArray(new LowLevelIterator[nonEmptyOnes.size()]);
+ emptyIterators = emptyOnes.toArray(new LowLevelIterator[emptyOnes.size()]);
}
public T get() throws NoSuchElementException {
@@ -162,24 +161,7 @@ class FsIterator_aggregation_common<T ex
if (!isValid()) {
return;
}
-
- FSIterator<T> it = nonEmptyIterators[lastValidIndex];
- it.moveToNextNvc();
-
- if (it.isValid()) {
- return;
- }
-
- final int nbrIt = nonEmptyIterators.length;
- for (int i = lastValidIndex + 1; i < nbrIt; i++) {
- it = nonEmptyIterators[i];
- it.moveToFirst();
- if (it.isValid()) {
- lastValidIndex = i;
- return;
- }
- }
- lastValidIndex = nonEmptyIterators.length; // invalid position
+ moveToNextNvc();
}
public void moveToNextNvc() {
@@ -206,15 +188,14 @@ class FsIterator_aggregation_common<T ex
// No point in going anywhere if iterator is not valid.
if (!isValid()) {
return;
- }
-
+ }
moveToPreviousNvc();
}
@Override
public void moveToPreviousNvc() {
- FSIterator<T> it = nonEmptyIterators[lastValidIndex];
+ LowLevelIterator<T> it = nonEmptyIterators[lastValidIndex];
it.moveToPreviousNvc();
if (it.isValid()) {
@@ -223,7 +204,7 @@ class FsIterator_aggregation_common<T ex
for (int i = lastValidIndex - 1; i >= 0; i--) {
it = nonEmptyIterators[i];
- it.moveToLast();
+ it.moveToLastNoReinit();
if (it.isValid()) {
lastValidIndex = i;
return;
@@ -259,9 +240,11 @@ class FsIterator_aggregation_common<T ex
*/
@Override
public FSIterator<T> copy() {
- final FSIterator<T>[] ai = allIterators.clone();
+ int size = allIterators.length;
+// allIterators.clone(); // measurement shows clone on arrays has high overhead
+ final LowLevelIterator<T>[] ai = new LowLevelIterator[size];
for (int i = 0; i < ai.length; i++) {
- ai[i] = ai[i].copy();
+ ai[i] = (LowLevelIterator<T>) allIterators[i].copy();
}
FsIterator_aggregation_common<T> it = new FsIterator_aggregation_common<T>(ai, index);
@@ -319,7 +302,7 @@ class FsIterator_aggregation_common<T ex
sb.append(type.getName()).append(':').append(((TypeImpl)type).getCode()).append(' ');
}
- sb.append(", size: ").append(this.ll_indexSize());
+ sb.append(", index size: ").append(this.ll_indexSize());
return sb.toString();
}
@@ -346,4 +329,27 @@ class FsIterator_aggregation_common<T ex
return -1;
}
+ @Override
+ public boolean maybeReinitIterator() {
+ return false; // not used
+ }
+
+ @Override
+ public void moveToFirstNoReinit() {
+ // not supported
+ moveToFirst();
+ }
+
+ @Override
+ public void moveToLastNoReinit() {
+ // not supported
+ moveToLast();
+ }
+
+ @Override
+ public void moveToNoReinit(FeatureStructure fs) {
+ // not supported
+ moveTo(fs);
+ }
+
}