Yes. I will throw one together. Would you mind if I used Groovy for
this - or is that going to be annoying? Let me know. Also, from an
earlier email I saw on this list it seems that attachments are a
problem. Is there some place where I could directly load a test case?
In the mean time, here is a work around I just put together (I'm still
unit testing the code that uses this - so I'm not certain this is bug free):
public static FSIterator getWindowIterator(JCas jCas, Annotation
windowAnnotation, Type type)
{
ConstraintFactory constraintFactory = jCas.getConstraintFactory();
FeaturePath beginFeaturePath = jCas.createFeaturePath();
beginFeaturePath.addFeature(type.getFeatureByBaseName("begin"));
FSIntConstraint intConstraint =
constraintFactory.createIntConstraint();
intConstraint.geq(windowAnnotation.getBegin());
FSMatchConstraint beginConstraint =
constraintFactory.embedConstraint(beginFeaturePath, intConstraint);
FeaturePath endFeaturePath = jCas.createFeaturePath();
endFeaturePath.addFeature(type.getFeatureByBaseName("end"));
intConstraint = constraintFactory.createIntConstraint();
intConstraint.leq(windowAnnotation.getEnd());
FSMatchConstraint endConstraint =
constraintFactory.embedConstraint(endFeaturePath, intConstraint);
FSMatchConstraint windowConstraint =
constraintFactory.and(beginConstraint,endConstraint);
FSIndex windowIndex = jCas.getAnnotationIndex(type);
FSIterator windowIterator =
jCas.createFilteredIterator(windowIndex.iterator(), windowConstraint);
return windowIterator;
}
Thilo Goetz wrote:
That's a bug. The underlying implementation of the two
iterator types you mention is totally different, hence
you see this only in one of them. Any chance you could
provide a self-contained test case that exhibits this?
--Thilo
Philip Ogren wrote:
I am having difficulty with using the FSIterator returned by the
AnnotationIndex.subiterator(AnnotationFS) method.
The following is a code fragment:
AnnotationIndex annotationIndex = jCas.getAnnotationIndex(tokenType);
FSIterator tokenIterator = annotationIndex.subiterator(sentenceAnnotation);
annotationIterator.moveTo(tokenAnnotation);
Here is the relevant portion of the stack trace:
java.lang.ClassCastException: edu.colorado.cslr.dessert.types.Token
at java.util.Collections.indexedBinarySearch(Unknown Source)
at java.util.Collections.binarySearch(Unknown Source)
at org.apache.uima.cas.impl.Subiterator.moveTo(Subiterator.java:224)
If I change the second line to the following, then I do not have any
problems with an exception being thrown.
FSIterator tokenIterator = annotationIndex.iterator();
Is this a bug or some misunderstanding on my part of how subiterator
should work?
Thanks,
Philip