Fixed for 2.2, thanks for reporting and providing the test case.
This Groovy stuff looks pretty cool, I'll have to check it out
some more...
--Thilo
Thilo Goetz wrote:
> The easiest place to create a test case is on Jira. Open a Jira
> bug for UIMA, and you can attach the test case. When you do that,
> please check the box that says something like, ok to include in
> Apache code (so we can check it in and use it as regression test).
>
> Groovy, hm. Never used it before. If it doesn't take me more than
> 5 min to set up in Eclipse, and I can still debug, not a problem ;-)
>
> --Thilo
>
> Philip Ogren wrote:
>> 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
>>>>
>>>
>>>