HHH-14925 Add additional unit tests.
This commit is contained in:
parent
0300e54fef
commit
5a7ad6d11c
|
@ -6,8 +6,12 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.mapping.type.contribution.array;
|
package org.hibernate.orm.test.mapping.type.contribution.array;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.boot.model.FunctionContributor;
|
||||||
import org.hibernate.boot.model.TypeContributor;
|
import org.hibernate.boot.model.TypeContributor;
|
||||||
import org.hibernate.dialect.H2Dialect;
|
import org.hibernate.dialect.H2Dialect;
|
||||||
|
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
|
||||||
|
|
||||||
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry;
|
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry;
|
||||||
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry.JavaService;
|
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry.JavaService;
|
||||||
|
@ -18,13 +22,21 @@ import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
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 jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
import jakarta.persistence.criteria.Expression;
|
||||||
|
import jakarta.persistence.criteria.Predicate;
|
||||||
|
import jakarta.persistence.criteria.Root;
|
||||||
import org.assertj.core.util.Arrays;
|
import org.assertj.core.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
@BootstrapServiceRegistry(
|
@BootstrapServiceRegistry(
|
||||||
javaServices = @JavaService( role = TypeContributor.class, impl = StringArrayTypeContributor.class )
|
javaServices = {
|
||||||
|
@JavaService(role = TypeContributor.class, impl = StringArrayTypeContributor.class),
|
||||||
|
@JavaService(role = FunctionContributor.class, impl = StringArrayFunctionContributor.class)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
@DomainModel(annotatedClasses = Post.class)
|
@DomainModel(annotatedClasses = Post.class)
|
||||||
@SessionFactory
|
@SessionFactory
|
||||||
|
@ -50,11 +62,38 @@ public class StringArrayContributorTests {
|
||||||
session.createQuery( "select p from Post p where array_contains(:arr, p.title) = true" )
|
session.createQuery( "select p from Post p where array_contains(:arr, p.title) = true" )
|
||||||
.setParameter( "arr", Arrays.array( "a", "b" ) )
|
.setParameter( "arr", Arrays.array( "a", "b" ) )
|
||||||
.list();
|
.list();
|
||||||
});
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParameterInJpaCriteria(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction( (session) -> {
|
||||||
|
CriteriaBuilder cb = session.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<Post> cr = cb.createQuery( Post.class );
|
||||||
|
Root<Post> root = cr.from( Post.class );
|
||||||
|
cr.select( root ).where(
|
||||||
|
ArrayPredicates.equalLength( cb, root.get( "tags" ), Arrays.array( "a", "b" ) )
|
||||||
|
);
|
||||||
|
List<Post> resultList = session.createQuery( cr ).getResultList();
|
||||||
|
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@AfterEach
|
@AfterEach
|
||||||
public void dropTestData(SessionFactoryScope scope) {
|
public void dropTestData(SessionFactoryScope scope) {
|
||||||
scope.inTransaction( (session) -> session.createQuery( "delete Post" ).executeUpdate() );
|
scope.inTransaction( (session) -> session.createQuery( "delete Post" ).executeUpdate() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ArrayPredicates {
|
||||||
|
public static Predicate equalLength(
|
||||||
|
CriteriaBuilder criteriaBuilder, Expression<? extends String[]> arr1,
|
||||||
|
String[] arr2) {
|
||||||
|
HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) criteriaBuilder;
|
||||||
|
return cb.equal(
|
||||||
|
criteriaBuilder.function( "array_length", long.class, arr1 ),
|
||||||
|
criteriaBuilder.function( "array_length", long.class, cb.value( arr2 ) )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* 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>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.orm.test.mapping.type.contribution.array;
|
||||||
|
|
||||||
|
import org.hibernate.boot.model.FunctionContributions;
|
||||||
|
import org.hibernate.boot.model.FunctionContributor;
|
||||||
|
import org.hibernate.query.sqm.function.NamedSqmFunctionDescriptor;
|
||||||
|
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
|
||||||
|
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
|
||||||
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
|
import org.hibernate.type.spi.TypeConfiguration;
|
||||||
|
|
||||||
|
public class StringArrayFunctionContributor implements FunctionContributor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contributeFunctions(FunctionContributions functionContributions) {
|
||||||
|
TypeConfiguration typeConfiguration = functionContributions.getTypeConfiguration();
|
||||||
|
functionContributions.getFunctionRegistry().register(
|
||||||
|
"array_length",
|
||||||
|
new NamedSqmFunctionDescriptor(
|
||||||
|
"array_length",
|
||||||
|
true,
|
||||||
|
StandardArgumentsValidators.exactly( 1 ),
|
||||||
|
StandardFunctionReturnTypeResolvers.invariant(
|
||||||
|
typeConfiguration.getBasicTypeRegistry()
|
||||||
|
.resolve( StandardBasicTypes.INTEGER ) )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* 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.integration.predicates;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hibernate.spatial.predicate.GeolatteSpatialPredicates;
|
||||||
|
import org.hibernate.spatial.testing.IsSupportedBySpatial;
|
||||||
|
import org.hibernate.spatial.testing.domain.GeomEntity;
|
||||||
|
import org.hibernate.spatial.testing.domain.SpatialDomainModel;
|
||||||
|
|
||||||
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
||||||
|
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 jakarta.persistence.criteria.CriteriaBuilder;
|
||||||
|
import jakarta.persistence.criteria.CriteriaQuery;
|
||||||
|
import jakarta.persistence.criteria.Root;
|
||||||
|
import org.geolatte.geom.G2D;
|
||||||
|
import org.geolatte.geom.Polygon;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
@DomainModel(modelDescriptorClasses = SpatialDomainModel.class)
|
||||||
|
@RequiresDialectFeature(feature = IsSupportedBySpatial.class)
|
||||||
|
@SessionFactory
|
||||||
|
public class PredicateSmokeTest implements SessionFactoryScopeAware {
|
||||||
|
|
||||||
|
private SessionFactoryScope scope;
|
||||||
|
Polygon<G2D> poly = polygon(
|
||||||
|
WGS84,
|
||||||
|
ring( g( 0, 0 ), g( 0, 10 ), g( 10, 10 ), g( 10, 0 ), g( 0, 0 ) )
|
||||||
|
);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
scope.inTransaction( (session) -> {
|
||||||
|
CriteriaBuilder cb = session.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<GeomEntity> cr = cb.createQuery( GeomEntity.class );
|
||||||
|
Root<GeomEntity> root = cr.from( GeomEntity.class );
|
||||||
|
cr.select( root ).where(
|
||||||
|
GeolatteSpatialPredicates.intersects( cb, root.get("geom"), poly )
|
||||||
|
);
|
||||||
|
List<GeomEntity> resultList = session.createQuery( cr ).getResultList();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void injectSessionFactoryScope(SessionFactoryScope scope) {
|
||||||
|
this.scope = scope;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue