Class AbstractPreparedGeometryFilter

  • All Implemented Interfaces:
    Filter, MultiValuedFilter, BinarySpatialOperator, SpatialOperator, FilterType
    Direct Known Subclasses:
    BBOXImpl, ContainsImpl, DisjointImpl, IntersectsImpl, WithinImpl

    public abstract class AbstractPreparedGeometryFilter
    extends GeometryFilterImpl
    A base class for GeometryFilters that will use PreparedGeometries when the Expression is a Literal Expression.

    This class determines when the expressions are set which expressions are literals. The protected field literals contains the AbstractPreparedGeometryFilter.Literals enumerated value that indicates if:

    If BOTH of the expressions are literals then a cached value is generated by calling basicEvaluate(Geometry, Geometry).

    The method basicEvaluate(Geometry, Geometry) is required to be implemented so that a cached value can be generated in the case that both expressions are literals

    Example usage for intersects filter:
     public boolean evaluate(Object feature) {
     if (feature instanceof SimpleFeature
     && !validate((SimpleFeature) feature)) {
     // we could not obtain a geometry for both left and right hand sides
     // so default to false
     return false;
     Geometry left;
     Geometry right;
     switch (literals) {
     case BOTH:
     return cacheValue;
     case RIGHT: {
     return rightPreppedGeom.intersects(getLeftGeometry(feature));
     case LEFT: {
     return leftPreppedGeom.intersects(getRightGeometry(feature));
     default: {
     left = getLeftGeometry(feature);
     right = getRightGeometry(feature);
     return basicEvaluate(left, right);
     protected final boolean basicEvaluate(Geometry left, Geometry right) {
     Envelope envLeft = left.getEnvelopeInternal();
     Envelope envRight = right.getEnvelopeInternal();
     return envRight.intersects(envLeft) && left.intersects(right);

    • Field Detail

      • leftPreppedGeom

        protected PreparedGeometry leftPreppedGeom
        The PreparedGeometry for the left Geometry. Null if the left geometry is not a Literal
      • rightPreppedGeom

        protected PreparedGeometry rightPreppedGeom
        The PreparedGeometry for the right Geometry. Null if the right geometry is not a Literal
      • cacheValue

        protected boolean cacheValue
        If both expressions are literals the value will never change. In that case this field is that calculated value. It is false otherwise.
    • Method Detail

      • basicEvaluate

        protected abstract boolean basicEvaluate​(Geometry left,
                                                 Geometry right)
        Performs the calculation on the two geometries. This is used to calculate the cached value in the case that both geometries are Literals. But in practice it is useful to extract this functionality into its own method.
        left - the geometry on the left of the equations (the geometry obtained from evaluating Expression1)
        right - the geometry on the right of the equations (the geometry obtained from evaluating Expression2)
        true if the filter evaluates to true for the two geometries