blob: d503799b5e1d57e20e12a12538b4a1cf4ab38258 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.fit.util;
import org.apache.uima.cas.text.AnnotationFS;
/**
* This class is back-ported for testing only from UIMAv3. It is used to check that the behavior
* of uimaFIT v2 and uimaFITv2 with respect to the select utilities is aligned.
*/
final class AnnotationPredicates {
public static boolean coveredBy(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aYBegin <= aXBegin && aXEnd <= aYEnd;
}
public static boolean coveredBy(AnnotationFS aX, int aYBegin, int aYEnd) {
return aYBegin <= aX.getBegin() && aX.getEnd() <= aYEnd;
}
/**
* Y is starting before or at the same position as A and ends after or at the
* same position as X.
*
* @param aX
* X
* @param aY
* Y
* @return whether X is covered by Y.
*/
public static boolean coveredBy(AnnotationFS aX, AnnotationFS aY) {
return aY.getBegin() <= aX.getBegin() && aX.getEnd() <= aY.getEnd();
}
public static boolean covering(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aXBegin <= aYBegin && aYEnd <= aXEnd;
}
public static boolean covering(AnnotationFS aX, int aYBegin, int aYEnd) {
return aX.getBegin() <= aYBegin && aYEnd <= aX.getEnd();
}
/**
* X is starting before or at the same position as Y and ends after or at the
* same position as Y.
*
* @param aX
* X
* @param aY
* Y
* @return whether X is covering Y.
*/
public static boolean covering(AnnotationFS aX, AnnotationFS aY) {
return aX.getBegin() <= aY.getBegin() && aY.getEnd() <= aX.getEnd();
}
public static boolean colocated(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aXBegin == aYBegin && aXEnd == aYEnd;
}
public static boolean colocated(AnnotationFS aX, int aYBegin, int aYEnd) {
return aX.getBegin() == aYBegin && aX.getEnd() == aYEnd;
}
/**
* X starts and ends at the same position as Y.
*
* @param aX
* X
* @param aY
* Y
* @return whether X is at the same location as Y.
*/
public static boolean colocated(AnnotationFS aX, AnnotationFS aY) {
return aX.getBegin() == aY.getBegin() && aX.getEnd() == aY.getEnd();
}
public static boolean overlapping(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aYBegin == aXBegin || aYEnd == aXEnd || (aXBegin < aYEnd && aYBegin < aXEnd);
}
public static boolean overlapping(AnnotationFS aX, int aYBegin, int aYEnd) {
int xBegin = aX.getBegin();
int xEnd = aX.getEnd();
return aYBegin == xBegin || aYEnd == xEnd || (xBegin < aYEnd && aYBegin < xEnd);
}
/**
* The intersection of the spans X and Y is non-empty. If either X or Y have a
* zero-width, then the intersection is considered to be non-empty if the begin
* of X is either within Y or the same as the begin of Y - and vice versa.
*
* @param aX
* X
* @param aY
* Y
* @return whether X overlaps with Y in any way.
*/
public static boolean overlapping(AnnotationFS aX, AnnotationFS aY) {
int xBegin = aX.getBegin();
int xEnd = aX.getEnd();
int yBegin = aY.getBegin();
int yEnd = aY.getEnd();
return yBegin == xBegin || yEnd == xEnd || (xBegin < yEnd && yBegin < xEnd);
}
public static boolean overlappingAtBegin(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aXBegin < aYBegin && aYBegin < aXEnd && aXEnd <= aYEnd;
}
public static boolean overlappingAtBegin(AnnotationFS aX, int aYBegin, int aYEnd) {
int xEnd = aX.getEnd();
return aYBegin < xEnd && xEnd <= aYEnd && aX.getBegin() < aYBegin;
}
/**
* X is starting before or at the same position as Y and ends before Y ends.
*
* @param aX
* X
* @param aY
* Y
* @return whether X overlaps Y on the left.
*/
public static boolean overlappingAtBegin(AnnotationFS aX, AnnotationFS aY) {
int xEnd = aX.getEnd();
int yBegin = aY.getBegin();
return yBegin < xEnd && xEnd <= aY.getEnd() && aX.getBegin() < yBegin;
}
public static boolean overlappingAtEnd(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aYBegin <= aXBegin && aXBegin < aYEnd && aYEnd < aXEnd;
}
public static boolean overlappingAtEnd(AnnotationFS aX, int aYBegin, int aYEnd) {
int xBegin = aX.getBegin();
return aYBegin <= xBegin && xBegin < aYEnd && aYEnd < aX.getEnd();
}
/**
* X is starting after Y starts and ends after or at the same position as Y.
*
* @param aX
* X
* @param aY
* Y
* @return whether X overlaps Y on the right.
*/
public static boolean overlappingAtEnd(AnnotationFS aX, AnnotationFS aY) {
int xBegin = aX.getBegin();
int yEnd = aY.getEnd();
return xBegin < yEnd && aY.getBegin() <= xBegin && yEnd < aX.getEnd();
}
public static boolean following(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aXBegin >= aYEnd;
}
public static boolean following(AnnotationFS aX, int aYBegin, int aYEnd) {
return aX.getBegin() >= aYEnd;
}
/**
* X starts at or after the position that Y ends.
*
* @param aX
* X
* @param aY
* Y
* @return whether X is right of Y.
*/
public static boolean following(AnnotationFS aX, AnnotationFS aY) {
return aX.getBegin() >= aY.getEnd();
}
public static boolean preceding(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aYBegin >= aXEnd;
}
public static boolean preceding(AnnotationFS aX, int aYBegin, int aYEnd) {
return aYBegin >= aX.getEnd();
}
/**
* X ends before or at the position that Y starts.
*
* @param aX
* X
* @param aY
* Y
* @return whether X left of Y.
*/
public static boolean preceding(AnnotationFS aX, AnnotationFS aY) {
return aY.getBegin() >= aX.getEnd();
}
public static boolean beginningWith(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aXBegin == aYBegin;
}
public static boolean beginningWith(AnnotationFS aX, int aYBegin, int aYEnd) {
return aX.getBegin() == aYBegin;
}
public static boolean beginningWith(AnnotationFS aX, AnnotationFS aY) {
return aX.getBegin() == aY.getBegin();
}
public static boolean endingWith(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
return aXEnd == aYEnd;
}
public static boolean endingWith(AnnotationFS aX, int aYBegin, int aYEnd) {
return aX.getEnd() == aYEnd;
}
public static boolean endingWith(AnnotationFS aX, AnnotationFS aY) {
return aX.getEnd() == aY.getEnd();
}
}