Skip to content

Commit

Permalink
HHH-19010 get rid of inheritance of SessionFactoryImplementor from qu…
Browse files Browse the repository at this point in the history
…ery creation context stuff

Let's make the NodeBuilder the thing that is the SqmCreationContext, and introduce a
new thing that performs a similar role for SqlAstCreationContext. The reason here is
twofold:

- it is part of my long struggle to decouple query parsing/typing from the
  SessionFactory, in order to make HibernateProcessor less of a hack and I
  guess more robust
- SessionFactoryImplementor was already starting to be polluted with weird
  little operations that didn't belong there. That will only get worse with
  time.
  • Loading branch information
gavinking committed Jan 5, 2025
1 parent 09fbe7d commit 0a2c229
Show file tree
Hide file tree
Showing 144 changed files with 892 additions and 777 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ public InformixSqmToSqlAstConverter(

@Override
public QuerySpec visitQuerySpec(SqmQuerySpec<?> sqmQuerySpec) {
final boolean needsDummy = this.needsDummyTableGroup;
this.needsDummyTableGroup = false;
final boolean needsDummy = needsDummyTableGroup;
needsDummyTableGroup = false;
try {
final QuerySpec querySpec = super.visitQuerySpec( sqmQuerySpec );
if ( this.needsDummyTableGroup ) {
if ( needsDummyTableGroup ) {
querySpec.getFromClause().addRoot(
new StandardTableGroup(
true,
Expand All @@ -70,7 +70,7 @@ public QuerySpec visitQuerySpec(SqmQuerySpec<?> sqmQuerySpec) {
return querySpec;
}
finally {
this.needsDummyTableGroup = needsDummy;
needsDummyTableGroup = needsDummy;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,6 @@
*/
package org.hibernate.boot.query;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.function.Supplier;

import org.hibernate.LockMode;
import org.hibernate.MappingException;
import org.hibernate.boot.BootLogging;
Expand Down Expand Up @@ -43,10 +32,9 @@
import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.query.internal.FetchMementoBasicStandard;
import org.hibernate.query.internal.FetchMementoEmbeddableStandard;
import org.hibernate.query.internal.FetchMementoEntityStandard;
import org.hibernate.spi.NavigablePath;
import org.hibernate.query.internal.FetchMementoBasicStandard;
import org.hibernate.query.internal.FetchMementoHbmStandard;
import org.hibernate.query.internal.FetchMementoHbmStandard.FetchParentMemento;
import org.hibernate.query.internal.NamedResultSetMappingMementoImpl;
Expand All @@ -58,11 +46,23 @@
import org.hibernate.query.named.FetchMementoBasic;
import org.hibernate.query.named.NamedResultSetMappingMemento;
import org.hibernate.query.named.ResultMemento;
import org.hibernate.spi.NavigablePath;
import org.hibernate.sql.results.graph.Fetchable;
import org.hibernate.sql.results.graph.FetchableContainer;
import org.hibernate.sql.results.graph.entity.EntityValuedFetchable;
import org.hibernate.type.BasicType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.function.Supplier;

/**
* Boot-time descriptor of a result set mapping as defined in an {@code hbm.xml} file
* either implicitly or explicitly
Expand Down Expand Up @@ -372,10 +372,8 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
registrationName
);

final EntityMappingType entityDescriptor = resolutionContext
.getSessionFactory()
.getRuntimeMetamodels()
.getEntityMappingType( entityName );
final EntityMappingType entityDescriptor =
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );
applyFetchJoins( joinDescriptorsAccess, tableAlias, propertyFetchDescriptors );

final NavigablePath entityPath = new NavigablePath( entityName );
Expand Down Expand Up @@ -421,10 +419,8 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
@Override
public FetchParentMemento resolveParentMemento(ResultSetMappingResolutionContext resolutionContext) {
if ( thisAsParentMemento == null ) {
final EntityMappingType entityDescriptor = resolutionContext
.getSessionFactory()
.getRuntimeMetamodels()
.getEntityMappingType( entityName );
final EntityMappingType entityDescriptor =
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );
thisAsParentMemento = new HbmFetchParentMemento(
new NavigablePath( entityDescriptor.getEntityName() ),
entityDescriptor
Expand Down Expand Up @@ -916,10 +912,9 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
@Override
public FetchParentMemento resolveParentMemento(ResultSetMappingResolutionContext resolutionContext) {
if ( thisAsParentMemento == null ) {
final CollectionPersister collectionDescriptor = resolutionContext.getSessionFactory()
.getRuntimeMetamodels()
.getMappingMetamodel()
.getCollectionDescriptor( collectionPath.getFullPath() );
final CollectionPersister collectionDescriptor =
resolutionContext.getMappingMetamodel()
.getCollectionDescriptor( collectionPath.getFullPath() );

thisAsParentMemento = new HbmFetchParentMemento( collectionPath, collectionDescriptor.getAttributeMapping() );
}
Expand Down Expand Up @@ -957,10 +952,9 @@ public ResultMementoBasicStandard resolve(ResultSetMappingResolutionContext reso
);

if ( hibernateTypeName != null ) {
final BasicType<?> namedType = resolutionContext.getSessionFactory()
.getTypeConfiguration()
.getBasicTypeRegistry()
.getRegisteredType( hibernateTypeName );
final BasicType<?> namedType =
resolutionContext.getTypeConfiguration().getBasicTypeRegistry()
.getRegisteredType( hibernateTypeName );

if ( namedType == null ) {
throw new IllegalArgumentException( "Could not resolve named type : " + hibernateTypeName );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@

import org.hibernate.LockMode;
import org.hibernate.MappingException;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.metamodel.RuntimeMetamodels;
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
import org.hibernate.metamodel.mapping.EntityMappingType;
Expand Down Expand Up @@ -214,10 +212,9 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
(mapping) -> argumentResultMementos.add( mapping.resolve( resolutionContext ) )
);

final SessionFactoryImplementor sessionFactory = resolutionContext.getSessionFactory();
final JavaType<?> targetJtd = sessionFactory.getTypeConfiguration()
.getJavaTypeRegistry()
.getDescriptor( targetJavaType );
final JavaType<?> targetJtd =
resolutionContext.getTypeConfiguration().getJavaTypeRegistry()
.getDescriptor( targetJavaType );

return new ResultMementoInstantiationStandard( targetJtd, argumentResultMementos );
}
Expand Down Expand Up @@ -270,8 +267,8 @@ private static Map<String, AttributeFetchDescriptor> extractFetchMappings(

@Override
public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext) {
final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels();
final EntityMappingType entityDescriptor = runtimeMetamodels.getEntityMappingType( entityName );
final EntityMappingType entityDescriptor =
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );

final FetchMementoBasic discriminatorMemento = resolveDiscriminatorMemento(
entityDescriptor,
Expand Down Expand Up @@ -366,8 +363,8 @@ private void addColumn(FieldResult fieldResult) {

@Override
public ResultMemento asResultMemento(NavigablePath path, ResultSetMappingResolutionContext resolutionContext) {
final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels();
final EntityMappingType entityMapping = runtimeMetamodels.getEntityMappingType( entityName );
final EntityMappingType entityMapping =
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );

final ModelPart subPart = entityMapping.findSubPart( propertyPath, null );

Expand All @@ -386,8 +383,8 @@ public ResultMemento asResultMemento(NavigablePath path, ResultSetMappingResolut

@Override
public FetchMemento resolve(ResultSetMappingResolutionContext resolutionContext) {
final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels();
final EntityMappingType entityMapping = runtimeMetamodels.getEntityMappingType( entityName );
final EntityMappingType entityMapping =
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );

ModelPart subPart = entityMapping.findSubPart(
propertyPathParts[0],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import java.util.List;
import java.util.Map;

import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.mapping.BasicValuedMapping;
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.model.domain.ReturnableType;
Expand Down Expand Up @@ -92,8 +91,6 @@ public QuerySpec transform(
CteContainer cteContainer,
QuerySpec querySpec,
SqmToSqlAstConverter converter) {
final SessionFactoryImplementor factory = converter.getCreationContext()
.getSessionFactory();
final QuerySpec outerQuerySpec = new QuerySpec( querySpec.isRoot() );
final String identifierVariable = "hhh_";
final NavigablePath navigablePath = new NavigablePath(
Expand Down Expand Up @@ -400,7 +397,7 @@ protected <X extends SqlAstNode> X replaceExpression(X expression) {
columnNames,
false,
true,
factory
converter.getCreationContext().getSessionFactory()
);
outerQuerySpec.getFromClause().addRoot( queryPartTableGroup );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.sqm.SqmExpressible;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.function.FunctionKind;
Expand Down Expand Up @@ -150,7 +151,7 @@ public static class Validator implements ArgumentsValidator {
public void validate(
List<? extends SqmTypedNode<?>> arguments,
String functionName,
TypeConfiguration typeConfiguration) {
BindingContext bindingContext) {
if ( arguments.size() != 1 ) {
throw new FunctionArgumentException(
String.format(
Expand All @@ -166,7 +167,7 @@ public void validate(
final SqmExpressible<?> expressible = argument.getExpressible();
final DomainType<?> domainType;
if ( expressible != null && ( domainType = expressible.getSqmType() ) != null ) {
final JdbcType jdbcType = getJdbcType( domainType, typeConfiguration );
final JdbcType jdbcType = getJdbcType( domainType, bindingContext.getTypeConfiguration() );
if ( !isNumeric( jdbcType ) ) {
throw new FunctionArgumentException(
String.format(
Expand Down Expand Up @@ -230,7 +231,8 @@ public BasicValuedMapping resolveFunctionReturnType(
if ( impliedType != null ) {
return impliedType;
}
final JdbcMapping jdbcMapping = ( (Expression) arguments.get( 0 ) ).getExpressionType().getSingleJdbcMapping();
Expression expression = (Expression) arguments.get( 0 );
final JdbcMapping jdbcMapping = expression.getExpressionType().getSingleJdbcMapping();
if ( jdbcMapping instanceof BasicPluralType<?, ?> ) {
return (BasicValuedMapping) jdbcMapping;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import org.hibernate.QueryException;
import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
Expand Down Expand Up @@ -41,7 +42,7 @@ public ChrLiteralEmulation(TypeConfiguration typeConfiguration) {
StandardArgumentsValidators.exactly(1),
new ArgumentsValidator() {
@Override
public void validate(List<? extends SqmTypedNode<?>> arguments, String functionName, TypeConfiguration typeConfiguration) {
public void validate(List<? extends SqmTypedNode<?>> arguments, String functionName, BindingContext bindingContext) {
if ( !( arguments.get( 0 ) instanceof SqmLiteral<?> ) ) {
throw new QueryException(
String.format(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,9 @@ protected CteStatement createSeriesCte(SqmToSqlAstConverter converter) {
}

public static CteStatement createSeriesCte(int maxSeriesSize, SqmToSqlAstConverter converter) {
final BasicType<Long> longType = converter.getCreationContext().getTypeConfiguration()
.getBasicTypeForJavaType( Long.class );
final BasicType<Long> longType =
converter.getCreationContext().getTypeConfiguration()
.getBasicTypeForJavaType( Long.class );
final Expression one = new UnparsedNumericLiteral<>( "1", NumericTypeCategory.LONG, longType );
final List<CteColumn> cteColumns = List.of( new CteColumn( "i", longType ) );

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.List;

import org.hibernate.metamodel.model.domain.ReturnableType;
import org.hibernate.query.BindingContext;
import org.hibernate.query.spi.QueryEngine;
import org.hibernate.query.sqm.function.FunctionKind;
import org.hibernate.query.sqm.function.SelfRenderingSqmFunction;
Expand All @@ -16,7 +17,6 @@
import org.hibernate.query.sqm.tree.SqmTypedNode;
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
import org.hibernate.query.sqm.tree.select.SqmOrderByClause;
import org.hibernate.type.spi.TypeConfiguration;

/**
* A function that dynamically dispatches to other functions,
Expand Down Expand Up @@ -61,10 +61,7 @@ public <T> SelfRenderingSqmFunction<T> generateSqmExpression(
List<? extends SqmTypedNode<?>> arguments,
ReturnableType<T> impliedResultType,
QueryEngine queryEngine) {
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
arguments,
queryEngine.getTypeConfiguration()
);
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
return functionDescriptor.generateSqmExpression( arguments, impliedResultType, queryEngine );
}

Expand All @@ -74,10 +71,7 @@ public <T> SelfRenderingSqmFunction<T> generateAggregateSqmExpression(
SqmPredicate filter,
ReturnableType<T> impliedResultType,
QueryEngine queryEngine) {
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
arguments,
queryEngine.getTypeConfiguration()
);
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
return functionDescriptor.generateAggregateSqmExpression(
arguments,
filter,
Expand All @@ -93,10 +87,7 @@ public <T> SelfRenderingSqmFunction<T> generateOrderedSetAggregateSqmExpression(
SqmOrderByClause withinGroupClause,
ReturnableType<T> impliedResultType,
QueryEngine queryEngine) {
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
arguments,
queryEngine.getTypeConfiguration()
);
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
return functionDescriptor.generateOrderedSetAggregateSqmExpression(
arguments,
filter,
Expand All @@ -114,10 +105,7 @@ public <T> SelfRenderingSqmFunction<T> generateWindowSqmExpression(
Boolean fromFirst,
ReturnableType<T> impliedResultType,
QueryEngine queryEngine) {
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
arguments,
queryEngine.getTypeConfiguration()
);
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
return functionDescriptor.generateWindowSqmExpression(
arguments,
filter,
Expand All @@ -137,21 +125,21 @@ public ArgumentsValidator getArgumentsValidator() {
public void validate(
List<? extends SqmTypedNode<?>> arguments,
String functionName,
TypeConfiguration typeConfiguration) {
validateGetFunction( arguments, typeConfiguration );
BindingContext bindingContext) {
validateGetFunction( arguments, bindingContext );
}

private SqmFunctionDescriptor validateGetFunction(
List<? extends SqmTypedNode<?>> arguments,
TypeConfiguration typeConfiguration) {
BindingContext bindingContext) {
RuntimeException exception = null;
for ( String overload : functionNames ) {
final SqmFunctionDescriptor functionDescriptor = functionRegistry.findFunctionDescriptor( overload );
if ( functionDescriptor == null ) {
throw new IllegalArgumentException( "No function registered under the name '" + overload + "'" );
}
try {
functionDescriptor.getArgumentsValidator().validate( arguments, overload, typeConfiguration );
functionDescriptor.getArgumentsValidator().validate( arguments, overload, bindingContext );
return functionDescriptor;
}
catch (RuntimeException ex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,7 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) {
final FunctionRenderer substringFunction = getFunction( walker, "substring", 3 );
final BasicType<String> stringType = typeConfiguration.getBasicTypeRegistry()
.resolve( StandardBasicTypes.STRING );
final Dialect dialect =
walker.getCreationContext().getSessionFactory().getJdbcServices()
.getDialect();
final Dialect dialect = walker.getCreationContext().getDialect();
Expression formatExpression = null;
final StringBuilder sb = new StringBuilder();
final StringBuilderSqlAppender sqlAppender = new StringBuilderSqlAppender( sb );
Expand Down Expand Up @@ -425,13 +423,12 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) {

private FunctionRenderer getFunction(SqmToSqlAstConverter walker, String name) {
return (FunctionRenderer)
walker.getCreationContext().getSessionFactory().getQueryEngine()
.getSqmFunctionRegistry().findFunctionDescriptor( name );
walker.getCreationContext().getSqmFunctionRegistry().findFunctionDescriptor( name );
}

private FunctionRenderer getFunction(SqmToSqlAstConverter walker, String name, int argumentCount) {
final SqmFunctionDescriptor functionDescriptor =
walker.getCreationContext().getSessionFactory().getQueryEngine().getSqmFunctionRegistry()
walker.getCreationContext().getSqmFunctionRegistry()
.findFunctionDescriptor( name );
if ( functionDescriptor instanceof MultipatternSqmFunctionDescriptor multipatternSqmFunctionDescriptor ) {
return (FunctionRenderer) multipatternSqmFunctionDescriptor.getFunction( argumentCount );
Expand Down
Loading

0 comments on commit 0a2c229

Please sign in to comment.