HHH-14808 Fix PredicateSmokeTest
Refactors SpatialTestBase to use a SessionFactoryAware implementation that performs necessary initialisations (e.g. H2).
This commit is contained in:
parent
eaea919cf5
commit
aded53a760
|
@ -10,11 +10,11 @@ package org.hibernate.spatial.integration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import jakarta.persistence.Query;
|
|
||||||
|
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.spatial.testing.IsSupportedBySpatial;
|
import org.hibernate.spatial.testing.IsSupportedBySpatial;
|
||||||
|
import org.hibernate.spatial.testing.SpatialSessionFactoryAware;
|
||||||
import org.hibernate.spatial.testing.datareader.TestDataElement;
|
import org.hibernate.spatial.testing.datareader.TestDataElement;
|
||||||
import org.hibernate.spatial.testing.domain.GeomEntity;
|
import org.hibernate.spatial.testing.domain.GeomEntity;
|
||||||
import org.hibernate.spatial.testing.domain.GeomEntityLike;
|
import org.hibernate.spatial.testing.domain.GeomEntityLike;
|
||||||
|
@ -25,12 +25,13 @@ import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScopeAware;
|
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.ValueSource;
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
|
||||||
|
import jakarta.persistence.Query;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
|
||||||
|
@ -39,11 +40,9 @@ import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
* Created by Karel Maesen, Geovise BVBA on 15/02/2018.
|
* Created by Karel Maesen, Geovise BVBA on 15/02/2018.
|
||||||
*/
|
*/
|
||||||
@DomainModel(modelDescriptorClasses = SpatialDomainModel.class)
|
@DomainModel(modelDescriptorClasses = SpatialDomainModel.class)
|
||||||
@RequiresDialectFeature( feature = IsSupportedBySpatial.class)
|
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
|
||||||
@SessionFactory
|
@SessionFactory
|
||||||
public class StoreAndRetrieveTests extends SpatialTestDataProvider implements SessionFactoryScopeAware {
|
public class StoreAndRetrieveTests extends SpatialSessionFactoryAware {
|
||||||
|
|
||||||
SessionFactoryScope scope;
|
|
||||||
|
|
||||||
private Map<Integer, Object> stored = new HashMap<>();
|
private Map<Integer, Object> stored = new HashMap<>();
|
||||||
|
|
||||||
|
@ -52,14 +51,14 @@ public class StoreAndRetrieveTests extends SpatialTestDataProvider implements Se
|
||||||
public void testStoringGeomEntity(final Class entityClass) {
|
public void testStoringGeomEntity(final Class entityClass) {
|
||||||
|
|
||||||
//check whether we retrieve exactly what we store
|
//check whether we retrieve exactly what we store
|
||||||
scope.inTransaction( session -> storeTestObjects ( session, entityClass) );
|
scope.inTransaction( session -> storeTestObjects( session, entityClass ) );
|
||||||
scope.inTransaction( session -> retrieveAndCompare( session, entityClass ) );
|
scope.inTransaction( session -> retrieveAndCompare( session, entityClass ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@AfterEach
|
@AfterEach
|
||||||
public void cleanTables(SessionFactoryScope scope) {
|
public void cleanTables(SessionFactoryScope scope) {
|
||||||
scope.inTransaction( session -> session.createQuery( "delete from GeomEntity").executeUpdate() );
|
scope.inTransaction( session -> session.createQuery( "delete from GeomEntity" ).executeUpdate() );
|
||||||
scope.inTransaction( session -> session.createQuery( "delete from JtsGeomEntity").executeUpdate() );
|
scope.inTransaction( session -> session.createQuery( "delete from JtsGeomEntity" ).executeUpdate() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -111,8 +110,5 @@ public class StoreAndRetrieveTests extends SpatialTestDataProvider implements Se
|
||||||
assertNull( entity.getGeom() );
|
assertNull( entity.getGeom() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void injectSessionFactoryScope(SessionFactoryScope scope) {
|
|
||||||
this.scope = scope;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,13 +23,9 @@ import org.junit.jupiter.api.DynamicTest;
|
||||||
import org.junit.jupiter.api.TestFactory;
|
import org.junit.jupiter.api.TestFactory;
|
||||||
import org.junit.jupiter.api.function.Executable;
|
import org.junit.jupiter.api.function.Executable;
|
||||||
|
|
||||||
import org.geolatte.geom.G2D;
|
|
||||||
import org.geolatte.geom.Geometry;
|
|
||||||
|
|
||||||
import static org.geolatte.geom.builder.DSL.g;
|
import static org.geolatte.geom.builder.DSL.g;
|
||||||
import static org.geolatte.geom.builder.DSL.polygon;
|
import static org.geolatte.geom.builder.DSL.polygon;
|
||||||
import static org.geolatte.geom.builder.DSL.ring;
|
import static org.geolatte.geom.builder.DSL.ring;
|
||||||
import static org.geolatte.geom.crs.CoordinateReferenceSystems.WGS84;
|
|
||||||
|
|
||||||
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
|
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
|
||||||
@SessionFactory
|
@SessionFactory
|
||||||
|
|
|
@ -11,14 +11,13 @@ import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.spatial.predicate.GeolatteSpatialPredicates;
|
import org.hibernate.spatial.predicate.GeolatteSpatialPredicates;
|
||||||
import org.hibernate.spatial.testing.IsSupportedBySpatial;
|
import org.hibernate.spatial.testing.IsSupportedBySpatial;
|
||||||
|
import org.hibernate.spatial.testing.SpatialSessionFactoryAware;
|
||||||
import org.hibernate.spatial.testing.domain.GeomEntity;
|
import org.hibernate.spatial.testing.domain.GeomEntity;
|
||||||
import org.hibernate.spatial.testing.domain.SpatialDomainModel;
|
import org.hibernate.spatial.testing.domain.SpatialDomainModel;
|
||||||
|
|
||||||
import org.hibernate.testing.orm.junit.DomainModel;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScopeAware;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
|
@ -33,11 +32,10 @@ import static org.geolatte.geom.builder.DSL.ring;
|
||||||
import static org.geolatte.geom.crs.CoordinateReferenceSystems.WGS84;
|
import static org.geolatte.geom.crs.CoordinateReferenceSystems.WGS84;
|
||||||
|
|
||||||
@DomainModel(modelDescriptorClasses = SpatialDomainModel.class)
|
@DomainModel(modelDescriptorClasses = SpatialDomainModel.class)
|
||||||
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
|
|
||||||
@SessionFactory
|
@SessionFactory
|
||||||
public class PredicateSmokeTest implements SessionFactoryScopeAware {
|
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
|
||||||
|
public class PredicateSmokeTest extends SpatialSessionFactoryAware {
|
||||||
|
|
||||||
private SessionFactoryScope scope;
|
|
||||||
Polygon<G2D> poly = polygon(
|
Polygon<G2D> poly = polygon(
|
||||||
WGS84,
|
WGS84,
|
||||||
ring( g( 0, 0 ), g( 0, 10 ), g( 10, 10 ), g( 10, 0 ), g( 0, 0 ) )
|
ring( g( 0, 0 ), g( 0, 10 ), g( 10, 10 ), g( 10, 0 ), g( 0, 0 ) )
|
||||||
|
@ -56,9 +54,4 @@ public class PredicateSmokeTest implements SessionFactoryScopeAware {
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void injectSessionFactoryScope(SessionFactoryScope scope) {
|
|
||||||
this.scope = scope;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,6 @@ import java.lang.reflect.Method;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import jakarta.persistence.criteria.CriteriaBuilder;
|
|
||||||
import jakarta.persistence.criteria.CriteriaQuery;
|
|
||||||
import jakarta.persistence.criteria.Expression;
|
|
||||||
import jakarta.persistence.criteria.Root;
|
|
||||||
|
|
||||||
import org.hibernate.spatial.integration.Model;
|
import org.hibernate.spatial.integration.Model;
|
||||||
import org.hibernate.spatial.predicate.GeolatteSpatialPredicates;
|
import org.hibernate.spatial.predicate.GeolatteSpatialPredicates;
|
||||||
|
@ -31,13 +27,11 @@ import org.junit.jupiter.api.TestFactory;
|
||||||
import org.junit.jupiter.api.function.Executable;
|
import org.junit.jupiter.api.function.Executable;
|
||||||
import org.junit.platform.commons.JUnitException;
|
import org.junit.platform.commons.JUnitException;
|
||||||
|
|
||||||
import org.geolatte.geom.G2D;
|
import jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
import org.geolatte.geom.Polygon;
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
import jakarta.persistence.criteria.Expression;
|
||||||
|
import jakarta.persistence.criteria.Root;
|
||||||
|
|
||||||
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;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* 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.testing;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.H2Dialect;
|
||||||
|
import org.hibernate.spatial.CommonSpatialFunction;
|
||||||
|
import org.hibernate.spatial.integration.SpatialTestDataProvider;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DialectContext;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScopeAware;
|
||||||
|
|
||||||
|
import org.h2gis.functions.factory.H2GISFunctions;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class SpatialSessionFactoryAware extends SpatialTestDataProvider implements SessionFactoryScopeAware {
|
||||||
|
protected SessionFactoryScope scope;
|
||||||
|
protected Set<String> supportedFunctions;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectSessionFactoryScope(SessionFactoryScope scope) {
|
||||||
|
this.scope = scope;
|
||||||
|
//scope is set to null during test cleanup
|
||||||
|
if ( scope != null ) {
|
||||||
|
this.supportedFunctions = scope.getSessionFactory()
|
||||||
|
.getQueryEngine()
|
||||||
|
.getSqmFunctionRegistry()
|
||||||
|
.getFunctions()
|
||||||
|
.keySet();
|
||||||
|
if ( DialectContext.getDialect() instanceof H2Dialect ) {
|
||||||
|
initH2GISExtensionsForInMemDb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSupported(CommonSpatialFunction function) {
|
||||||
|
return supportedFunctions.contains( function.name() );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initH2GISExtensionsForInMemDb() {
|
||||||
|
this.scope.inSession( session -> {
|
||||||
|
try {
|
||||||
|
Connection cn = session.getJdbcConnectionAccess().obtainConnection();
|
||||||
|
H2GISFunctions.load( cn );
|
||||||
|
}
|
||||||
|
catch (SQLException e) {
|
||||||
|
throw new RuntimeException( e );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,13 +7,7 @@
|
||||||
|
|
||||||
package org.hibernate.spatial.testing;
|
package org.hibernate.spatial.testing;
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.hibernate.dialect.H2Dialect;
|
import org.hibernate.dialect.H2Dialect;
|
||||||
import org.hibernate.spatial.CommonSpatialFunction;
|
|
||||||
import org.hibernate.spatial.integration.SpatialTestDataProvider;
|
|
||||||
import org.hibernate.spatial.testing.datareader.TestSupport;
|
import org.hibernate.spatial.testing.datareader.TestSupport;
|
||||||
import org.hibernate.spatial.testing.domain.GeomEntity;
|
import org.hibernate.spatial.testing.domain.GeomEntity;
|
||||||
import org.hibernate.spatial.testing.domain.JtsGeomEntity;
|
import org.hibernate.spatial.testing.domain.JtsGeomEntity;
|
||||||
|
@ -22,37 +16,15 @@ import org.hibernate.spatial.testing.domain.SpatialDomainModel;
|
||||||
import org.hibernate.testing.orm.junit.DialectContext;
|
import org.hibernate.testing.orm.junit.DialectContext;
|
||||||
import org.hibernate.testing.orm.junit.DomainModel;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScopeAware;
|
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
|
||||||
import org.h2gis.functions.factory.H2GISFunctions;
|
|
||||||
|
|
||||||
@DomainModel(modelDescriptorClasses = SpatialDomainModel.class)
|
@DomainModel(modelDescriptorClasses = SpatialDomainModel.class)
|
||||||
abstract public class SpatialTestBase
|
abstract public class SpatialTestBase
|
||||||
extends SpatialTestDataProvider implements SessionFactoryScopeAware {
|
extends SpatialSessionFactoryAware {
|
||||||
|
|
||||||
protected SessionFactoryScope scope;
|
|
||||||
protected Set<String> supportedFunctions;
|
|
||||||
|
|
||||||
public abstract TestSupport.TestDataPurpose purpose();
|
public abstract TestSupport.TestDataPurpose purpose();
|
||||||
|
|
||||||
@Override
|
|
||||||
public void injectSessionFactoryScope(SessionFactoryScope scope) {
|
|
||||||
this.scope = scope;
|
|
||||||
//scope is set to null during test cleanup
|
|
||||||
if ( scope != null ) {
|
|
||||||
this.supportedFunctions = scope.getSessionFactory()
|
|
||||||
.getQueryEngine()
|
|
||||||
.getSqmFunctionRegistry()
|
|
||||||
.getFunctions()
|
|
||||||
.keySet();
|
|
||||||
if ( DialectContext.getDialect() instanceof H2Dialect ) {
|
|
||||||
initH2GISExtensionsForInMemDb();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void beforeEach() {
|
public void beforeEach() {
|
||||||
scope.inTransaction( session -> super.entities(
|
scope.inTransaction( session -> super.entities(
|
||||||
|
@ -72,21 +44,5 @@ abstract public class SpatialTestBase
|
||||||
scope.inTransaction( session -> session.createQuery( "delete from JtsGeomEntity" ).executeUpdate() );
|
scope.inTransaction( session -> session.createQuery( "delete from JtsGeomEntity" ).executeUpdate() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSupported(CommonSpatialFunction function) {
|
|
||||||
return supportedFunctions.contains( function.name() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void initH2GISExtensionsForInMemDb() {
|
|
||||||
this.scope.inSession( session -> {
|
|
||||||
try {
|
|
||||||
Connection cn = session.getJdbcConnectionAccess().obtainConnection();
|
|
||||||
H2GISFunctions.load( cn );
|
|
||||||
}
|
|
||||||
catch (SQLException e) {
|
|
||||||
throw new RuntimeException( e );
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,11 @@ public class PredicateRegexes {
|
||||||
"select .* from .* where st_within\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
|
"select .* from .* where st_within\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
|
||||||
|
|
||||||
);
|
);
|
||||||
|
add(
|
||||||
|
"intersects",
|
||||||
|
"select .* from .* where st_intersects\\(.*geom\\s*,.*" + geomFromTextFunction + "\\(.*\\)\\s*=.*",
|
||||||
|
"select .* from .* where st_intersects\\(.*geom\\s*,.s*?\\)\\s*=\\s*?.*"
|
||||||
|
);
|
||||||
add(
|
add(
|
||||||
"eq",
|
"eq",
|
||||||
"select .* from .* where st_equals\\(.*geom\\s*,.*" + geomFromTextFunction + "\\(.*\\)\\s*=.*",
|
"select .* from .* where st_equals\\(.*geom\\s*,.*" + geomFromTextFunction + "\\(.*\\)\\s*=.*",
|
||||||
|
|
Loading…
Reference in New Issue