/* * 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.dialect.oracle.criterion; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.criterion.CriteriaQuery; import org.hibernate.criterion.Criterion; import org.hibernate.engine.spi.TypedValue; import com.vividsolutions.jts.geom.Geometry; /** * A static factory class for spatial criteria using the Oracle Spatial native spatial operators * for the SDO_GEOMTRY type. * * @author Karel Maesen */ public class OracleSpatialRestrictions { private OracleSpatialRestrictions() { } /** * Apply the "SDO_FILTER" constraint to the specified property, using the specified parameters * * @param propertyName The name of the proerty * @param geom The search geometry to use in the constraint * @param param The function parameters for the SDO_FILTER * * @return The Criterion */ @SuppressWarnings("serial") public static Criterion SDOFilter(String propertyName, Geometry geom, SDOParameterMap param) { return new OracleSpatialCriterion( propertyName, geom, param ) { @Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName ); final StringBuilder sql = new StringBuilder( "SDO_FILTER(" ); sql.append( columns[0] ).append( "," ).append( "?" ); if ( param != null && !param.isEmpty() ) { sql.append( "," ).append( param.toQuotedString() ); } sql.append( ") = 'TRUE'" ); return sql.toString(); } }; } /** * Apply the "SDO_FILTER" constraint to the specified property, using the specified parameters * * @param propertyName The name of the proerty * @param geom The search geometry to use in the constraint * @param minResolution The min_resolution parameter * @param maxResolution The max_resolution parameter * * @return The Criterion */ @SuppressWarnings("serial") public static Criterion SDOFilter(String propertyName, Geometry geom, Double minResolution, Double maxResolution) { if ( minResolution == null && maxResolution == null ) { return SDOFilter( propertyName, geom, null ); } else { final SDOParameterMap param = new SDOParameterMap(); param.setMinResolution( minResolution ); param.setMaxResolution( maxResolution ); return SDOFilter( propertyName, geom, param ); } } /** * Apply the "SDO_NN" constraint to the specified property, using the specified parameters * * @param propertyName The name of the property * @param geom The search geometry to use in the constraint * @param distance The distance parameter * @param numResults The num_results parameter * @param unit The unit parameter * * @return The Criterion */ @SuppressWarnings("serial") public static Criterion SDONN(String propertyName, Geometry geom, Double distance, Integer numResults, String unit) { if ( distance == null && numResults == null && unit == null ) { return SDONN( propertyName, geom, null ); } else { final SDOParameterMap param = new SDOParameterMap(); param.setDistance( distance ); param.setSdoNumRes( numResults ); param.setUnit( unit ); return SDONN( propertyName, geom, param ); } } /** * Apply the "SDO_NN" constraint to the specified property, using the specified {@code SDOParameterMap} * * @param propertyName The name of the property * @param geom The search geometry to use in the constraint * @param param The parameters for the constraint function * * @return The Criterion */ @SuppressWarnings("serial") public static Criterion SDONN(String propertyName, Geometry geom, SDOParameterMap param) { return new OracleSpatialCriterion( propertyName, geom, param ) { @Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName ); final StringBuilder sql = new StringBuilder( "SDO_NN(" ); sql.append( columns[0] ).append( "," ).append( "?" ); if ( param != null && !param.isEmpty() ) { sql.append( "," ).append( param.toQuotedString() ); } sql.append( ") = 'TRUE'" ); return sql.toString(); } }; } /** * Apply the "SDO_RELATE" constraint to the specified property, using the specified {@code SDOParameterMap} * * @param propertyName The name of the property * @param geom The search geometry to use in the constraint * @param param The parameters for the constraint function * * @return The Criterion */ @SuppressWarnings("serial") public static Criterion SDORelate(String propertyName, Geometry geom, SDOParameterMap param) { return new OracleSpatialCriterion( propertyName, geom, param ) { @Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName ); final StringBuilder sql = new StringBuilder( "SDO_RELATE(" ); sql.append( columns[0] ).append( "," ).append( "?" ); if ( param != null && !param.isEmpty() ) { sql.append( "," ).append( param.toQuotedString() ); } sql.append( ") = 'TRUE'" ); return sql.toString(); } }; } /** * Apply the "SDO_RELATE" constraint to the specified property, using the specified parameters. * * @param propertyName The name of the property * @param geom The search geometry to use in the constraint * @param mask The mask parameter * @param minResolution The min_resolution parameter * @param maxResolution The max_resolution parameter * * @return The Criterion */ @SuppressWarnings("serial") public static Criterion SDORelate(String propertyName, Geometry geom, RelationshipMask[] mask, Double minResolution, Double maxResolution) { final SDOParameterMap param = new SDOParameterMap(); param.setMask( RelationshipMask.booleanCombination( mask ) ); param.setMinResolution( minResolution ); param.setMaxResolution( maxResolution ); return SDORelate( propertyName, geom, param ); } /** * Apply the "SDO_WITHIN_DISTANCE" constraint to the specified property, using the specified {@code SDOParameterMap}. * * @param propertyName The name of the property * @param geom The search geometry to use in the constraint * @param param The parameters for the constraint function * * @return The Criterion */ @SuppressWarnings("serial") public static Criterion SDOWithinDistance(String propertyName, Geometry geom, SDOParameterMap param) { return new OracleSpatialCriterion( propertyName, geom, param ) { @Override public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, this.propertyName ); final StringBuilder sql = new StringBuilder( "SDO_WITHIN_DISTANCE(" ); sql.append( columns[0] ).append( "," ).append( "?" ); if ( param != null && !param.isEmpty() ) { sql.append( "," ).append( param.toQuotedString() ); } sql.append( ") = 'TRUE'" ); return sql.toString(); } }; } /** * Apply the "SDO_WITHIN_DISTANCE" constraint to the specified property, using the specified {@code SDOParameterMap}. * * @param propertyName The name of the property * @param geom The search geometry to use in the constraint * @param distance The distance parameter for the constraint function * @param param The parameters for the constraint function * * @return The Criterion */ public static Criterion SDOWithinDistance(String propertyName, Geometry geom, Double distance, SDOParameterMap param) { if ( param == null ) { param = new SDOParameterMap(); } param.setDistance( distance ); return SDOWithinDistance( propertyName, geom, param ); } } abstract class OracleSpatialCriterion implements Criterion { protected String propertyName; protected Geometry value; protected SDOParameterMap param; public OracleSpatialCriterion(String propertyName, Geometry value, SDOParameterMap param) { this.propertyName = propertyName; this.value = value; this.param = param; } /* * (non-Javadoc) * * @see org.hibernate.criterion.Criterion#getTypedValues(org.hibernate.Criteria, * org.hibernate.criterion.CriteriaQuery) */ public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { return new TypedValue[] { criteriaQuery.getTypedValue( criteria, propertyName, value ) }; } public abstract String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException; }