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);
 }
 

Author:
jesse
  • Field Details

    • literals

      Indicates which expressions are Literals
    • 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.
  • Constructor Details

  • Method Details

    • setExpression1

      public void setExpression1(Expression expression)
      Overrides:
      setExpression1 in class BinaryComparisonAbstract
    • setExpression2

      public void setExpression2(Expression expression)
      Overrides:
      setExpression2 in class BinaryComparisonAbstract
    • 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.
      Parameters:
      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)
      Returns:
      true if the filter evaluates to true for the two geometries