One screwup in my example code was in getting the Types needed for the
filtered iterator. It is bad to create dummy FS in the CAS just to get a
type object :(

Instead of
        constraint.add((new Person(jcas)).getType());
use
        constraint.add(jcas.getTypeSystem().getType("test.Person"));

Eddie

On Feb 4, 2008 7:30 PM, Eddie Epstein <[EMAIL PROTECTED]> wrote:

> Hi Isaac,
>
> There is a simpler way to do this. Using FilteredIterators you can limit
> an iterator to just returning types of interest. Using "type priorities" you
> can guarantee the order that types are returned for annotations with the
> same begin and end positions.
>
> Using both of these would allow a single pass iteration to eliminate
> unwanted type instances.
>
> In the CDE for your component, on the Indexes tab, add a priority list
> that puts Person in front of the other types. The resultant component
> descriptor would look like this:
>
>     <typePriorities>
>       <priorityList>
>         <type>yourtype.Person</type>
>         <type>yourtype.Organization</type>
>         <type>yourtype.Company</type>
>         ...
>       </priorityList>
>     </typePriorities>
>
>
> Some code below.
>
>         FSIterator it = jcas.getAnnotationIndex().iterator();
>         FSTypeConstraint constraint = cas.getConstraintFactory
> ().createTypeConstraint();
>         constraint.add((new Person(jcas)).getType());
>         constraint.add((new Organization(jcas)).getType());
>         constraint.add((new Company(jcas)).getType());
>         it = jcas.createFilteredIterator(it, constraint);
>
>         it.moveToFirst();
>         Annotation a = null;
>         int pB = -1;
>         int pE = -1;
>         LinkedList<Annotation> toDel = new LinkedList<Annotation>();
>         while (it.hasNext()) {
>             a = (Annotation) it.get();
>             it.moveToNext();
>             if (a instanceof Person) {
>                 // grab position for testing subsequent FS
>                 pB = a.getBegin();
>                 pE = a.getEnd();
>             }
>             else {
>                 // not a Person; see if it has same position as the last
> Person
>                 if (pB == a.getBegin() && pE == a.getEnd()) {
>                     toDel.add(a);
>                 }
>             }
>         }
>
>         // must modify index outside iterator loop
>         for (int i = 0; i < toDel.size(); i++) {
>             toDel.get(i).removeFromIndexes();
>         }
>
>
> Regards,
> Eddie
>
>

Reply via email to