/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.spatial.criterion;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import org.hibernate.criterion.Criterion;
import org.hibernate.spatial.SpatialRelation;
/**
* A factory for spatial criteria.
*
* The criterion types created by this class implement the spatial query
* expressions of the OpenGIS Simple Features Specification for SQL, Revision
* 1.1. In addition, it provides for a simple spatial <code>filter</code> that
* works mostly using the spatial index. This corresponds to the Oracle
* Spatial's "SDO_FILTER" function, or the "&&" operator of PostGIS.
*
* @author Karel Maesen
*/
public class SpatialRestrictions {
private SpatialRestrictions() {
}
/**
* Apply a "spatially equal" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression eq(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.EQUALS
);
}
/**
* Apply a "spatially within" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression within(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.WITHIN
);
}
/**
* Apply a "spatially contains" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression contains(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.CONTAINS
);
}
/**
* Apply a "spatially crosses" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression crosses(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.CROSSES
);
}
/**
* Apply a "spatially disjoint" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression disjoint(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.DISJOINT
);
}
/**
* Apply a "spatially intersects" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression intersects(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.INTERSECTS
);
}
/**
* Apply a "spatially overlaps" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression overlaps(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.OVERLAPS
);
}
/**
* Apply a "spatially touches" constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value to use in comparison
*
* @return SpatialRelateExpression
*
* @see SpatialRelateExpression
*/
public static SpatialRelateExpression touches(String propertyName, Geometry value) {
return new SpatialRelateExpression(
propertyName, value,
SpatialRelation.TOUCHES
);
}
/**
* Apply a bounding box overlap constraint to the named property
*
* @param propertyName The name of the property
* @param value The geometry value whose bounding box to use in the comparison
*
* @return SpatialFilter
*
* @see SpatialFilter
*/
public static SpatialFilter filter(String propertyName, Geometry value) {
return new SpatialFilter( propertyName, value );
}
/**
* Apply a bounding box overlap constraint to the named property
*
* @param propertyName The name of the property
* @param envelope The envelope or bounding box to use in the comparison
* @param srid the SRID of the bounding box
*
* @return SpatialFilter
*
* @see SpatialFilter
*/
public static SpatialFilter filter(String propertyName, Envelope envelope, int srid) {
return new SpatialFilter( propertyName, envelope, srid );
}
/**
* Apply a "distance within" constraint to the named property
*
* @param propertyName The name of the property
* @param geometry The geometry value to use in the comparison
* @param distance The distance
*
* @return DWithinExpression
*
* @see DWithinExpression
*/
public static Criterion distanceWithin(String propertyName, Geometry geometry, double distance) {
return new DWithinExpression( propertyName, geometry, distance );
}
/**
* Apply a "having srid" constraint to the named property
*
* @param propertyName The name of the property
* @param srid The SRID value to use in the comparison
*
* @return A HavingSridExpression
*
* @see HavingSridExpression
*/
public static Criterion havingSRID(String propertyName, int srid) {
return new HavingSridExpression( propertyName, srid );
}
/**
* Apply an "is empty" constraint to the named property
*
* @param propertyName The name of the property
*
* @return A IsEmptyExpression
*
* @see IsEmptyExpression
*/
public static Criterion isEmpty(String propertyName) {
return new IsEmptyExpression( propertyName, true );
}
/**
* Apply an "is not empty" constraint to the named property
*
* @param propertyName The name of the property
*
* @return A IsEmptyExpression
*
* @see IsEmptyExpression
*/
public static Criterion isNotEmpty(String propertyName) {
return new IsEmptyExpression( propertyName, false );
}
/**
* Apply the specified spatial relation constraint to the named property.
*
* @param relation The spatial relation to apply
* @param propertyName The name of the property
* @param value The geometry value to use in the comparison
*
* @return SpatialFilter
*
* @see SpatialFilter
*/
public static Criterion spatialRestriction(int relation, String propertyName, Geometry value) {
switch ( relation ) {
case SpatialRelation.CONTAINS:
return contains( propertyName, value );
case SpatialRelation.CROSSES:
return crosses( propertyName, value );
case SpatialRelation.DISJOINT:
return disjoint( propertyName, value );
case SpatialRelation.INTERSECTS:
return intersects( propertyName, value );
case SpatialRelation.EQUALS:
return eq( propertyName, value );
case SpatialRelation.FILTER:
return filter( propertyName, value );
case SpatialRelation.OVERLAPS:
return overlaps( propertyName, value );
case SpatialRelation.TOUCHES:
return touches( propertyName, value );
case SpatialRelation.WITHIN:
return within( propertyName, value );
default:
throw new IllegalArgumentException(
"Non-existant spatial relation passed."
);
}
}
}