Please disregard the previous patch, apparently I managed to corrupt it
while creating it over ssh.
The version in this email should be correct, I hope.
Best,
jta
On Fri Jan 30 2015 at 11:09:10 PM José Tomás Atria <[email protected]>
wrote:
> Dear Richard:
>
> I am attaching a patch with a series of selectIntersects and
> indexIntersects methods. There's more signatures than the corresponding
> selectCovered/Covering methods, as "intersects" could include covering
> annotations or not. If they are excluded, the methods use the same approach
> you used in selecCovered, advancing the iterator. Otherwise, they defer to
> the int interval method used in selectCovering.
>
> Maybe this is useful to someone else besides myself?
>
> Also, I have no experience with unit testing, so I didn't even try adding
> to add tests for the new methods. I did some naive testing by hand, and it
> seems to work... but I'm particularly bad with interval operations, so I
> wouldn't be surprised if I made some egregious error. My apologies in
> advance.
>
> Best,
> jta
>
>
> On Mon Jan 26 2015 at 3:19:37 PM José Tomás Atria <[email protected]>
> wrote:
>
>> Cool, I'll look into ti and let you know if I manage to make something
>> useful. Thanks for the tips.
>>
>> On Sun Jan 25 2015 at 12:47:52 PM Richard Eckart de Castilho <
>> [email protected]> wrote:
>>
>>> Hi José,
>>>
>>> we had no need for such a method so far ;) The easiest way would
>>> probably be to copy the
>>> selectCovering method from uimaFIT and adjust it to catch all
>>> intersecting annotations.
>>> You can probably add an optimization to a selectIntersecting method
>>> which breaks the loop as soon as the begin offset of an annotation is
>>> larger than the end offset of your intersection range.
>>>
>>> Cheers,
>>>
>>> -- Richard
>>>
>>> On 24.01.2015, at 22:25, José Tomás Atria <[email protected]> wrote:
>>>
>>> > Hello all,
>>> >
>>> > I am looking for the best approach to select all annotations of a given
>>> > type that intersect an annotation of a different type.
>>> >
>>> > I am aware of selectCovered and selectCovering, which, as far as I
>>> > understand, will select all annotations (of a given type) that cover
>>> ranges
>>> > of text which are, respectively, subsets or supersets of another
>>> > annotation. Is there a similar method for annotations that cover ranges
>>> > which merely _intersect_ with the range covered by a given annotation?
>>> >
>>> > What would the recommended way of achieving this?
>>> >
>>> > Any help would be apreciated. Thanks!
>>> > jta.
>>> >
>>> > --
>>> > entia non sunt multiplicanda praeter necessitatem
>>>
>>>
Index: src/main/java/org/apache/uima/fit/util/CasUtil.java
===================================================================
--- src/main/java/org/apache/uima/fit/util/CasUtil.java (revision 1656160)
+++ src/main/java/org/apache/uima/fit/util/CasUtil.java (working copy)
@@ -616,6 +616,239 @@
}
/**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * Covering annotations are excluded. Use {@link selectIntersects(Type, AnnotationFS, boolean)} if
+ * you want to include covering annotations, but this is significantly slower.
+ *
+ * @param type
+ * the UIMA type of annotations to select
+ * @param intersect
+ * the annotation to select intersects for
+ * @return
+ * a list of annotations of the given type that intersect the given annotation.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static List<AnnotationFS> selectIntersects(Type type, AnnotationFS intersect) {
+ return selectIntersects(intersect.getView(), type, intersect, false);
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * @param type
+ * the UIMA type of annotations to select
+ * @param intersect
+ * the annotation to select intersects for
+ * @param covering
+ * if true, covering annotations are included, but this will be slower.
+ * @return
+ * a list of annotations of the given type that intersect the given annotation.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static List<AnnotationFS> selectIntersects(Type type, AnnotationFS intersect, boolean covering) {
+ return selectIntersects(intersect.getView(), type, intersect, covering);
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * Covering annotations are excluded. Use {@link selectIntersects(CAS, Type, AnnotationFS, boolean)}
+ * if you want to include covering annotations, but this is significantly slower.
+ *
+ * @param cas
+ * a CAS
+ * @param type
+ * the UIMA type of annotations to select
+ * @param intersect
+ * the annotation to select intersects for
+ * @return
+ * a list of annotations of the given type that intersect the given annotation.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static List<AnnotationFS> selectIntersects(CAS cas, Type type, AnnotationFS intersect) {
+ return selectIntersects(cas, type, intersect, false);
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * @param cas
+ * a CAS.
+ * @param type
+ * the UIMA type of annotations to select.
+ * @param intersect
+ * the annotation for which to select intersecting annotations.
+ * @param covering
+ * if true, covering annotations are included, but this will be slower.
+ * @return
+ * a list of annotations of the given type that intersect the given annotation.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static List<AnnotationFS> selectIntersects(CAS cas, Type type, AnnotationFS intersect, boolean covering) {
+ if (covering) {
+ return selectIntersects(cas, type, intersect.getBegin(), intersect.getEnd(), covering);
+ }
+
+ int begin = intersect.getBegin();
+ int end = intersect.getEnd();
+
+ TypeSystem ts = cas.getTypeSystem();
+ List<AnnotationFS> list = new ArrayList<AnnotationFS>();
+ FSIterator<AnnotationFS> it = cas.getAnnotationIndex(type).iterator();
+
+ it.moveTo(intersect);
+
+ if (!it.isValid()) {
+ it.moveToLast();
+ if (!it.isValid()) {
+ return list;
+ }
+ }
+
+ while (it.isValid() && it.get().getBegin() >= begin) {
+ it.moveToPrevious();
+ }
+
+ if (!it.isValid()) {
+ it.moveToFirst();
+ }
+
+ while (it.isValid() && (it.get()).getEnd() < begin) {
+ it.moveToNext();
+ }
+
+ while (it.isValid()) {
+ AnnotationFS a = it.get();
+ if (a.getBegin() > end) break;
+ it.moveToNext();
+ if (a.getEnd() <= begin) continue;
+
+ assert ( a.getEnd() >= begin ) : "Illegal begin " + a.getBegin()
+ + " in [" + intersect.getBegin() + ".." + intersect.getEnd() + "]";
+
+ assert ( a.getBegin() <= end ) : "Illegal end " + a.getEnd()
+ + " in [" + intersect.getBegin() + ".." + intersect.getEnd() + "]";
+
+ if (!a.equals(intersect)) {
+ list.add(a);
+ }
+ }
+
+ return list;
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain range of the CAS text.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ *
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * Covering annotations are excluded. Use {@link selectIntersects(Cas, Type, AnnotationFS, boolean)}
+ * if you want to include covering annotations.
+ *
+ * <p>
+ * <b>Note:</b> this is significantly slower than using
+ * {@link #selectIntersects(CAS, Type, AnnotationFS)}. It is possible to use
+ * {@code selectInterects(cas, type, new Annotation(jCas, int, int))}, but that will allocate memory
+ * in the jCas for the new annotation. If you do that repeatedly many times, memory may fill up.
+ *
+ * @param cas
+ * a CAS.
+ * @param type
+ * the UIMA type of annotations to select.
+ * @param begin
+ * begin offset.
+ * @param end
+ * end offset.
+ * @return a list of annotations of the given type that intersect the given annotation.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static List<AnnotationFS> selectIntersects(CAS cas, Type type, int begin, int end) {
+ return selectIntersects( cas, type, begin, end, false );
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain range of the CAS text.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ *
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * <p>
+ * <b>Note:</b> this is significantly slower than using
+ * {@link #selectIntersects(CAS, Type, AnnotationFS)}. It is possible to use
+ * {@code selectIntersects(cas, type, new Annotation(jCas, int, int))}, but that will allocate memory
+ * in the jCas for the new annotation. If you do that repeatedly many times, memory may fill up.
+ *
+ * @param cas
+ * a CAS.
+ * @param type
+ * the UIMA type of annotations to select.
+ * @param begin
+ * begin offset.
+ * @param end
+ * end offset.
+ * @param covering
+ * if true, covering annotations are included, but this will be slower.
+ * @return a list of annotations of the given type that intersect the given annotation.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static List<AnnotationFS> selectIntersects(CAS cas, Type type, int begin, int end, boolean covering) {
+ TypeSystem ts = cas.getTypeSystem();
+ List<AnnotationFS> list = new ArrayList<AnnotationFS>();
+ FSIterator<AnnotationFS> it = cas.getAnnotationIndex(type).iterator();
+
+ while (it.hasNext()) {
+ AnnotationFS a = it.next();
+
+ if (a.getBegin() > end) break;
+ if (!covering && (a.getBegin() < begin && a.getEnd() > end)) continue;
+
+ if (a.getEnd() > begin && (type == null || (ts.subsumes(type, a.getType())))) {
+ list.add(a);
+ }
+ }
+
+ return list;
+ }
+
+ /**
* Create an index for quickly lookup up the annotations covering a particular annotation. This is
* preferable to using {@link #selectCovering(CAS, Type, int, int)} because the overhead of
* scanning the CAS occurs only when the index is build. Subsequent lookups to the index are fast.
@@ -700,6 +933,67 @@
}
/**
+ * Create an index for quickly lookup up the annotations intersecting a particular annotation. This
+ * is preferable to using {@link #selectIntersects(CAS, Type, int, int)} because the overhead of
+ * scanning the CAS occurs only when the index is build. Subsequent lookups to the index are fast.
+ *
+ * Covering annotations are excluded from the index.
+ * Use {@code indexIntersects(cas, type, begin, end, true)} if you want to include covering annotations.
+ *
+ * @param cas
+ * a CAS.
+ * @param type
+ * type to create the index for - this is used in lookups.
+ * @param intersectType
+ * type of intersecting annotations.
+ * @return the index.
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static Map<AnnotationFS, Collection<AnnotationFS>> indexIntersects( CAS cas, Type type, Type intersectType) {
+ return indexIntersects( cas, type, intersectType, false);
+ }
+
+ /**
+ * Create an index for quickly lookup up the annotations intersecting a particular annotation. This
+ * is preferable to using {@link #selectIntersects(CAS, Type, int, int)} because the overhead of
+ * scanning the CAS occurs only when the index is build. Subsequent lookups to the index are fast.
+ *
+ * @param cas
+ * a CAS.
+ * @param type
+ * type to create the index for - this is used in lookups.
+ * @param intersectType
+ * type of intersecting annotations.
+ * @param covering
+ * if false, covering annotations are excluded.
+ * @return the index.
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static Map<AnnotationFS, Collection<AnnotationFS>> indexIntersects( CAS cas, Type type, Type intersectType, boolean covering ) {
+ Map<AnnotationFS, Collection<AnnotationFS>> index = new HashMap<AnnotationFS, Collection<AnnotationFS>>() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Collection<AnnotationFS> get(Object key) {
+ Collection<AnnotationFS> res = super.get(key);
+ if (res == null) return emptyList();
+ else return res;
+ }
+ };
+ for (AnnotationFS s : select(cas, type)) {
+ for (AnnotationFS u : selectIntersects(cas, intersectType, s, covering)) {
+ Collection<AnnotationFS> c = index.get(s);
+ if ( c == EMPTY_LIST ) {
+ c = new LinkedList<AnnotationFS>();
+ index.put(s, c);
+ }
+ c.add(u);
+ }
+ }
+ return unmodifiableMap(index);
+ }
+
+ /**
* This method exists simply as a convenience method for unit testing. It is not very efficient
* and should not, in general be used outside the context of unit testing.
*
Index: src/main/java/org/apache/uima/fit/util/JCasUtil.java
===================================================================
--- src/main/java/org/apache/uima/fit/util/JCasUtil.java (revision 1656160)
+++ src/main/java/org/apache/uima/fit/util/JCasUtil.java (working copy)
@@ -407,6 +407,183 @@
}
/**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * Covering annotations are excluded. Use {@link selectIntersects(Class<T>, AnnotationFS, boolean)} if
+ * you want to include covering annotations, but this is significantly slower.
+ *
+ * @param <T>
+ * the JCas type.
+ * @param type
+ * a UIMA type.
+ * @param intersect
+ * the intersecting annotation.
+ * @return a return value.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation> List<T> selectIntersects(Class<T> type, AnnotationFS intersect) {
+ return cast(CasUtil.selectIntersects(CasUtil.getType(intersect.getCAS(), type), intersect));
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * @param <T>
+ * the JCas type.
+ * @param type
+ * a UIMA type.
+ * @param intersect
+ * the intersecting annotation.
+ * @param covering
+ * if true, covering annotations are included, but this will be slower.
+ * @return a return value.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation> List<T> selectIntersects(Class<T> type, AnnotationFS intersect, boolean covering) {
+ return cast(CasUtil.selectIntersects(CasUtil.getType(intersect.getCAS(), type), intersect, covering));
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * Covering annotations are excluded. Use {@link selectIntersects(JCas, Class<T>, AnnotationFS, boolean)}
+ * if you want to include covering annotations, but this is significantly slower.
+ *
+ * @param <T>
+ * the JCas type.
+ * @param jCas
+ * a JCas.
+ * @param type
+ * a UIMA type.
+ * @param intersect
+ * the intersecting annotation.
+ * @return a return value.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation> List<T> selectIntersects(JCas jCas, Class<T> type, AnnotationFS intersect) {
+ return cast(CasUtil.selectIntersects(jCas.getCas(), getType(jCas, type), intersect));
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain annotation.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ * <p>
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * @param <T>
+ * the JCas type.
+ * @param jCas
+ * a JCas.
+ * @param type
+ * a UIMA type.
+ * @param intersect
+ * the intersecting annotation.
+ * @param covering
+ * if true, covering annotations are included, but this will be slower.
+ * @return a return value.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation> List<T> selectIntersects(JCas jCas, Class<T> type, AnnotationFS intersect, boolean covering) {
+ return cast(CasUtil.selectIntersects(jCas.getCas(), getType(jCas, type), intersect, covering));
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain range of the CAS text.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ *
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * Covering annotations are excluded. Use {@link selectIntersects(JCas, Class<T>, int, int, boolean)}
+ * if you want to include covering annotations.
+ *
+ * <p>
+ * <b>Note:</b> this is significantly slower than using
+ * {@link #selectIntersects(JCas, Class<T>, AnnotationFS)}. It is possible to use
+ * {@code selectInterects(cas, type, new Annotation(jCas, int, int))}, but that will allocate memory
+ * in the jCas for the new annotation. If you do that repeatedly many times, memory may fill up.
+ *
+ * @param <T>
+ * the JCas type.
+ * @param jCas
+ * a JCas.
+ * @param type
+ * a UIMA type.
+ * @param begin
+ * beginning offset.
+ * @param end
+ * ending offset.
+ * @return a return value.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation> List<T> selectIntersects(JCas jCas, Class<T> type, int begin, int end) {
+ return cast(CasUtil.selectIntersects(jCas.getCas(), getType(jCas, type), begin, end));
+ }
+
+ /**
+ * Get a list of annotations of the given type that intersect a certain range of the CAS text.
+ * Iterates over all annotations of the given type to find intersecting annotations. Does not use
+ * subiterators and does not respect type priorities. Was adapted from {@link Subiterator}. Uses
+ * the same approach except that type priorities are ignored.
+ *
+ * The intersecting annotation is never returned itself, even if it is of the queried-for type or
+ * a subtype of that type.
+ *
+ * <p>
+ * <b>Note:</b> this is significantly slower than using
+ * {@link #selectIntersects(JCas, Class<T>, AnnotationFS)}. It is possible to use
+ * {@code selectInterects(cas, type, new Annotation(jCas, int, int))}, but that will allocate memory
+ * in the jCas for the new annotation. If you do that repeatedly many times, memory may fill up.
+ *
+ * @param <T>
+ * the JCas type.
+ * @param jCas
+ * a JCas.
+ * @param type
+ * a UIMA type.
+ * @param begin
+ * beginning offset.
+ * @param end
+ * ending offset.
+ * @param covering
+ * if true, covering annotation are included.
+ * @return a return value.
+ * @see Subiterator
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation> List<T> selectIntersects(JCas jCas, Class<T> type, int begin, int end, boolean covering) {
+ return cast(CasUtil.selectIntersects(jCas.getCas(), getType(jCas, type), begin, end, covering));
+ }
+
+ /**
* Create an index for quickly lookup up the annotations covering a particular annotation. This is
* preferable to using {@link #selectCovering(JCas, Class, int, int)} because the overhead of
* scanning the CAS occurs only when the index is build. Subsequent lookups to the index are fast.
@@ -455,6 +632,52 @@
}
/**
+ * Create an index for quickly lookup up the annotations intersecting a particular annotation. This
+ * is preferable to using {@link #selectCovered(JCas, Class, int, int)} because the overhead of
+ * scanning the CAS occurs only when the index is build. Subsequent lookups to the index are fast.
+ *
+ * @param <T>
+ * the JCas type to index for.
+ * @param <S>
+ * the JCas type to include in the index.
+ * @param jCas
+ * a JCas.
+ * @param type
+ * type to create the index for - this is used in lookups.
+ * @param intersectType
+ * @return the index.
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation, S extends Annotation> Map<T, Collection<S>> indexIntersects(
+ JCas jCas, Class<T> type, Class<S> intersectType ) {
+ return cast(CasUtil.indexIntersects(jCas.getCas(), getType(jCas, type), getType(jCas, intersectType)));
+ }
+
+ /**
+ * Create an index for quickly lookup up the annotations intersecting a particular annotation. This
+ * is preferable to using {@link #selectCovered(JCas, Class, int, int)} because the overhead of
+ * scanning the CAS occurs only when the index is build. Subsequent lookups to the index are fast.
+ *
+ * @param <T>
+ * the JCas type to index for.
+ * @param <S>
+ * the JCas type to include in the index.
+ * @param jCas
+ * a JCas.
+ * @param type
+ * type to create the index for - this is used in lookups.
+ * @param intersectType
+ * @param covering
+ * if true, the index will include covering annotations.
+ * @return the index.
+ * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+ */
+ public static <T extends Annotation, S extends Annotation> Map<T, Collection<S>> indexIntersects(
+ JCas jCas, Class<T> type, Class<S> intersectType, boolean covering ) {
+ return cast(CasUtil.indexIntersects(jCas.getCas(), getType(jCas, type), getType(jCas, intersectType), covering));
+ }
+
+ /**
* Check if the given annotation contains any annotation of the given type.
*
* @param jCas