HHH-7126 Adds H2/GeoDB support, incl. integration tests.
This commit is contained in:
parent
4bb8d99a8a
commit
f4fb79aa04
|
@ -0,0 +1,19 @@
|
|||
This file is part of Hibernate Spatial, an extension to the
|
||||
hibernate ORM solution for spatial (geographic) data.
|
||||
|
||||
Copyright © 2007-2012 Geovise BVBA
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
jdbcDependency "org.opengeo:geodb:0.6"
|
|
@ -0,0 +1,41 @@
|
|||
#
|
||||
# Hibernate, Relational Persistence for Idiomatic Java
|
||||
#
|
||||
# Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
||||
# indicated by the @author tags or express copyright attribution
|
||||
# statements applied by the authors. All third-party contributions are
|
||||
# distributed under license by Red Hat Inc.
|
||||
#
|
||||
# This copyrighted material is made available to anyone wishing to use, modify,
|
||||
# copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
# Lesser General Public License, as published by the Free Software Foundation.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
# for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this distribution; if not, write to:
|
||||
# Free Software Foundation, Inc.
|
||||
# 51 Franklin Street, Fifth Floor
|
||||
# Boston, MA 02110-1301 USA
|
||||
#
|
||||
|
||||
hibernate.dialect org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
|
||||
hibernate.connection.driver_class org.h2.Driver
|
||||
hibernate.connection.url jdbc:h2:mem:testhbs;DB_CLOSE_DELAY=-1;MVCC=true
|
||||
hibernate.connection.username sa
|
||||
hibernate.connection.password sa
|
||||
|
||||
|
||||
hibernate.connection.pool_size 5
|
||||
|
||||
hibernate.show_sql true
|
||||
hibernate.format_sql true
|
||||
|
||||
hibernate.max_fetch_depth 5
|
||||
|
||||
hibernate.cache.region_prefix hibernate.test
|
||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
||||
|
|
@ -0,0 +1,287 @@
|
|||
/*
|
||||
* This file is part of Hibernate Spatial, an extension to the
|
||||
* hibernate ORM solution for spatial (geographic) data.
|
||||
*
|
||||
* Copyright © 2007-2012 Geovise BVBA, Geodan IT b.v.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
package org.hibernate.spatial.dialect.h2geodb;
|
||||
|
||||
import org.hibernate.HibernateException;
|
||||
import org.hibernate.dialect.H2Dialect;
|
||||
import org.hibernate.dialect.function.StandardSQLFunction;
|
||||
import org.hibernate.spatial.*;
|
||||
import org.hibernate.type.StandardBasicTypes;
|
||||
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
|
||||
|
||||
/**
|
||||
* Extends the H2Dialect by also including information on spatial functions.
|
||||
*
|
||||
* @author Jan Boonen, Geodan IT b.v.
|
||||
*/
|
||||
public class GeoDBDialect extends H2Dialect implements SpatialDialect {
|
||||
|
||||
/*
|
||||
Contents of GeoDB's spatial registration script (geodb.sql):
|
||||
|
||||
CREATE ALIAS AddGeometryColumn for "geodb.GeoDB.AddGeometryColumn"
|
||||
CREATE ALIAS CreateSpatialIndex for "geodb.GeoDB.CreateSpatialIndex"
|
||||
CREATE ALIAS DropGeometryColumn for "geodb.GeoDB.DropGeometryColumn"
|
||||
CREATE ALIAS DropGeometryColumns for "geodb.GeoDB.DropGeometryColumns"
|
||||
CREATE ALIAS DropSpatialIndex for "geodb.GeoDB.DropSpatialIndex"
|
||||
CREATE ALIAS EnvelopeAsText for "geodb.GeoDB.EnvelopeAsText"
|
||||
CREATE ALIAS GeometryType for "geodb.GeoDB.GeometryType"
|
||||
CREATE ALIAS ST_Area FOR "geodb.GeoDB.ST_Area"
|
||||
CREATE ALIAS ST_AsEWKB FOR "geodb.GeoDB.ST_AsEWKB"
|
||||
CREATE ALIAS ST_AsEWKT FOR "geodb.GeoDB.ST_AsEWKT"
|
||||
CREATE ALIAS ST_AsHexEWKB FOR "geodb.GeoDB.ST_AsHexEWKB"
|
||||
CREATE ALIAS ST_AsText FOR "geodb.GeoDB.ST_AsText"
|
||||
CREATE ALIAS ST_BBOX FOR "geodb.GeoDB.ST_BBox"
|
||||
CREATE ALIAS ST_Buffer FOR "geodb.GeoDB.ST_Buffer"
|
||||
CREATE ALIAS ST_Centroid FOR "geodb.GeoDB.ST_Centroid"
|
||||
CREATE ALIAS ST_Crosses FOR "geodb.GeoDB.ST_Crosses"
|
||||
CREATE ALIAS ST_Contains FOR "geodb.GeoDB.ST_Contains"
|
||||
CREATE ALIAS ST_DWithin FOR "geodb.GeoDB.ST_DWithin"
|
||||
CREATE ALIAS ST_Disjoint FOR "geodb.GeoDB.ST_Disjoint"
|
||||
CREATE ALIAS ST_Distance FOR "geodb.GeoDB.ST_Distance"
|
||||
CREATE ALIAS ST_Envelope FOR "geodb.GeoDB.ST_Envelope"
|
||||
CREATE ALIAS ST_Equals FOR "geodb.GeoDB.ST_Equals"
|
||||
CREATE ALIAS ST_GeoHash FOR "geodb.GeoDB.ST_GeoHash"
|
||||
CREATE ALIAS ST_GeomFromEWKB FOR "geodb.GeoDB.ST_GeomFromEWKB"
|
||||
CREATE ALIAS ST_GeomFromEWKT FOR "geodb.GeoDB.ST_GeomFromEWKT"
|
||||
CREATE ALIAS ST_GeomFromText FOR "geodb.GeoDB.ST_GeomFromText"
|
||||
CREATE ALIAS ST_GeomFromWKB FOR "geodb.GeoDB.ST_GeomFromWKB"
|
||||
CREATE ALIAS ST_Intersects FOR "geodb.GeoDB.ST_Intersects"
|
||||
CREATE ALIAS ST_IsEmpty FOR "geodb.GeoDB.ST_IsEmpty"
|
||||
CREATE ALIAS ST_IsSimple FOR "geodb.GeoDB.ST_IsSimple"
|
||||
CREATE ALIAS ST_IsValid FOR "geodb.GeoDB.ST_IsValid"
|
||||
CREATE ALIAS ST_MakePoint FOR "geodb.GeoDB.ST_MakePoint"
|
||||
CREATE ALIAS ST_MakeBox2D FOR "geodb.GeoDB.ST_MakeBox2D"
|
||||
CREATE ALIAS ST_Overlaps FOR "geodb.GeoDB.ST_Overlaps"
|
||||
CREATE ALIAS ST_SRID FOR "geodb.GeoDB.ST_SRID"
|
||||
CREATE ALIAS ST_SetSRID FOR "geodb.GeoDB.ST_SetSRID"
|
||||
CREATE ALIAS ST_Simplify FOR "geodb.GeoDB.ST_Simplify"
|
||||
CREATE ALIAS ST_Touches FOR "geodb.GeoDB.ST_Touches"
|
||||
CREATE ALIAS ST_Within FOR "geodb.GeoDB.ST_Within"
|
||||
CREATE ALIAS Version FOR "geodb.GeoDB.Version"
|
||||
*/
|
||||
|
||||
/**
|
||||
* Constructor. Registers OGC simple feature functions (see
|
||||
* http://portal.opengeospatial.org/files/?artifact_id=829 for details).
|
||||
* <p/>
|
||||
* Note for the registerfunction method: it registers non-standard database
|
||||
* functions: first argument is the internal (OGC standard) function name,
|
||||
* second the name as it occurs in the spatial dialect
|
||||
*/
|
||||
public GeoDBDialect() {
|
||||
super();
|
||||
|
||||
// Register Geometry column type
|
||||
registerColumnType(java.sql.Types.ARRAY, "BLOB");
|
||||
|
||||
// Register functions that operate on spatial types
|
||||
// NOT YET AVAILABLE IN GEODB
|
||||
// registerFunction("dimension", new StandardSQLFunction("dimension",
|
||||
// Hibernate.INTEGER));
|
||||
registerFunction("geometrytype", new StandardSQLFunction(
|
||||
"GeometryType", StandardBasicTypes.STRING));
|
||||
registerFunction("srid", new StandardSQLFunction("ST_SRID",
|
||||
StandardBasicTypes.INTEGER));
|
||||
registerFunction("envelope", new StandardSQLFunction("ST_Envelope",
|
||||
GeometryType.INSTANCE));
|
||||
registerFunction("astext", new StandardSQLFunction("ST_AsText",
|
||||
StandardBasicTypes.STRING));
|
||||
registerFunction("asbinary", new StandardSQLFunction("ST_AsEWKB",
|
||||
StandardBasicTypes.BINARY));
|
||||
registerFunction("isempty", new StandardSQLFunction("ST_IsEmpty",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("issimple", new StandardSQLFunction("ST_IsSimple",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
// NOT YET AVAILABLE IN GEODB
|
||||
// registerFunction("boundary", new StandardSQLFunction("boundary",
|
||||
// new CustomType(GeoDBGeometryUserType.class, null)));
|
||||
|
||||
// Register functions for spatial relation constructs
|
||||
registerFunction("overlaps", new StandardSQLFunction("ST_Overlaps",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("intersects", new StandardSQLFunction("ST_Intersects",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("equals", new StandardSQLFunction("ST_Equals",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("contains", new StandardSQLFunction("ST_Contains",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("crosses", new StandardSQLFunction("ST_Crosses",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("disjoint", new StandardSQLFunction("ST_Disjoint",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("touches", new StandardSQLFunction("ST_Touches",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
registerFunction("within", new StandardSQLFunction("ST_Within",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
// NOT YET AVAILABLE IN GEODB
|
||||
// registerFunction("relate", new StandardSQLFunction("relate",
|
||||
// Hibernate.BOOLEAN));
|
||||
|
||||
// register the spatial analysis functions
|
||||
registerFunction("distance", new StandardSQLFunction("ST_Distance",
|
||||
StandardBasicTypes.DOUBLE));
|
||||
registerFunction("buffer", new StandardSQLFunction("ST_Buffer",
|
||||
GeometryType.INSTANCE));
|
||||
// NOT YET AVAILABLE IN GEODB
|
||||
// registerFunction("convexhull", new StandardSQLFunction("convexhull",
|
||||
// new CustomType(GeoDBGeometryUserType.class, null)));
|
||||
// registerFunction("difference", new StandardSQLFunction("difference",
|
||||
// new CustomType(GeoDBGeometryUserType.class, null)));
|
||||
// registerFunction("intersection", new StandardSQLFunction(
|
||||
// "intersection", new CustomType(GeoDBGeometryUserType.class, null)));
|
||||
// registerFunction("symdifference",
|
||||
// new StandardSQLFunction("symdifference", new CustomType(
|
||||
// GeoDBGeometryUserType.class, null)));
|
||||
// registerFunction("geomunion", new StandardSQLFunction("geomunion",
|
||||
// new CustomType(GeoDBGeometryUserType.class, null)));
|
||||
|
||||
//register Spatial Aggregate funciton
|
||||
// NOT YET AVAILABLE IN GEODB
|
||||
// registerFunction("extent", new StandardSQLFunction("extent",
|
||||
// new CustomType(GeoDBGeometryUserType.class, null)));
|
||||
|
||||
registerFunction("dwithin", new StandardSQLFunction("ST_DWithin",
|
||||
StandardBasicTypes.BOOLEAN));
|
||||
|
||||
}
|
||||
|
||||
//TODO the getTypeName() override is necessary in the absence of HHH-6074
|
||||
|
||||
/**
|
||||
* Get the name of the database type associated with the given
|
||||
* {@link java.sql.Types} typecode with the given storage specification
|
||||
* parameters. In the case of typecode == 3000, it returns this dialect's spatial type which is
|
||||
* <code>GEOMETRY</code>.
|
||||
*
|
||||
* @param code The {@link java.sql.Types} typecode
|
||||
* @param length The datatype length
|
||||
* @param precision The datatype precision
|
||||
* @param scale The datatype scale
|
||||
* @return
|
||||
* @throws org.hibernate.HibernateException
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public String getTypeName(int code, long length, int precision, int scale) throws HibernateException {
|
||||
if (code == 3000) return "GEOMETRY";
|
||||
return super.getTypeName(code, length, precision, scale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
|
||||
if (sqlTypeDescriptor instanceof GeometrySqlTypeDescriptor) {
|
||||
return GeoDBGeometryTypeDescriptor.INSTANCE;
|
||||
}
|
||||
return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.hibernatespatial.SpatialDialect#getSpatialAggregateSQL(java.lang.String, int)
|
||||
*/
|
||||
|
||||
public String getSpatialAggregateSQL(String columnName, int aggregation) {
|
||||
switch (aggregation) {
|
||||
// NOT YET AVAILABLE IN GEODB
|
||||
// case SpatialAggregate.EXTENT:
|
||||
// StringBuilder stbuf = new StringBuilder();
|
||||
// stbuf.append("extent(").append(columnName).append(")");
|
||||
// return stbuf.toString();
|
||||
default:
|
||||
throw new IllegalArgumentException("Aggregations of type "
|
||||
+ aggregation + " are not supported by this dialect");
|
||||
}
|
||||
}
|
||||
|
||||
public String getDWithinSQL(String columnName) {
|
||||
return "ST_DWithin(" + columnName + ",?,?)";
|
||||
}
|
||||
|
||||
public String getHavingSridSQL(String columnName) {
|
||||
return "( ST_srid(" + columnName + ") = ?)";
|
||||
}
|
||||
|
||||
public String getIsEmptySQL(String columnName, boolean isEmpty) {
|
||||
String emptyExpr = " ST_IsEmpty(" + columnName + ") ";
|
||||
return isEmpty ? emptyExpr : "( NOT " + emptyExpr + ")";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.hibernatespatial.SpatialDialect#getSpatialFilterExpression(java.lang.String)
|
||||
*/
|
||||
public String getSpatialFilterExpression(String columnName) {
|
||||
return "(" + columnName + " && ? ) ";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.hibernatespatial.SpatialDialect#getSpatialRelateSQL(java.lang.String, int, boolean)
|
||||
*/
|
||||
|
||||
public String getSpatialRelateSQL(String columnName, int spatialRelation) {
|
||||
switch (spatialRelation) {
|
||||
case SpatialRelation.WITHIN:
|
||||
return " ST_Within(" + columnName + ", ?)";
|
||||
case SpatialRelation.CONTAINS:
|
||||
return " ST_Contains(" + columnName + ", ?)";
|
||||
case SpatialRelation.CROSSES:
|
||||
return " ST_Crosses(" + columnName + ", ?)";
|
||||
case SpatialRelation.OVERLAPS:
|
||||
return " ST_Overlaps(" + columnName + ", ?)";
|
||||
case SpatialRelation.DISJOINT:
|
||||
return " ST_Disjoint(" + columnName + ", ?)";
|
||||
case SpatialRelation.INTERSECTS:
|
||||
return " ST_Intersects(" + columnName + ", ?)";
|
||||
case SpatialRelation.TOUCHES:
|
||||
return " ST_Touches(" + columnName + ", ?)";
|
||||
case SpatialRelation.EQUALS:
|
||||
return " ST_Equals(" + columnName + ", ?)";
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Spatial relation is not known by this dialect");
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.hibernatespatial.SpatialDialect#getDbGeometryTypeName()
|
||||
*/
|
||||
|
||||
public String getDbGeometryTypeName() {
|
||||
return "GEOM";
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.hibernatespatial.SpatialDialect#isTwoPhaseFiltering()
|
||||
*/
|
||||
|
||||
public boolean isTwoPhaseFiltering() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean supportsFiltering() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean supports(SpatialFunction function) {
|
||||
if (function == SpatialFunction.difference) return false;
|
||||
return (getFunctions().get(function.toString()) != null);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* This file is part of Hibernate Spatial, an extension to the
|
||||
* hibernate ORM solution for spatial (geographic) data.
|
||||
*
|
||||
* Copyright © 2007-2012 Geovise BVBA, Geodan IT b.v.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package org.hibernate.spatial.dialect.h2geodb;
|
||||
|
||||
import org.hibernate.type.descriptor.ValueBinder;
|
||||
import org.hibernate.type.descriptor.ValueExtractor;
|
||||
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
|
||||
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
|
||||
|
||||
import java.sql.Types;
|
||||
|
||||
/**
|
||||
* @author Karel Maesen, Geovise BVBA
|
||||
* creation-date: 2/29/12
|
||||
*/
|
||||
public class GeoDBGeometryTypeDescriptor implements SqlTypeDescriptor {
|
||||
public static final GeoDBGeometryTypeDescriptor INSTANCE = new GeoDBGeometryTypeDescriptor();
|
||||
|
||||
@Override
|
||||
public int getSqlType() {
|
||||
return Types.ARRAY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeRemapped() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <X> ValueBinder<X> getBinder(JavaTypeDescriptor<X> javaTypeDescriptor) {
|
||||
return (ValueBinder<X>) new GeoDBValueBinder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <X> ValueExtractor<X> getExtractor(JavaTypeDescriptor<X> javaTypeDescriptor) {
|
||||
return (ValueExtractor<X>) new GeoDBValueExtractor();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* This file is part of Hibernate Spatial, an extension to the
|
||||
* hibernate ORM solution for spatial (geographic) data.
|
||||
*
|
||||
* Copyright © 2007-2012 Geovise BVBA, Geodan IT b.v.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package org.hibernate.spatial.dialect.h2geodb;
|
||||
|
||||
import com.vividsolutions.jts.geom.Geometry;
|
||||
import org.hibernate.spatial.Log;
|
||||
import org.hibernate.spatial.LogFactory;
|
||||
import org.hibernate.spatial.dialect.AbstractJTSGeometryValueBinder;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
||||
/**
|
||||
* @author Jan Boonen, Geodan IT b.v.
|
||||
* @author Karel Maesen, Geovise BVBA
|
||||
* creation-date: 2/29/12
|
||||
*/
|
||||
public class GeoDBValueBinder extends AbstractJTSGeometryValueBinder {
|
||||
|
||||
private static Log LOG = LogFactory.make();
|
||||
|
||||
@Override
|
||||
protected Object toNative(Geometry jtsGeom, Connection connection) {
|
||||
try {
|
||||
return WKB.toWKB(jtsGeom);
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Could not convert JTS Geometry to a database object.");
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
* This file is part of Hibernate Spatial, an extension to the
|
||||
* hibernate ORM solution for spatial (geographic) data.
|
||||
*
|
||||
* Copyright © 2007-2012 Geovise BVBA, Geodan IT b.v.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package org.hibernate.spatial.dialect.h2geodb;
|
||||
|
||||
import com.vividsolutions.jts.geom.Envelope;
|
||||
import com.vividsolutions.jts.geom.Geometry;
|
||||
import com.vividsolutions.jts.io.ParseException;
|
||||
import com.vividsolutions.jts.io.WKBConstants;
|
||||
import org.hibernate.HibernateException;
|
||||
import org.hibernate.spatial.Log;
|
||||
import org.hibernate.spatial.LogFactory;
|
||||
import org.hibernate.spatial.dialect.AbstractJTSGeometryValueExtractor;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.Blob;
|
||||
|
||||
/**
|
||||
* @author Karel Maesen, Geovise BVBA
|
||||
* creation-date: 2/29/12
|
||||
*/
|
||||
public class GeoDBValueExtractor extends AbstractJTSGeometryValueExtractor {
|
||||
|
||||
private static Log LOG = LogFactory.make();
|
||||
|
||||
@Override
|
||||
public Geometry toJTS(Object object) {
|
||||
if (object == null)
|
||||
return null;
|
||||
try {
|
||||
if (object instanceof Blob) {
|
||||
return WKB.fromWKB(toByteArray((Blob) object), getGeometryFactory());
|
||||
} else if (object instanceof byte[]) {
|
||||
return geometryFromByteArray((byte[]) object);
|
||||
} else if (object instanceof Envelope) {
|
||||
return getGeometryFactory().toGeometry((Envelope) object);
|
||||
} else {
|
||||
throw new IllegalArgumentException(
|
||||
"Can't convert database object of type "
|
||||
+ object.getClass().getCanonicalName());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Could not convert database object to a JTS Geometry.");
|
||||
throw new HibernateException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a WKB or EWKB byte array to a {@link Geometry}. To figure out
|
||||
* whether the byte array is either a WKB or EWK the following checks are
|
||||
* performed: <br/>
|
||||
* <ol>
|
||||
* <li>If the first byte is not 0 or 1, the geometry must be an EWKB (with
|
||||
* the first 32 bytes as a bounding box)</li>
|
||||
* <li>Otherwise, the the byte array is parsed as a WKB</li>
|
||||
* <li>When a parse error occurs it is assumed that the byte array is a EWKB
|
||||
* (with the first byte accidentally a 0 or 1), and parsed as EWKB</li>
|
||||
* </ol>
|
||||
*
|
||||
* @param bytes
|
||||
* @return
|
||||
*/
|
||||
private Geometry geometryFromByteArray(byte[] bytes) throws ParseException {
|
||||
/*
|
||||
* wkbXDR = 0, // Big Endian
|
||||
* wkbNDR = 1 // Little Endian
|
||||
*/
|
||||
if (bytes[0] != WKBConstants.wkbNDR && bytes[0] != WKBConstants.wkbXDR) {
|
||||
// process as EWKB
|
||||
return WKB.fromEWKB(bytes, getGeometryFactory());
|
||||
} else {
|
||||
// process as WKB
|
||||
try {
|
||||
return WKB.fromWKB(bytes, getGeometryFactory());
|
||||
} catch (RuntimeException e) {
|
||||
// note: ParseException is wrapped in a RuntimeException in
|
||||
// geodb.GeoDB
|
||||
if (e.getCause() != null
|
||||
&& e.getCause() instanceof ParseException) {
|
||||
// retry as EWKB, this should rarely happen, but may occur
|
||||
// when the first byte of the EWKB bounding-box is '0'.
|
||||
// this should not be considered as a error
|
||||
LOG.debug(
|
||||
"Caught parse exception while parsing byte array as WKB. Retrying as EWKB.",
|
||||
e);
|
||||
return WKB.fromEWKB(bytes, getGeometryFactory());
|
||||
} else {
|
||||
// this is an other exception, simply re-throw
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] toByteArray(Blob blob) {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
byte[] buf = new byte[1024];
|
||||
|
||||
InputStream in = null;
|
||||
try {
|
||||
in = blob.getBinaryStream();
|
||||
int n = 0;
|
||||
while ((n = in.read(buf)) >= 0) {
|
||||
baos.write(buf, 0, n);
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Could not convert database BLOB object to binary stream.", e);
|
||||
} finally {
|
||||
try {
|
||||
if (in != null) {
|
||||
in.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOG.warn("Could not close binary stream.");
|
||||
}
|
||||
}
|
||||
|
||||
return baos.toByteArray();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* This file is part of Hibernate Spatial, an extension to the
|
||||
* hibernate ORM solution for spatial (geographic) data.
|
||||
*
|
||||
* Copyright © 2007-2012 Geovise BVBA, Geodan IT b.v.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package org.hibernate.spatial.dialect.h2geodb;
|
||||
|
||||
import com.vividsolutions.jts.geom.Geometry;
|
||||
import com.vividsolutions.jts.geom.GeometryFactory;
|
||||
import com.vividsolutions.jts.io.ParseException;
|
||||
import com.vividsolutions.jts.io.WKBReader;
|
||||
import com.vividsolutions.jts.io.WKBWriter;
|
||||
|
||||
/**
|
||||
* A utility class to serialize from/to GeoDB WKB's.
|
||||
* <p/>
|
||||
* <p>Note: this utility makes it unnecessary to have a dependency on GeoDB. As long as GeoDB is
|
||||
* not available in common maven repositories, such a dependency is to be avoided.</p>
|
||||
*
|
||||
* @author Karel Maesen, Geovise BVBA
|
||||
* creation-date: 2/29/12
|
||||
*/
|
||||
class WKB {
|
||||
|
||||
static Geometry fromWKB(byte[] bytes, GeometryFactory factory) throws ParseException {
|
||||
WKBReader reader = new WKBReader(factory);
|
||||
return reader.read(bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a EWKB byte (which is just a WKB prepended with an envelope of 32 bytes.
|
||||
*
|
||||
* @param bytes
|
||||
* @param factory
|
||||
* @return
|
||||
* @throws ParseException
|
||||
*/
|
||||
static Geometry fromEWKB(byte[] bytes, GeometryFactory factory) throws ParseException {
|
||||
byte[] wkbBytes = new byte[bytes.length - 32];
|
||||
System.arraycopy(bytes, 32, wkbBytes, 0, bytes.length - 32);
|
||||
return fromWKB(wkbBytes, factory);
|
||||
}
|
||||
|
||||
|
||||
static byte[] toWKB(Geometry jtsGeom) {
|
||||
WKBWriter writer = new WKBWriter(2, true);
|
||||
return writer.write(jtsGeom);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package org.hibernate.spatial.testing;
|
||||
|
||||
import org.hibernate.dialect.Dialect;
|
||||
import org.hibernate.spatial.testing.dialects.h2geodb.GeoDBTestSupport;
|
||||
import org.hibernate.spatial.testing.dialects.mysql.MySQLTestSupport;
|
||||
import org.hibernate.spatial.testing.dialects.oracle.OracleSDOTestSupport;
|
||||
import org.hibernate.spatial.testing.dialects.postgis.PostgisTestSupport;
|
||||
|
@ -48,9 +49,9 @@ public class TestSupportFactories {
|
|||
if ("org.hibernate.spatial.dialect.postgis.PostgisDialect".equals(canonicalName)) {
|
||||
return PostgisTestSupport.class;
|
||||
}
|
||||
// if ("org.hibernate.spatial.geodb.GeoDBDialect".equals(canonicalName)) {
|
||||
// return "org.hibernate.spatial.geodb.GeoDBSupport";
|
||||
// }
|
||||
if ("org.hibernate.spatial.dialect.h2geodb.GeoDBDialect".equals(canonicalName)) {
|
||||
return GeoDBTestSupport.class;
|
||||
}
|
||||
if ("org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect".equals(canonicalName)) {
|
||||
return SQLServerTestSupport.class;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
*
|
||||
*/
|
||||
package org.hibernate.spatial.testing.dialects.h2geodb;
|
||||
|
||||
|
||||
import org.hibernate.spatial.testing.DataSourceUtils;
|
||||
import org.hibernate.spatial.testing.SQLExpressionTemplate;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* Extension of the {@link DataSourceUtils} class which sets up an in-memory
|
||||
* GeoDB database. The specified SQL file is used to generate a schema in the
|
||||
* database.
|
||||
*
|
||||
* @author Jan Boonen, Geodan IT b.v.
|
||||
*/
|
||||
public class GeoDBDataSourceUtils extends DataSourceUtils {
|
||||
|
||||
public GeoDBDataSourceUtils(String jdbcDriver, String jdbcUrl, String jdbcUser, String jdbcPass,
|
||||
SQLExpressionTemplate sqlExpressionTemplate)
|
||||
throws SQLException, IOException {
|
||||
super(jdbcDriver, jdbcUrl, jdbcUser, jdbcPass, sqlExpressionTemplate);
|
||||
Connection conn = this.getConnection();
|
||||
initGeoDB(conn);
|
||||
}
|
||||
|
||||
//initialise the GeoDB connection using Reflection
|
||||
// so we do not introduce a compile-time dependency
|
||||
private void initGeoDB(Connection conn) {
|
||||
String errorMsg = "Problem initializing GeoDB.";
|
||||
try {
|
||||
Class<?> geoDB = Thread.currentThread().getContextClassLoader().loadClass("geodb.GeoDB");
|
||||
Method m = geoDB.getDeclaredMethod("InitGeoDB", new Class[]{Connection.class});
|
||||
m.invoke(null, conn);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new RuntimeException(errorMsg, e);
|
||||
} catch (NoSuchMethodException e) {
|
||||
throw new RuntimeException(errorMsg, e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw new RuntimeException(errorMsg, e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new RuntimeException(errorMsg, e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,411 @@
|
|||
/**
|
||||
*
|
||||
*/
|
||||
package org.hibernate.spatial.testing.dialects.h2geodb;
|
||||
|
||||
import com.vividsolutions.jts.geom.Geometry;
|
||||
import com.vividsolutions.jts.geom.Point;
|
||||
import org.hibernate.spatial.dialect.h2geodb.GeoDBValueExtractor;
|
||||
import org.hibernate.spatial.testing.AbstractExpectationsFactory;
|
||||
import org.hibernate.spatial.testing.NativeSQLStatement;
|
||||
|
||||
|
||||
/**
|
||||
* A Factory class that generates expected {@link NativeSQLStatement}s for
|
||||
* GeoDB.
|
||||
*
|
||||
* @Author Jan Boonen, Geodan IT b.v.
|
||||
*/
|
||||
public class GeoDBExpectationsFactory extends AbstractExpectationsFactory {
|
||||
|
||||
private final GeoDBValueExtractor decoder = new GeoDBValueExtractor();
|
||||
|
||||
public GeoDBExpectationsFactory(GeoDBDataSourceUtils dataSourceUtils) {
|
||||
super(dataSourceUtils);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeAsBinaryStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeAsBinaryStatement() {
|
||||
return createNativeSQLStatement("select id, ST_AsEWKB(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeAsTextStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeAsTextStatement() {
|
||||
return createNativeSQLStatement("select id, ST_AsText(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeBoundaryStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeBoundaryStatement() {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Bounday() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeBufferStatement(java.lang.Double)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeBufferStatement(Double distance) {
|
||||
return createNativeSQLStatement(
|
||||
"select t.id, ST_Buffer(t.geom,?) from GEOMTEST t where ST_SRID(t.geom) = 4326",
|
||||
new Object[]{distance});
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeContainsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeContainsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Contains(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Contains(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeConvexHullStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeConvexHullStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_ConvexHull() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeCrossesStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeCrossesStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Crosses(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Crosses(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDifferenceStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDifferenceStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Difference() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDimensionSQL()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDimensionSQL() {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Dimension() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDisjointStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDisjointStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Disjoint(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Disjoint(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeTransformStatement(int epsg) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeHavingSRIDStatement(int srid) {
|
||||
return createNativeSQLStatement("select t.id, (ST_SRID(t.geom) = "
|
||||
+ srid + ") from GeomTest t where ST_SRID(t.geom) = " + srid);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDistanceStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDistanceStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, st_distance(t.geom, ST_GeomFromText(?, 4326)) from GeomTest t where ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeEnvelopeStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeEnvelopeStatement() {
|
||||
return createNativeSQLStatement("select id, ST_Envelope(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeEqualsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeEqualsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Equals(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Equals(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeFilterStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeFilterStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Filter is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeGeomUnionStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeGeomUnionStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_GeomUnion() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeGeometryTypeStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeGeometryTypeStatement() {
|
||||
return createNativeSQLStatement("select id, GeometryType(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIntersectionStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIntersectionStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Intersection() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIntersectsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIntersectsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Intersects(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Intersects(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIsEmptyStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIsEmptyStatement() {
|
||||
return createNativeSQLStatement("select id, ST_IsEmpty(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIsNotEmptyStatement() {
|
||||
return createNativeSQLStatement("select id, not ST_IsEmpty(geom) from geomtest");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIsSimpleStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIsSimpleStatement() {
|
||||
return createNativeSQLStatement("select id, ST_IsSimple(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeOverlapsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeOverlapsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Overlaps(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Overlaps(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeRelateStatement(com.vividsolutions.jts.geom.Geometry,
|
||||
* java.lang.String)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeRelateStatement(Geometry geom,
|
||||
String matrix) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Relate() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDwithinStatement(Point geom,
|
||||
double distance) {
|
||||
String sql = "select t.id, ST_DWithin(t.geom, ST_GeomFromText(?, 4326), "
|
||||
+ distance
|
||||
+ " ) from GEOMTEST t where st_dwithin(t.geom, ST_GeomFromText(?, 4326), "
|
||||
+ distance + ") = 'true' and ST_SRID(t.geom) = 4326";
|
||||
return createNativeSQLStatementAllWKTParams(sql, geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeSridStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeSridStatement() {
|
||||
return createNativeSQLStatement("select id, ST_SRID(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeSymDifferenceStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeSymDifferenceStatement(
|
||||
Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_SymDifference() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeTouchesStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeTouchesStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Touches(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Touches(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeWithinStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeWithinStatement(
|
||||
Geometry testPolygon) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Within(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Within(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
testPolygon.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.hibernatespatial.test.AbstractExpectationsFactory#decode(java.lang
|
||||
* .Object)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected Geometry decode(Object o) {
|
||||
return decoder.toJTS(o);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package org.hibernate.spatial.testing.dialects.h2geodb;
|
||||
|
||||
import org.hibernate.spatial.testing.SQLExpressionTemplate;
|
||||
import org.hibernate.spatial.testing.TestDataElement;
|
||||
|
||||
/**
|
||||
* This is the template for insert SQL statements into the geomtest test table
|
||||
* for GeoDB.
|
||||
*
|
||||
* @author Jan Boonen, Geodan IT b.v.
|
||||
*/
|
||||
public class GeoDBExpressionTemplate implements SQLExpressionTemplate {
|
||||
|
||||
final String SQL_TEMPLATE = "insert into GEOMTEST values (%d, '%s', ST_GeomFromText('%s', %d))";
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.SQLExpressionTemplate#toInsertSql(org.
|
||||
* hibernatespatial.test.TestDataElement)
|
||||
*/
|
||||
public String toInsertSql(TestDataElement testDataElement) {
|
||||
return String
|
||||
.format(SQL_TEMPLATE, testDataElement.id, testDataElement.type,
|
||||
testDataElement.wkt, testDataElement.srid);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
/**
|
||||
*
|
||||
*/
|
||||
package org.hibernate.spatial.testing.dialects.h2geodb;
|
||||
|
||||
import com.vividsolutions.jts.geom.Coordinate;
|
||||
import com.vividsolutions.jts.geom.Geometry;
|
||||
import org.hibernate.spatial.testing.GeometryEquality;
|
||||
|
||||
/**
|
||||
* Extends the test for {@link Geometry} equality, because GeoDB uses JTS
|
||||
* Geometry objects, which cannot be cast to {@link org.hibernate.spatial.jts.mgeom.MGeometry} objects.
|
||||
*
|
||||
* @author Jan Boonen, Geodan IT b.v.
|
||||
*/
|
||||
public class GeoDBGeometryEquality extends GeometryEquality {
|
||||
|
||||
@Override
|
||||
public boolean test(Geometry geom1, Geometry geom2) {
|
||||
if (geom1 != null && geom1.isEmpty())
|
||||
return geom2 == null || geom2.isEmpty();
|
||||
return super.test(geom1, geom2);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean testSimpleGeometryEquality(Geometry geom1, Geometry geom2) {
|
||||
return testVerticesEquality(geom1, geom2);
|
||||
}
|
||||
|
||||
private boolean testVerticesEquality(Geometry geom1, Geometry geom2) {
|
||||
if (geom1.getNumPoints() != geom2.getNumPoints())
|
||||
return false;
|
||||
for (int i = 0; i < geom1.getNumPoints(); i++) {
|
||||
Coordinate cn1 = geom1.getCoordinates()[i];
|
||||
Coordinate cn2 = geom2.getCoordinates()[i];
|
||||
if (!cn1.equals2D(cn2))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,406 @@
|
|||
/**
|
||||
*
|
||||
*/
|
||||
package org.hibernate.spatial.testing.dialects.h2geodb;
|
||||
|
||||
import com.vividsolutions.jts.geom.Geometry;
|
||||
import com.vividsolutions.jts.geom.Point;
|
||||
import org.hibernate.spatial.dialect.h2geodb.GeoDBValueExtractor;
|
||||
import org.hibernate.spatial.testing.AbstractExpectationsFactory;
|
||||
import org.hibernate.spatial.testing.NativeSQLStatement;
|
||||
|
||||
/**
|
||||
* A Factory class that generates expected {@link org.hibernate.spatial.testing.NativeSQLStatement}s for GeoDB
|
||||
* version < 0.4. These versions don't support storage of the SRID value with
|
||||
* the geometry.
|
||||
*
|
||||
* @author Jan Boonen, Geodan IT b.v.
|
||||
*/
|
||||
public class GeoDBNoSRIDExpectationsFactory extends AbstractExpectationsFactory {
|
||||
|
||||
private final GeoDBValueExtractor decoder = new GeoDBValueExtractor();
|
||||
|
||||
public GeoDBNoSRIDExpectationsFactory(GeoDBDataSourceUtils dataSourceUtils) {
|
||||
super(dataSourceUtils);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeAsBinaryStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeAsBinaryStatement() {
|
||||
return createNativeSQLStatement("select id, ST_AsEWKB(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeAsTextStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeAsTextStatement() {
|
||||
return createNativeSQLStatement("select id, ST_AsText(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeBoundaryStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeBoundaryStatement() {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Bounday() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeBufferStatement(java.lang.Double)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeBufferStatement(Double distance) {
|
||||
return createNativeSQLStatement(
|
||||
"select t.id, ST_Buffer(t.geom,?) from GEOMTEST t where ST_SRID(t.geom) = 4326",
|
||||
new Object[]{distance});
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeContainsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeContainsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Contains(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Contains(t.geom, ST_GeomFromText(?, 4326)) = 1",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeConvexHullStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeConvexHullStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_ConvexHull() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeCrossesStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeCrossesStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Crosses(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Crosses(t.geom, ST_GeomFromText(?, 4326)) = 1",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDifferenceStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDifferenceStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Difference() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDimensionSQL()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDimensionSQL() {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Dimension() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDisjointStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDisjointStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Disjoint(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Disjoint(t.geom, ST_GeomFromText(?, 4326)) = 1",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeTransformStatement(int epsg) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeHavingSRIDStatement(int srid) {
|
||||
return createNativeSQLStatement("select t.id, (st_srid(t.geom) = " + srid + ") from GeomTest t where ST_SRID(t.geom) = " + srid);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeDistanceStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDistanceStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, st_distance(t.geom, ST_GeomFromText(?, 4326)) from GeomTest t where ST_SRID(t.geom) = 4326",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeEnvelopeStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeEnvelopeStatement() {
|
||||
return createNativeSQLStatement("select id, ST_Envelope(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeEqualsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeEqualsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Equals(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Equals(t.geom, ST_GeomFromText(?, 4326)) = 1",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeFilterStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeFilterStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_MBRIntersects() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeGeomUnionStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeGeomUnionStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_GeomUnion() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeGeometryTypeStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeGeometryTypeStatement() {
|
||||
return createNativeSQLStatement("select id, GeometryType(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIntersectionStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIntersectionStatement(Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Intersection() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIntersectsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIntersectsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Intersects(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Intersects(t.geom, ST_GeomFromText(?, 4326)) = 1",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIsEmptyStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIsEmptyStatement() {
|
||||
return createNativeSQLStatement("select id, ST_IsEmpty(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIsNotEmptyStatement() {
|
||||
return createNativeSQLStatement("select id, not ST_IsEmpty(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeIsSimpleStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeIsSimpleStatement() {
|
||||
return createNativeSQLStatement("select id, ST_IsSimple(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeOverlapsStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeOverlapsStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Overlaps(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Overlaps(t.geom, ST_GeomFromText(?, 4326)) = 1",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeRelateStatement(com.vividsolutions.jts.geom.Geometry,
|
||||
* java.lang.String)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeRelateStatement(Geometry geom,
|
||||
String matrix) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_Relate() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeDwithinStatement(Point geom, double distance) {
|
||||
String sql = "select t.id, st_dwithin(t.geom, ST_GeomFromText(?, 4326), " + distance + " ) from GeomTest t where st_dwithin(t.geom, ST_GeomFromText(?, 4326), " + distance + ") = 'true' and ST_SRID(t.geom) = 4326";
|
||||
return createNativeSQLStatementAllWKTParams(sql, geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeSridStatement()
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeSridStatement() {
|
||||
return createNativeSQLStatement("select id, ST_SRID(geom) from GEOMTEST");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeSymDifferenceStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeSymDifferenceStatement(
|
||||
Geometry geom) {
|
||||
throw new UnsupportedOperationException(
|
||||
"Method ST_SymDifference() is not implemented in the current version of GeoDB.");
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeTouchesStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeTouchesStatement(Geometry geom) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Touches(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Touches(t.geom, ST_GeomFromText(?, 4326)) = 1",
|
||||
geom.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @seeorg.hibernatespatial.test.AbstractExpectationsFactory#
|
||||
* createNativeWithinStatement(com.vividsolutions.jts.geom.Geometry)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected NativeSQLStatement createNativeWithinStatement(
|
||||
Geometry testPolygon) {
|
||||
return createNativeSQLStatementAllWKTParams(
|
||||
"select t.id, ST_Within(t.geom, ST_GeomFromText(?, 4326)) from GEOMTEST t where ST_Within(t.geom, ST_GeomFromText(?, 4326)) = 1 and ST_SRID(t.geom) = 4326",
|
||||
testPolygon.toText());
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* org.hibernatespatial.test.AbstractExpectationsFactory#decode(java.lang
|
||||
* .Object)
|
||||
*/
|
||||
|
||||
@Override
|
||||
protected Geometry decode(Object o) {
|
||||
return decoder.toJTS(o);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package org.hibernate.spatial.testing.dialects.h2geodb;
|
||||
|
||||
import org.hibernate.cfg.Configuration;
|
||||
import org.hibernate.spatial.testing.*;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* @author Karel Maesen, Geovise BVBA
|
||||
* creation-date: Oct 2, 2010
|
||||
*/
|
||||
public class GeoDBTestSupport extends TestSupport {
|
||||
|
||||
|
||||
public DataSourceUtils createDataSourceUtil(Configuration configuration) {
|
||||
super.createDataSourceUtil(configuration);
|
||||
try {
|
||||
return new GeoDBDataSourceUtils(driver(), url(), user(), passwd(), getSQLExpressionTemplate());
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public TestData createTestData(BaseCoreFunctionalTestCase testcase) {
|
||||
return TestData.fromFile("h2geodb/test-geodb-data-set.xml");
|
||||
}
|
||||
|
||||
public GeometryEquality createGeometryEquality() {
|
||||
return new GeoDBGeometryEquality();
|
||||
}
|
||||
|
||||
public AbstractExpectationsFactory createExpectationsFactory(DataSourceUtils dataSourceUtils) {
|
||||
return new GeoDBExpectationsFactory((GeoDBDataSourceUtils) dataSourceUtils);
|
||||
}
|
||||
|
||||
public SQLExpressionTemplate getSQLExpressionTemplate() {
|
||||
return new GeoDBExpressionTemplate();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,6 +1,4 @@
|
|||
/*
|
||||
* $Id:$
|
||||
*
|
||||
* This file is part of Hibernate Spatial, an extension to the
|
||||
* hibernate ORM solution for geographic data.
|
||||
*
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
<!--
|
||||
|
||||
Tests for MySQL spatial functions should not contain empty geometries.
|
||||
In MySQL these are stored as null objects.
|
||||
|
||||
-->
|
||||
|
||||
<TestData>
|
||||
|
||||
<Element>
|
||||
<id>1</id>
|
||||
<type>POINT</type>
|
||||
<wkt>POINT(10 5)</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
<Element>
|
||||
<id>2</id>
|
||||
<type>POINT</type>
|
||||
<wkt>POINT(52.25 2.53)</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
<Element>
|
||||
<id>3</id>
|
||||
<type>POINT</type>
|
||||
<wkt>POINT(51 12)</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
<Element>
|
||||
<id>4</id>
|
||||
<type>POINT</type>
|
||||
<wkt>POINT(10.0 2.0)</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
|
||||
|
||||
<Element>
|
||||
<id>5</id>
|
||||
<type>LINESTRING</type>
|
||||
<wkt>LINESTRING(10.0 5.0, 20.0 15.0)</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
<Element>
|
||||
<id>6</id>
|
||||
<type>LINESTRING</type>
|
||||
<wkt>LINESTRING(10.0 5.0, 20.0 15.0, 30.3 22.4, 10 30.0)</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
|
||||
|
||||
<Element>
|
||||
<id>16</id>
|
||||
<type>POLYGON</type>
|
||||
<wkt>POLYGON( (0 0, 0 10, 10 10, 10 0, 0 0) )</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
<Element>
|
||||
<id>18</id>
|
||||
<type>POLYGON</type>
|
||||
<wkt>POLYGON( (0 0, 0 10, 10 10, 10 0, 0 0), (2 2, 2 5, 5 5,5 2, 2 2))</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
<Element>
|
||||
<id>19</id>
|
||||
<type>POLYGON</type>
|
||||
<wkt>POLYGON( (110 110, 110 120, 120 120, 120 110, 110 110) )</wkt>
|
||||
<srid>4326</srid>
|
||||
</Element>
|
||||
|
||||
</TestData>
|
Loading…
Reference in New Issue