refactor a bit the BindingContext hierarchy

This commit is contained in:
Gavin King 2024-09-10 11:30:10 +02:00
parent 1abc64fc65
commit b4e26b3e32
17 changed files with 44 additions and 56 deletions

View File

@ -40,7 +40,7 @@ import org.hibernate.engine.profile.FetchProfile;
import org.hibernate.event.spi.EventEngine;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.internal.FastSessionServices;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.spi.MetamodelImplementor;
import org.hibernate.metamodel.spi.RuntimeMetamodelsImplementor;
import org.hibernate.proxy.EntityNotFoundDelegate;
@ -265,7 +265,7 @@ public class SessionFactoryDelegatingImpl implements SessionFactoryImplementor,
}
@Override
public JpaMetamodelImplementor getJpaMetamodel() {
public JpaMetamodel getJpaMetamodel() {
return delegate.getJpaMetamodel();
}

View File

@ -25,7 +25,6 @@ import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
import org.hibernate.metamodel.spi.MetamodelImplementor;
import org.hibernate.metamodel.spi.RuntimeMetamodelsImplementor;
import org.hibernate.proxy.EntityNotFoundDelegate;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.spi.QueryParameterBindingTypeResolver;
import org.hibernate.query.sqm.spi.SqmCreationContext;
import org.hibernate.service.spi.ServiceRegistryImplementor;
@ -91,9 +90,6 @@ public interface SessionFactoryImplementor
return getRuntimeMetamodels().getMappingMetamodel();
}
@Override
QueryEngine getQueryEngine();
@Override
SessionBuilderImplementor withOptions();

View File

@ -8,6 +8,7 @@ package org.hibernate.graph.internal.parse;
import org.hibernate.graph.CannotContainSubGraphException;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.ManagedDomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
@ -42,13 +43,11 @@ public enum PathQualifierType {
private static ManagedDomainType resolveSubTypeManagedType(
DomainType<?> graphType,
String subTypeName,
JpaMetamodelImplementor metamodel) {
if ( !( graphType instanceof ManagedDomainType ) ) {
JpaMetamodel metamodel) {
if ( !( graphType instanceof ManagedDomainType<?> managedType ) ) {
throw new CannotContainSubGraphException( "The given type [" + graphType + "] is not a ManagedType" );
}
ManagedDomainType managedType = (ManagedDomainType) graphType;
if ( subTypeName != null ) {
managedType = resolveSubType( managedType, subTypeName, metamodel );
}

View File

@ -14,9 +14,9 @@ import org.hibernate.metamodel.internal.MetadataContext;
import org.hibernate.metamodel.mapping.CollectionPart;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.PluralPersistentAttribute;
import org.hibernate.metamodel.model.domain.SimpleDomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.spi.NavigablePath;
import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
@ -89,7 +89,7 @@ public abstract class AbstractPluralAttribute<D, C, E>
}
@Override
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
if ( CollectionPart.Nature.ELEMENT.getName().equals( name ) ) {
return elementPathSource;
}

View File

@ -59,11 +59,13 @@ public class DomainModelHelper {
static boolean isCompatible(
PersistentAttribute<?, ?> attribute1,
PersistentAttribute<?, ?> attribute2,
JpaMetamodelImplementor jpaMetamodel) {
JpaMetamodel jpaMetamodel) {
if ( attribute1 == attribute2 ) {
return true;
}
final MappingMetamodel runtimeMetamodels = jpaMetamodel.getMappingMetamodel();
final MappingMetamodel runtimeMetamodels =
//TODO: eliminate this cast!
((JpaMetamodelImplementor) jpaMetamodel).getMappingMetamodel();
final ModelPart modelPart1 = getEntityAttributeModelPart(
attribute1,
attribute1.getDeclaringType(),

View File

@ -7,7 +7,7 @@
package org.hibernate.metamodel.model.domain.internal;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.SqmJoinable;
import org.hibernate.query.sqm.SqmPathSource;
@ -44,7 +44,7 @@ public class EntitySqmPathSource<J> extends AbstractSqmPathSource<J> implements
}
@Override
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
return getSqmPathType().findSubPathSource( name, metamodel );
}

View File

@ -160,7 +160,7 @@ public class EntityTypeImpl<J>
}
@Override
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
final PersistentAttribute<? super J,?> attribute = super.findAttribute( name );
if ( attribute != null ) {
return (SqmPathSource<?>) attribute;
@ -182,7 +182,7 @@ public class EntityTypeImpl<J>
return null;
}
private PersistentAttribute<?, ?> findSubtypeAttribute(String name, JpaMetamodelImplementor metamodel) {
private PersistentAttribute<?, ?> findSubtypeAttribute(String name, JpaMetamodel metamodel) {
PersistentAttribute<?,?> subtypeAttribute = null;
for ( ManagedDomainType<?> subtype : getSubTypes() ) {
final PersistentAttribute<?,?> candidate = subtype.findSubTypesAttribute( name );

View File

@ -10,8 +10,8 @@ import java.util.List;
import org.hibernate.metamodel.internal.MetadataContext;
import org.hibernate.metamodel.mapping.CollectionPart;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.ListPersistentAttribute;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
@ -62,7 +62,7 @@ public class ListAttributeImpl<X, E> extends AbstractPluralAttribute<X, List<E>,
}
@Override
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
final CollectionPart.Nature nature = CollectionPart.Nature.fromNameExact( name );
if ( nature != null ) {
switch ( nature ) {

View File

@ -10,9 +10,9 @@ import java.util.Map;
import org.hibernate.metamodel.internal.MetadataContext;
import org.hibernate.metamodel.mapping.CollectionPart;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.MapPersistentAttribute;
import org.hibernate.metamodel.model.domain.SimpleDomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
@ -72,7 +72,7 @@ public class MapAttributeImpl<X, K, V> extends AbstractPluralAttribute<X, Map<K,
}
@Override
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
final CollectionPart.Nature nature = CollectionPart.Nature.fromNameExact( name );
if ( nature != null ) {
switch ( nature ) {

View File

@ -16,11 +16,11 @@ import org.hibernate.metamodel.model.domain.AnyMappingDomainType;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.IdentifiableDomainType;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.ManagedDomainType;
import org.hibernate.metamodel.model.domain.PluralPersistentAttribute;
import org.hibernate.metamodel.model.domain.SimpleDomainType;
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.query.SemanticException;
import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.hql.spi.SqmCreationState;
@ -130,7 +130,7 @@ public class SingularAttributeImpl<D,J>
}
@Override
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
return sqmPathSource.findSubPathSource( name, metamodel );
}

View File

@ -21,7 +21,11 @@ import org.hibernate.type.spi.TypeConfiguration;
*/
@Incubating
public interface BindingContext {
TypeConfiguration getTypeConfiguration();
JpaMetamodel getJpaMetamodel();
MappingMetamodel getMappingMetamodel();
default TypeConfiguration getTypeConfiguration() {
return getJpaMetamodel().getTypeConfiguration();
}
}

View File

@ -8,8 +8,8 @@ package org.hibernate.query.hql.internal;
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.ManagedDomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.query.SemanticException;
import org.hibernate.query.hql.HqlLogging;
import org.hibernate.query.hql.spi.DotIdentifierConsumer;
@ -183,7 +183,7 @@ public class BasicDotIdentifierConsumer implements DotIdentifierConsumer {
}
final String path = pathSoFar.toString();
final JpaMetamodelImplementor jpaMetamodel = creationContext.getJpaMetamodel();
final JpaMetamodel jpaMetamodel = creationContext.getJpaMetamodel();
final String importableName = jpaMetamodel.qualifyImportableName( path );
final NodeBuilder nodeBuilder = creationContext.getNodeBuilder();
if ( importableName != null ) {
@ -232,7 +232,7 @@ public class BasicDotIdentifierConsumer implements DotIdentifierConsumer {
}
private static <E> SqmFieldLiteral<E> sqmFieldLiteral(
JpaMetamodelImplementor jpaMetamodel,
JpaMetamodel jpaMetamodel,
String prefix,
String terminal,
JavaType<E> fieldJtdTest,
@ -246,7 +246,7 @@ public class BasicDotIdentifierConsumer implements DotIdentifierConsumer {
}
private static <E extends Enum<E>> SqmEnumLiteral<E> sqmEnumLiteral(
JpaMetamodelImplementor jpaMetamodel,
JpaMetamodel jpaMetamodel,
EnumJavaType<E> enumType,
String terminal,
NodeBuilder nodeBuilder) {

View File

@ -48,13 +48,13 @@ import org.hibernate.metamodel.model.domain.BasicDomainType;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.IdentifiableDomainType;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.ManagedDomainType;
import org.hibernate.metamodel.model.domain.PersistentAttribute;
import org.hibernate.metamodel.model.domain.PluralPersistentAttribute;
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
import org.hibernate.metamodel.model.domain.internal.AnyDiscriminatorSqmPath;
import org.hibernate.metamodel.model.domain.internal.EntitySqmPathSource;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.query.NullPrecedence;
import org.hibernate.query.ParameterLabelException;
import org.hibernate.query.PathException;
@ -1287,7 +1287,7 @@ public class SemanticQueryBuilder<R> extends HqlParserBaseVisitor<Object> implem
}
private EntityDomainType<R> getResultEntity() {
final JpaMetamodelImplementor jpaMetamodel = creationContext.getJpaMetamodel();
final JpaMetamodel jpaMetamodel = creationContext.getJpaMetamodel();
if ( expectedResultEntity != null ) {
@SuppressWarnings("rawtypes")
final EntityDomainType entityDescriptor = jpaMetamodel.entity( expectedResultEntity );

View File

@ -15,7 +15,7 @@ import java.util.function.Function;
import org.hibernate.jpa.spi.JpaCompliance;
import org.hibernate.metamodel.model.domain.BasicDomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.query.criteria.JpaCrossJoin;
import org.hibernate.query.SemanticException;
import org.hibernate.query.hql.HqlLogging;
@ -331,7 +331,7 @@ public class SqmPathRegistryImpl implements SqmPathRegistry {
&& containerType.findSubPathSource( name, getJpaMetamodel() ) != null;
}
private JpaMetamodelImplementor getJpaMetamodel() {
private JpaMetamodel getJpaMetamodel() {
return associatedProcessingState.getCreationState().getCreationContext().getJpaMetamodel();
}

View File

@ -11,7 +11,7 @@ import java.util.Locale;
import jakarta.persistence.metamodel.Bindable;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.spi.NavigablePath;
import org.hibernate.query.sqm.tree.SqmExpressibleAccessor;
import org.hibernate.query.sqm.tree.domain.SqmPath;
@ -57,7 +57,7 @@ public interface SqmPathSource<J> extends SqmExpressible<J>, Bindable<J>, SqmExp
*
* @throws IllegalStateException to indicate that this source cannot be de-referenced
*/
default SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
default SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
return findSubPathSource( name );
}
@ -88,7 +88,7 @@ public interface SqmPathSource<J> extends SqmExpressible<J>, Bindable<J>, SqmExp
* @throws IllegalStateException to indicate that this source cannot be de-referenced
* @throws IllegalArgumentException if the subPathSource is not found
*/
default SqmPathSource<?> getSubPathSource(String name, JpaMetamodelImplementor metamodel) {
default SqmPathSource<?> getSubPathSource(String name, JpaMetamodel metamodel) {
final SqmPathSource<?> subPathSource = findSubPathSource( name, metamodel );
if ( subPathSource == null ) {
throw new PathElementException(

View File

@ -7,39 +7,25 @@
package org.hibernate.query.sqm.spi;
import org.hibernate.Incubating;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.spi.TypeConfiguration;
/**
* The context in which all SQM creations occur (think SessionFactory).
* The context in which all SQM creations occur.
*
* @author Steve Ebersole
*/
@Incubating
public interface SqmCreationContext extends BindingContext {
/**
* Access to the domain model metadata
*/
JpaMetamodelImplementor getJpaMetamodel();
/**
* Access to the ServiceRegistry for the context
*/
default ServiceRegistry getServiceRegistry() {
return getJpaMetamodel().getServiceRegistry();
}
default TypeConfiguration getTypeConfiguration() {
return getJpaMetamodel().getTypeConfiguration();
}
QueryEngine getQueryEngine();
default NodeBuilder getNodeBuilder() {
return getQueryEngine().getCriteriaBuilder();
}
default ServiceRegistry getServiceRegistry() {
return getJpaMetamodel().getServiceRegistry();
}
}

View File

@ -58,6 +58,7 @@ import org.hibernate.metamodel.internal.RuntimeMetamodelsImpl;
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.ManagedDomainType;
import org.hibernate.metamodel.model.domain.PersistentAttribute;
import org.hibernate.metamodel.model.domain.internal.AbstractAttribute;
@ -908,7 +909,7 @@ public abstract class MockSessionFactory
}
@Override
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodelImplementor metamodel) {
public SqmPathSource<?> findSubPathSource(String name, JpaMetamodel metamodel) {
SqmPathSource<?> source = super.findSubPathSource(name, metamodel);
if ( source != null ) {
return source;