/*
* 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.postgis;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.spatial.SpatialFunction;
import org.hibernate.spatial.SpatialRelation;
import org.hibernate.type.StandardBasicTypes;
/**
* A Dialect for Postgresql with support for the Postgis spatial types, functions and operators (release 1.x - 1.3)
*
* @author Karel Maesen, Geovise BVBA
* creation-date: Dec 18, 2010
*/
public class PostgisNoSQLMM extends PostgisDialect {
public PostgisNoSQLMM() {
registerColumnType(
PGGeometryTypeDescriptor.INSTANCE.getSqlType(),
"GEOMETRY"
);
// registering OGC functions
// (spec_simplefeatures_sql_99-04.pdf)
// section 2.1.1.1
// Registerfunction calls for registering geometry functions:
// first argument is the OGC standard functionname, second the name as
// it occurs in the spatial dialect
registerFunction(
"dimension", new StandardSQLFunction(
"dimension",
StandardBasicTypes.INTEGER
)
);
registerFunction(
"geometrytype", new StandardSQLFunction(
"geometrytype", StandardBasicTypes.STRING
)
);
registerFunction(
"srid", new StandardSQLFunction(
"srid",
StandardBasicTypes.INTEGER
)
);
registerFunction(
"envelope", new StandardSQLFunction(
"envelope"
)
);
registerFunction(
"astext", new StandardSQLFunction(
"astext",
StandardBasicTypes.STRING
)
);
registerFunction(
"asbinary", new StandardSQLFunction(
"asbinary",
StandardBasicTypes.BINARY
)
);
registerFunction(
"isempty", new StandardSQLFunction(
"isempty",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"issimple", new StandardSQLFunction(
"issimple",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"boundary", new StandardSQLFunction(
"boundary"
)
);
// Register functions for spatial relation constructs
registerFunction(
"overlaps", new StandardSQLFunction(
"overlaps",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"intersects", new StandardSQLFunction(
"intersects",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"equals", new StandardSQLFunction(
"equals",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"contains", new StandardSQLFunction(
"contains",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"crosses", new StandardSQLFunction(
"crosses",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"disjoint", new StandardSQLFunction(
"disjoint",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"touches", new StandardSQLFunction(
"touches",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"within", new StandardSQLFunction(
"within",
StandardBasicTypes.BOOLEAN
)
);
registerFunction(
"relate", new StandardSQLFunction(
"relate",
StandardBasicTypes.BOOLEAN
)
);
// register the spatial analysis functions
registerFunction(
"distance", new StandardSQLFunction(
"distance",
StandardBasicTypes.DOUBLE
)
);
registerFunction(
"buffer", new StandardSQLFunction(
"buffer"
)
);
registerFunction(
"convexhull", new StandardSQLFunction(
"convexhull"
)
);
registerFunction(
"difference", new StandardSQLFunction(
"difference"
)
);
registerFunction(
"intersection", new StandardSQLFunction(
"intersection"
)
);
registerFunction(
"symdifference",
new StandardSQLFunction( "symdifference" )
);
registerFunction(
"geomunion", new StandardSQLFunction(
"geomunion"
)
);
//register Spatial Aggregate function
registerFunction(
"extent", new StandardSQLFunction(
"extent"
)
);
//other common spatial functions
registerFunction(
"transform", new StandardSQLFunction(
"transform"
)
);
}
@Override
public String getDWithinSQL(String columnName) {
return "( dwithin(" + columnName + ",?,?) )";
}
@Override
public String getHavingSridSQL(String columnName) {
return "( srid(" + columnName + ") = ?)";
}
@Override
public String getIsEmptySQL(String columnName, boolean isEmpty) {
final String emptyExpr = "( isempty(" + columnName + ")) ";
return isEmpty ? emptyExpr : "not " + emptyExpr;
}
@Override
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
switch ( spatialRelation ) {
case SpatialRelation.WITHIN:
return "(" + columnName + " && ? AND within(" + columnName + ", ?))";
case SpatialRelation.CONTAINS:
return "(" + columnName + " && ? AND contains(" + columnName + ", ?))";
case SpatialRelation.CROSSES:
return "(" + columnName + " && ? AND crosses(" + columnName + ", ?))";
case SpatialRelation.OVERLAPS:
return "(" + columnName + " && ? AND overlaps(" + columnName + ", ?))";
case SpatialRelation.DISJOINT:
return "(" + columnName + " && ? AND disjoint(" + columnName + ", ?))";
case SpatialRelation.INTERSECTS:
return "(" + columnName + " && ? AND intersects(" + columnName + ", ?))";
case SpatialRelation.TOUCHES:
return "(" + columnName + " && ? AND touches(" + columnName + ", ?))";
case SpatialRelation.EQUALS:
return "(" + columnName + " && ? AND equals(" + columnName + ", ?))";
default:
throw new IllegalArgumentException( "Spatial relation is not known by this dialect" );
}
}
@Override
public boolean supports(SpatialFunction function) {
return super.supports( function );
}
}