/* * 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 org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.criterion.CriteriaQuery; import org.hibernate.criterion.Projection; import org.hibernate.criterion.SimpleProjection; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.spatial.SpatialAggregate; import org.hibernate.spatial.SpatialDialect; import org.hibernate.type.Type; /** * A factory for spatial projections. * * @author Karel Maesen */ public class SpatialProjections { private SpatialProjections() { } /** * Applies an extent projection to the specified geometry function * * <p>The extent of a set of {@code Geometry}s is the union of their bounding boxes.</p> * * @param propertyName The property to use for calculating the extent * * @return an extent-projection for the specified property. */ public static Projection extent(final String propertyName) { return new SimpleProjection() { public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException { return new Type[] { criteriaQuery.getType( criteria, propertyName ) }; } public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery) throws HibernateException { final StringBuilder stbuf = new StringBuilder(); final SessionFactoryImplementor factory = criteriaQuery.getFactory(); final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, propertyName ); final Dialect dialect = factory.getDialect(); if ( dialect instanceof SpatialDialect ) { final SpatialDialect seDialect = (SpatialDialect) dialect; stbuf.append( seDialect.getSpatialAggregateSQL( columns[0], SpatialAggregate.EXTENT ) ); stbuf.append( " as y" ).append( position ).append( '_' ); return stbuf.toString(); } return null; } }; } }