HHH-14804 Upgrade MySQL8 support

This commit is contained in:
Karel Maesen 2021-11-03 22:58:01 +01:00
parent 2deee38103
commit 65aa8f7a5b
18 changed files with 163 additions and 452 deletions

View File

@ -43,7 +43,7 @@ sourceSets.test.resources {
tasks.test {
// for now we cannot run with 'h2' project.db due to compatability issues
// H2 requires 4.200 but H2GIS 1.5 needs 4.197
enabled = ['pgsql', 'pgsql_ci', 'cockroachdb', 'mariadb', 'mysql_docker', 'mysql_docker'].contains( project.db )
enabled = ['pgsql', 'pgsql_ci', 'cockroachdb', 'mariadb', 'mysql_ci', 'mysql_docker'].contains( project.db )
}
tasks.test.include '**/*'

View File

@ -31,23 +31,20 @@ public class GeometryLiteralFormatter<T> implements JdbcLiteralFormatter<T> {
}
@Override
//todo -- clean this up
public void appendJdbcLiteral(
SqlAppender appender, T value, Dialect dialect, WrapperOptions wrapperOptions) {
appender.appendSql( geomFromTextName );
int srid = 0;
appender.appendSql( "('" );
Geometry<?> geom;
if ( javaType instanceof GeolatteGeometryJavaTypeDescriptor ) {
appender.appendSql( Wkt.toWkt( (Geometry<?>) value, wktDialect ) );
srid = ( (Geometry<?>) value ).getSRID();
geom = (Geometry<?>) value;
}
else {
appender.appendSql( Wkt.toWkt( jts2Gl( value ), wktDialect ) );
srid = ( (org.locationtech.jts.geom.Geometry) value ).getSRID();
geom = jts2Gl( value );
}
appender.appendSql( "', " );
appender.appendSql( srid );
appender.appendSql(")");
appender.appendSql( "ST_GeomFromText('" );
appender.appendSql( Wkt.toWkt( geom, Wkt.Dialect.SFA_1_1_0 ) );
appender.appendSql( "'," );
appender.appendSql( ( Math.max( geom.getSRID(), 0 ) ) );
appender.appendSql( ")" );
}
private <T> Geometry<?> jts2Gl(T value) {

View File

@ -14,6 +14,7 @@ import java.sql.SQLException;
import java.sql.Types;
import org.hibernate.spatial.GeolatteGeometryJavaTypeDescriptor;
import org.hibernate.spatial.GeometryLiteralFormatter;
import org.hibernate.type.SqlTypes;
import org.hibernate.type.descriptor.ValueBinder;
import org.hibernate.type.descriptor.ValueExtractor;
@ -53,20 +54,7 @@ public class GeoDBGeometryType implements JdbcType {
//todo -- simplify as with postgis/mariadb
@Override
public <T> JdbcLiteralFormatter<T> getJdbcLiteralFormatter(JavaType<T> javaTypeDescriptor) {
return (appender, value, dialect, wrapperOptions) -> {
Geometry<?> geom;
if ( javaTypeDescriptor instanceof GeolatteGeometryJavaTypeDescriptor ) {
geom = (Geometry<?>) value;
}
else {
geom = jts2Gl( value );
}
appender.appendSql( "ST_GeomFromText('" );
appender.appendSql( Wkt.toWkt( geom, Wkt.Dialect.SFA_1_1_0 ) );
appender.appendSql( "'," );
appender.appendSql( ( geom.getSRID() ) );
appender.appendSql( ")" );
};
return new GeometryLiteralFormatter<T>( javaTypeDescriptor, Wkt.Dialect.SFA_1_1_0, "ST_GeomFromText" );
}
private <T> Geometry<?> jts2Gl(T value) {

View File

@ -6,9 +6,6 @@
*/
package org.hibernate.spatial.dialect.mysql;
import org.hibernate.dialect.InnoDBStorageEngine;
import org.hibernate.dialect.MySQLStorageEngine;
/**
* A Dialect for MySQL 5 using InnoDB engine, with support for its spatial features
*

View File

@ -1,176 +0,0 @@
/*
* 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.mysql;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.spatial.SpatialFunction;
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
import org.hibernate.type.StandardBasicTypes;
/**
* An {@code Iterable} over the spatial functions supported by MySQL 5.x.
*
* @author Karel Maesen, Geovise BVBA
*/
class MySQL5SpatialFunctions extends SpatialFunctionsRegistry {
MySQL5SpatialFunctions() {
functionMap.put(
"dimension", new StandardSQLFunction(
"dimension",
StandardBasicTypes.INTEGER
)
);
functionMap.put(
"geometrytype", new StandardSQLFunction(
"geometrytype", StandardBasicTypes.STRING
)
);
functionMap.put(
"srid", new StandardSQLFunction(
"srid",
StandardBasicTypes.INTEGER
)
);
functionMap.put(
"envelope", new StandardSQLFunction(
"envelope"
)
);
functionMap.put(
"astext", new StandardSQLFunction(
"astext",
StandardBasicTypes.STRING
)
);
functionMap.put(
"asbinary", new StandardSQLFunction(
"asbinary",
StandardBasicTypes.BINARY
)
);
functionMap.put(
"isempty", new StandardSQLFunction(
"isempty",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"issimple", new StandardSQLFunction(
"issimple",
StandardBasicTypes.BOOLEAN
)
);
// functionMap.put(
// "boundary", new StandardSQLFunction(
// "boundary"
// )
// );
// Register functions for spatial relation constructs
functionMap.put(
"overlaps", new StandardSQLFunction(
"overlaps",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"intersects", new StandardSQLFunction(
"intersects",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"equals", new StandardSQLFunction(
"equals",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"contains", new StandardSQLFunction(
"contains",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"crosses", new StandardSQLFunction(
"crosses",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"disjoint", new StandardSQLFunction(
"disjoint",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"touches", new StandardSQLFunction(
"touches",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"within", new StandardSQLFunction(
"within",
StandardBasicTypes.BOOLEAN
)
);
// functionMap.put(
// "relate", new StandardSQLFunction(
// "relate",
// StandardBasicTypes.BOOLEAN
// )
// );
//
// // register the spatial analysis functions
// functionMap.put(
// "distance", new StandardSQLFunction(
// "distance",
// StandardBasicTypes.DOUBLE
// )
// );
// functionMap.put(
// "buffer", new StandardSQLFunction(
// "buffer"
// )
// );
// functionMap.put(
// "convexhull", new StandardSQLFunction(
// "convexhull"
// )
// );
// functionMap.put(
// "difference", new StandardSQLFunction(
// "difference"
// )
// );
// functionMap.put(
// "intersection", new StandardSQLFunction(
// "intersection"
// )
// );
// functionMap.put(
// "symdifference", new StandardSQLFunction(
// "symdifference"
// )
// );
// functionMap.put(
// "geomunion", new StandardSQLFunction(
// "union"
// )
// );
functionMap.put(
SpatialFunction.filter.name(), new StandardSQLFunction(
"MBRIntersects",
StandardBasicTypes.BOOLEAN
)
);
}
}

View File

@ -1,16 +0,0 @@
/*
* 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.mysql;
import org.hibernate.dialect.MySQL8Dialect;
import org.hibernate.spatial.SpatialDialect;
/**
* Created by Karel Maesen, Geovise BVBA on 2019-03-07.
*/
public class MySQL8SpatialDialect extends MySQL8Dialect implements SpatialDialect {
}

View File

@ -1,182 +0,0 @@
/*
* 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.mysql;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.spatial.SpatialFunction;
import org.hibernate.spatial.dialect.SpatialFunctionsRegistry;
import org.hibernate.type.StandardBasicTypes;
/**
* An {@code Iterable} over the spatial functions supported by MySQL 8.
*
* @author Karel Maesen, Geovise BVBA
*/
class MySQL8SpatialFunctions extends SpatialFunctionsRegistry {
MySQL8SpatialFunctions() {
functionMap.put(
"dimension", new StandardSQLFunction(
"ST_Dimension",
StandardBasicTypes.INTEGER
)
);
functionMap.put(
"geometrytype", new StandardSQLFunction(
"ST_GeometryType", StandardBasicTypes.STRING
)
);
functionMap.put(
"srid", new StandardSQLFunction(
"ST_SRID",
StandardBasicTypes.INTEGER
)
);
functionMap.put(
"envelope", new StandardSQLFunction(
"ST_Envelope"
)
);
functionMap.put(
"astext", new StandardSQLFunction(
"ST_Astext",
StandardBasicTypes.STRING
)
);
functionMap.put(
"asbinary", new StandardSQLFunction(
"ST_Asbinary",
StandardBasicTypes.BINARY
)
);
functionMap.put(
"isempty", new StandardSQLFunction(
"ST_IsEmpty",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"issimple", new StandardSQLFunction(
"ST_IsSimple",
StandardBasicTypes.BOOLEAN
)
);
// functionMap.put(
// "boundary", new StandardSQLFunction(
// "boundary"
// )
// );
// Register functions for spatial relation constructs
functionMap.put(
"overlaps", new StandardSQLFunction(
"ST_Overlaps",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"intersects", new StandardSQLFunction(
"ST_Intersects",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"equals", new StandardSQLFunction(
"ST_Equals",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"contains", new StandardSQLFunction(
"ST_Contains",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"crosses", new StandardSQLFunction(
"ST_Crosses",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"disjoint", new StandardSQLFunction(
"ST_Disjoint",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"touches", new StandardSQLFunction(
"ST_Touches",
StandardBasicTypes.BOOLEAN
)
);
functionMap.put(
"within", new StandardSQLFunction(
"ST_Within",
StandardBasicTypes.BOOLEAN
)
);
// functionMap.put(
// "relate", new StandardSQLFunction(
// "relate",
// StandardBasicTypes.BOOLEAN
// )
// );
//
// register the spatial analysis functions
functionMap.put(
"distance", new StandardSQLFunction(
"ST_Distance",
StandardBasicTypes.DOUBLE
)
);
functionMap.put(
"buffer", new StandardSQLFunction(
"ST_Buffer"
)
);
functionMap.put(
"convexhull", new StandardSQLFunction(
"ST_ConvexHull"
)
);
functionMap.put(
"difference", new StandardSQLFunction(
"ST_Difference"
)
);
functionMap.put(
"intersection", new StandardSQLFunction(
"ST_Intersection"
)
);
functionMap.put(
"symdifference", new StandardSQLFunction(
"ST_SymDifference"
)
);
functionMap.put(
"geomunion", new StandardSQLFunction(
"ST_Union"
)
);
functionMap.put(
SpatialFunction.filter.name(), new StandardSQLFunction(
"MBRIntersects",
StandardBasicTypes.BOOLEAN
)
);
}
}

View File

@ -16,7 +16,6 @@ import org.hibernate.spatial.HSMessageLogger;
import org.hibernate.spatial.JTSGeometryType;
import org.hibernate.spatial.KeyedSqmFunctionDescriptors;
import org.hibernate.spatial.contributor.ContributorImplementor;
import org.hibernate.spatial.dialect.mariadb.MariaDBSqmFunctionDescriptors;
public class MySQLDialectContributor implements ContributorImplementor {

View File

@ -7,11 +7,31 @@
package org.hibernate.spatial.dialect.mysql;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.spatial.BaseSqmFunctionDescriptors;
import org.hibernate.spatial.CommonSpatialFunction;
public class MySqlSqmFunctionDescriptors extends BaseSqmFunctionDescriptors {
final static private List<CommonSpatialFunction> unsupported = new ArrayList<>();
static {
unsupported.add( CommonSpatialFunction.ST_BOUNDARY );
unsupported.add( CommonSpatialFunction.ST_RELATE );
}
public MySqlSqmFunctionDescriptors(FunctionContributions functionContributions) {
super( functionContributions );
}
@Override
public CommonSpatialFunction[] filter(CommonSpatialFunction[] functions) {
return Arrays.stream( functions )
.filter( f -> !unsupported.contains( f ) )
.toArray( CommonSpatialFunction[]::new );
}
}

View File

@ -23,6 +23,8 @@ import org.hibernate.spatial.testing.domain.GeomEntityLike;
import org.hibernate.testing.orm.junit.DialectContext;
import org.geolatte.geom.Geometry;
import static org.hibernate.spatial.testing.datareader.TestSupport.TestDataPurpose.SpatialFunctionsData;
import static org.hibernate.spatial.testing.datareader.TestSupport.TestDataPurpose.StoreRetrieveData;
@ -32,9 +34,11 @@ public class SpatialTestDataProvider {
protected final NativeSQLTemplates templates;
protected final PredicateRegexes predicateRegexes;
protected final Map<CommonSpatialFunction, String> hqlOverrides;
protected final Geometry<?> filterGeometry;
private final TestData funcTestData;
protected TestData testData;
protected GeomCodec codec;
protected List<CommonSpatialFunction> exludeFromTest;
public SpatialTestDataProvider() {
try {
@ -44,7 +48,9 @@ public class SpatialTestDataProvider {
hqlOverrides = support.hqlOverrides();
codec = support.codec();
testData = support.createTestData( StoreRetrieveData );
exludeFromTest = support.getExcludeFromTests();
funcTestData = support.createTestData( SpatialFunctionsData );
filterGeometry = support.getFilterGeometry();
}
catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException( e );

View File

@ -64,8 +64,9 @@ public class CommonFunctionTests extends SpatialTestBase {
public Stream<DynamicTest> testFunction() {
return
TestTemplates.all( templates, hqlOverrides )
TestTemplates.all( templates, hqlOverrides, filterGeometry )
.filter( f -> isSupported( f.function ) )
.filter( f -> !exludeFromTest.contains( f.function ) )
.flatMap( t -> Stream.of(
t.build( Model.JTSMODEL, codec ),
t.build( Model.GLMODEL, codec )
@ -98,7 +99,11 @@ public class CommonFunctionTests extends SpatialTestBase {
return () -> {
expected = template.executeNativeQuery( scope );
received = template.executeHQL( scope, fnName );
assertEquals( expected, received );
if ( !expected.equals( received ) ) {
for ( int i = 0; i < expected.size(); i++ ) {
assertEquals( expected.get( i ), received.get( i ) );
}
}
};
}
}

View File

@ -36,16 +36,6 @@ import static org.geolatte.geom.crs.CoordinateReferenceSystems.WGS84;
public class TestGeometryConstructionWithParameter extends SpatialTestBase {
final private Map<CommonSpatialFunction, String> templates = new HashMap<>();
final private Geometry<G2D> geometry = polygon(
WGS84,
ring(
g( 0, 0 ),
g( 10, 0 ),
g( 10, 10 ),
g( 0, 10 ),
g( 0, 0 )
)
);
TestGeometryConstructionWithParameter() {
templates.put(
@ -92,7 +82,7 @@ public class TestGeometryConstructionWithParameter extends SpatialTestBase {
scope.inSession( session -> {
String hql = templates.get( func );
session.createQuery( hql )
.setParameter( "poly", geometry )
.setParameter( "poly", filterGeometry )
.getResultList();
//we just check that this parses for now.
} );

View File

@ -21,6 +21,7 @@ import org.hibernate.spatial.CommonSpatialFunction;
import org.hibernate.spatial.testing.dialects.NativeSQLTemplates;
import org.geolatte.geom.G2D;
import org.geolatte.geom.Geometry;
import org.geolatte.geom.Polygon;
import static org.geolatte.geom.builder.DSL.g;
@ -37,14 +38,11 @@ public abstract class TestTemplates {
return new FunctionTestTemplate.Builder( function );
}
static final Polygon<G2D> filter = polygon(
WGS84,
ring( g( 0, 0 ), g( 0, 10 ), g( 10, 10 ), g( 10, 0 ), g( 0, 0 ) )
);
public static Stream<FunctionTestTemplate.Builder> all(
NativeSQLTemplates sqlTemplates,
Map<CommonSpatialFunction, String> hqlOverrides) {
Map<CommonSpatialFunction, String> hqlOverrides,
Geometry<?>filter) {
Map<CommonSpatialFunction, String> templates = sqlTemplates.all();
return templates

View File

@ -45,11 +45,6 @@ abstract public class SpatialPredicatesTest extends SpatialTestBase {
public final static TestSupport.TestDataPurpose PURPOSE = TestSupport.TestDataPurpose.SpatialFunctionsData;
static final Polygon<G2D> filter = polygon(
WGS84,
ring( g( 0, 0 ), g( 0, 10 ), g( 10, 10 ), g( 10, 0 ), g( 0, 0 ) )
);
@Override
public TestSupport.TestDataPurpose purpose() {
return PURPOSE;
@ -117,7 +112,7 @@ abstract public class SpatialPredicatesTest extends SpatialTestBase {
try {
query.select( root )
.where( (Expression<Boolean>) method.invoke(
null, criteriaBuilder, root.get( "geom" ), model.from.apply( filter ) ) );
null, criteriaBuilder, root.get( "geom" ), model.from.apply( filterGeometry ) ) );
}
catch (IllegalAccessException | InvocationTargetException e) {
throw new JUnitException( "Failure to invoke Geometry Predicate", e );

View File

@ -14,16 +14,24 @@
package org.hibernate.spatial.testing.datareader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.spatial.CommonSpatialFunction;
import org.hibernate.spatial.GeomCodec;
import org.hibernate.spatial.testing.AbstractExpectationsFactory;
import org.hibernate.spatial.testing.dialects.NativeSQLTemplates;
import org.hibernate.spatial.testing.dialects.PredicateRegexes;
import org.geolatte.geom.Geometry;
import static org.geolatte.geom.builder.DSL.g;
import static org.geolatte.geom.builder.DSL.polygon;
import static org.geolatte.geom.builder.DSL.ring;
import static org.geolatte.geom.crs.CoordinateReferenceSystems.WGS84;
/**
* @author Karel Maesen, Geovise BVBA
@ -46,6 +54,10 @@ public abstract class TestSupport {
return new HashMap<>();
}
public List<CommonSpatialFunction> getExcludeFromTests() {
return new ArrayList<>();
}
public enum TestDataPurpose {
SpatialFunctionsData,
StoreRetrieveData
@ -57,4 +69,11 @@ public abstract class TestSupport {
throw new NotYetImplementedFor6Exception();
}
public Geometry<?> getFilterGeometry() {
return polygon(
WGS84,
ring( g( 0, 0 ), g( 0, 10 ), g( 10, 10 ), g( 10, 0 ), g( 0, 0 ) )
);
}
}

View File

@ -8,20 +8,27 @@
package org.hibernate.spatial.testing.dialects.mysql;
import java.util.List;
import java.util.Map;
import org.hibernate.spatial.CommonSpatialFunction;
import org.hibernate.spatial.GeomCodec;
import org.hibernate.spatial.dialect.mariadb.MariaDBGeometryType;
import org.hibernate.spatial.dialect.mysql.MySQLGeometryType;
import org.hibernate.spatial.testing.AbstractExpectationsFactory;
import org.hibernate.spatial.testing.JTSGeometryEquality;
import org.hibernate.spatial.testing.datareader.TestData;
import org.hibernate.spatial.testing.datareader.TestSupport;
import org.hibernate.spatial.testing.dialects.NativeSQLTemplates;
import org.hibernate.spatial.testing.dialects.PredicateRegexes;
import org.geolatte.geom.Geometry;
import org.geolatte.geom.crs.CoordinateReferenceSystems;
import org.geolatte.geom.crs.CrsId;
import org.geolatte.geom.crs.LinearUnit;
import org.geolatte.geom.crs.ProjectedCoordinateReferenceSystem;
import static org.geolatte.geom.builder.DSL.c;
import static org.geolatte.geom.builder.DSL.polygon;
import static org.geolatte.geom.builder.DSL.ring;
/**
* @author Karel Maesen, Geovise BVBA
@ -29,6 +36,8 @@ import org.geolatte.geom.Geometry;
*/
public class MySQLTestSupport extends TestSupport {
ProjectedCoordinateReferenceSystem crs = CoordinateReferenceSystems.mkProjected( CrsId.valueOf( 0 ), LinearUnit.METER );
@Override
public TestData createTestData(TestDataPurpose purpose) {
return TestData.fromFile( "mysql/test-mysql-functions-data-set.xml" );
@ -49,12 +58,32 @@ public class MySQLTestSupport extends TestSupport {
return super.hqlOverrides();
}
@Override
public List<CommonSpatialFunction> getExcludeFromTests() {
List<CommonSpatialFunction> exclusions = super.getExcludeFromTests();
//these actually work, but the st_geomfromtext normalises the interior rings on polygons/geometry collections
//thereby invalidating the test
//todo allow a more relaxed geometry comparison that treats rings the same regardless of CCW or CW order
exclusions.add(CommonSpatialFunction.ST_UNION);
exclusions.add( CommonSpatialFunction.ST_SYMDIFFERENCE );
return exclusions;
}
@Override
public Geometry<?> getFilterGeometry() {
return polygon(
crs,
ring( c( 0, 0 ), c( 0, 10 ), c( 10, 10 ), c( 10, 0 ), c( 0, 0 ) )
);
}
@Override
public GeomCodec codec() {
return new GeomCodec() {
@Override
public Geometry<?> toGeometry(Object in) {
return MySQLGeometryType.INSTANCE.toGeometry( (byte[])in );
return MySQLGeometryType.INSTANCE.toGeometry( (byte[]) in );
}
};

View File

@ -9,6 +9,48 @@ package org.hibernate.spatial.testing.dialects.mysql;
import org.hibernate.spatial.testing.dialects.NativeSQLTemplates;
import static org.hibernate.spatial.CommonSpatialFunction.ST_BUFFER;
import static org.hibernate.spatial.CommonSpatialFunction.ST_CONTAINS;
import static org.hibernate.spatial.CommonSpatialFunction.ST_CONVEXHULL;
import static org.hibernate.spatial.CommonSpatialFunction.ST_CROSSES;
import static org.hibernate.spatial.CommonSpatialFunction.ST_DIFFERENCE;
import static org.hibernate.spatial.CommonSpatialFunction.ST_DISJOINT;
import static org.hibernate.spatial.CommonSpatialFunction.ST_DISTANCE;
import static org.hibernate.spatial.CommonSpatialFunction.ST_EQUALS;
import static org.hibernate.spatial.CommonSpatialFunction.ST_INTERSECTION;
import static org.hibernate.spatial.CommonSpatialFunction.ST_INTERSECTS;
import static org.hibernate.spatial.CommonSpatialFunction.ST_OVERLAPS;
import static org.hibernate.spatial.CommonSpatialFunction.ST_RELATE;
import static org.hibernate.spatial.CommonSpatialFunction.ST_SYMDIFFERENCE;
import static org.hibernate.spatial.CommonSpatialFunction.ST_TOUCHES;
import static org.hibernate.spatial.CommonSpatialFunction.ST_UNION;
import static org.hibernate.spatial.CommonSpatialFunction.ST_WITHIN;
public class MySqlNativeSqlTemplates extends NativeSQLTemplates {
public MySqlNativeSqlTemplates() {
super();
sqls.put( ST_OVERLAPS, "select id, st_overlaps(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_INTERSECTS, "select id, st_intersects(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_CROSSES, "select id, st_crosses(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_CONTAINS, "select id, st_contains(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_DISJOINT, "select id, st_disjoint(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_RELATE, "select id, st_relate(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_TOUCHES, "select id, st_touches(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_WITHIN, "select id, st_within(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_EQUALS, "select id, st_equals(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_DISTANCE, "select id, st_distance(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put( ST_BUFFER, "select id, st_buffer(geom, 2) as result from %s" );
sqls.put( ST_CONVEXHULL, "select id, st_convexhull(geom) as result from %s" );
sqls.put( ST_DIFFERENCE, "select id, st_difference(geom, st_geomfromtext(:filter, 0)) as result from %s" );
sqls.put(
ST_INTERSECTION,
"select id, st_intersection(geom, st_geomfromtext(:filter, 0)) as result from %s"
);
sqls.put(
ST_SYMDIFFERENCE,
"select id, st_symdifference(geom, st_geomfromtext(:filter, 0)) as result from %s"
);
sqls.put( ST_UNION, "select id, st_union(geom, st_geomfromtext(:filter, 0)) as result from %s" );
}
}

View File

@ -16,48 +16,48 @@ In MySQL these are stored as null objects.
<Element>
<id>1</id>
<type>POINT</type>
<wkt>SRID=4326;POINT(10 5)</wkt>
<wkt>SRID=0;POINT(10 5)</wkt>
</Element>
<Element>
<id>2</id>
<type>POINT</type>
<wkt>SRID=4326;POINT(52.25 2.53)</wkt>
<wkt>SRID=0;POINT(52.25 2.53)</wkt>
</Element>
<Element>
<id>3</id>
<type>POINT</type>
<wkt>SRID=4326;POINT(51 12)</wkt>
<wkt>SRID=0;POINT(51 12)</wkt>
</Element>
<Element>
<id>4</id>
<type>POINT</type>
<wkt>SRID=4326;POINT(10.0 2.0)</wkt>
<wkt>SRID=0;POINT(10.0 2.0)</wkt>
</Element>
<Element>
<id>5</id>
<type>LINESTRING</type>
<wkt>SRID=4326;LINESTRING(10.0 5.0, 20.0 15.0)</wkt>
<wkt>SRID=0;LINESTRING(10.0 5.0, 20.0 15.0)</wkt>
</Element>
<Element>
<id>6</id>
<type>LINESTRING</type>
<wkt>SRID=4326;LINESTRING(10.0 5.0, 20.0 15.0, 30.3 22.4, 10 30.0)</wkt>
<wkt>SRID=0;LINESTRING(10.0 5.0, 20.0 15.0, 30.3 22.4, 10 30.0)</wkt>
</Element>
<Element>
<id>11</id>
<type>MULTILINESTRING</type>
<wkt>SRID=4326;MULTILINESTRING((10.0 5.0, 20.0 15.0),( 25.0 30.0, 30.0 20.0))</wkt>
<wkt>SRID=0;MULTILINESTRING((10.0 5.0, 20.0 15.0),( 25.0 30.0, 30.0 20.0))</wkt>
</Element>
<Element>
<id>12</id>
<type>MULTILINESTRING</type>
<wkt>SRID=4326;MULTILINESTRING((10.0 5.0, 20.0 15.0, 30.3 22.4, 10 30.0), (40.0 20.0, 42.0 18.0, 43.0 16.0, 40
<wkt>SRID=0;MULTILINESTRING((10.0 5.0, 20.0 15.0, 30.3 22.4, 10 30.0), (40.0 20.0, 42.0 18.0, 43.0 16.0, 40
14.0))
</wkt>
</Element>
@ -66,28 +66,28 @@ In MySQL these are stored as null objects.
<Element>
<id>16</id>
<type>POLYGON</type>
<wkt>SRID=4326;POLYGON( (0 0, 0 10, 10 10, 10 0, 0 0) )</wkt>
<wkt>SRID=0;POLYGON( (0 0, 0 10, 10 10, 10 0, 0 0) )</wkt>
</Element>
<Element>
<id>18</id>
<type>POLYGON</type>
<wkt>SRID=4326;POLYGON( (0 0, 0 10, 10 10, 10 0, 0 0), (2 2, 2 5, 5 5,5 2, 2 2))</wkt>
<wkt>SRID=0;POLYGON( (0 0, 0 10, 10 10, 10 0, 0 0), (2 2, 2 5, 5 5,5 2, 2 2))</wkt>
</Element>
<Element>
<id>19</id>
<type>POLYGON</type>
<wkt>SRID=4326;POLYGON( (50 50, 50 70, 70 70, 70 50, 50 50) )</wkt>
<wkt>SRID=0;POLYGON( (50 50, 50 70, 70 70, 70 50, 50 50) )</wkt>
</Element>
<Element>
<id>20</id>
<type>MULTIPOLYGON</type>
<wkt>SRID=4326;MULTIPOLYGON( ((10 20, 30 40, 44 50, 10 20)), ((55 50, 60 70, 70 78, 55 50)) )</wkt>
<wkt>SRID=0;MULTIPOLYGON( ((10 20, 30 40, 44 50, 10 20)), ((55 50, 60 70, 70 78, 55 50)) )</wkt>
</Element>
<Element>
<id>22</id>
<type>MULTIPOLYGON</type>
<wkt>SRID=4326;MULTIPOLYGON(( (0 0, 0 50, 50 50, 50 0, 0 0), (10 10, 10 20, 20 20, 20 10, 10 10) ),((15 10, 12
<wkt>SRID=0;MULTIPOLYGON(( (0 0, 0 50, 50 50, 50 0, 0 0), (10 10, 10 20, 20 20, 20 10, 10 10) ),((15 10, 12
14, 13
14, 15 10)) )
</wkt>
@ -97,28 +97,28 @@ In MySQL these are stored as null objects.
<Element>
<id>25</id>
<type>MULTIPOINT</type>
<wkt>SRID=4326;MULTIPOINT(21 2, 25 5, 30 3)</wkt>
<wkt>SRID=0;MULTIPOINT(21 2, 25 5, 30 3)</wkt>
</Element>
<Element>
<id>26</id>
<type>MULTIPOINT</type>
<wkt>SRID=4326;MULTIPOINT(21 2)</wkt>
<wkt>SRID=0;MULTIPOINT(21 2)</wkt>
</Element>
<Element>
<id>30</id>
<type>GEOMETRYCOLLECTION</type>
<wkt>SRID=4326;GEOMETRYCOLLECTION(POINT(4 0), LINESTRING(4 2, 5 3))</wkt>
<wkt>SRID=0;GEOMETRYCOLLECTION(POINT(4 0), LINESTRING(4 2, 5 3))</wkt>
</Element>
<Element>
<id>31</id>
<type>GEOMETRYCOLLECTION</type>
<wkt>SRID=4326;GEOMETRYCOLLECTION(POINT(4 0), LINESTRING(4 2, 5 3), POLYGON((0 0, 3 0, 3 3,0 3, 0 0)))</wkt>
<wkt>SRID=0;GEOMETRYCOLLECTION(POINT(4 0), LINESTRING(4 2, 5 3), POLYGON((0 0, 3 0, 3 3,0 3, 0 0)))</wkt>
</Element>
<Element>
<id>32</id>
<type>GEOMETRYCOLLECTION</type>
<wkt>SRID=4326;GEOMETRYCOLLECTION(POINT(4 0), LINESTRING(4 2, 5 3), POLYGON((0 0, 3 0, 3 3,0 3, 0 0),(1 1, 2 1,
<wkt>SRID=0;GEOMETRYCOLLECTION(POINT(4 0), LINESTRING(4 2, 5 3), POLYGON((0 0, 3 0, 3 3,0 3, 0 0),(1 1, 2 1,
2 2, 1 2,
1 1)))
</wkt>
@ -126,7 +126,7 @@ In MySQL these are stored as null objects.
<Element>
<id>33</id>
<type>GEOMETRYCOLLECTION</type>
<wkt>SRID=4326;GEOMETRYCOLLECTION( MULTIPOINT(21 2, 25 5, 30 3), MULTIPOLYGON( ((10 20, 30 40, 44 50, 10 20)),
<wkt>SRID=0;GEOMETRYCOLLECTION( MULTIPOINT(21 2, 25 5, 30 3), MULTIPOLYGON( ((10 20, 30 40, 44 50, 10 20)),
((15 10,
12 14, 13 14, 15 10)) ), MULTILINESTRING((10.0 5.0, 20.0 15.0),( 25.0 30.0, 30.0 20.0)))
</wkt>