Skip to content

Commit 1e81032

Browse files
committed
HHH-19010 get rid of inheritance of SessionFactoryImplementor from query 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.
1 parent aea3b18 commit 1e81032

File tree

107 files changed

+459
-455
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+459
-455
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ public InformixSqmToSqlAstConverter(
5050

5151
@Override
5252
public QuerySpec visitQuerySpec(SqmQuerySpec<?> sqmQuerySpec) {
53-
final boolean needsDummy = this.needsDummyTableGroup;
54-
this.needsDummyTableGroup = false;
53+
final boolean needsDummy = needsDummyTableGroup;
54+
needsDummyTableGroup = false;
5555
try {
5656
final QuerySpec querySpec = super.visitQuerySpec( sqmQuerySpec );
57-
if ( this.needsDummyTableGroup ) {
57+
if ( needsDummyTableGroup ) {
5858
querySpec.getFromClause().addRoot(
5959
new StandardTableGroup(
6060
true,
@@ -70,7 +70,7 @@ public QuerySpec visitQuerySpec(SqmQuerySpec<?> sqmQuerySpec) {
7070
return querySpec;
7171
}
7272
finally {
73-
this.needsDummyTableGroup = needsDummy;
73+
needsDummyTableGroup = needsDummy;
7474
}
7575
}
7676

hibernate-core/src/main/java/org/hibernate/dialect/function/AggregateWindowEmulationQueryTransformer.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.List;
1111
import java.util.Map;
1212

13-
import org.hibernate.engine.spi.SessionFactoryImplementor;
1413
import org.hibernate.metamodel.mapping.BasicValuedMapping;
1514
import org.hibernate.metamodel.mapping.JdbcMapping;
1615
import org.hibernate.metamodel.model.domain.ReturnableType;
@@ -92,8 +91,6 @@ public QuerySpec transform(
9291
CteContainer cteContainer,
9392
QuerySpec querySpec,
9493
SqmToSqlAstConverter converter) {
95-
final SessionFactoryImplementor factory = converter.getCreationContext()
96-
.getSessionFactory();
9794
final QuerySpec outerQuerySpec = new QuerySpec( querySpec.isRoot() );
9895
final String identifierVariable = "hhh_";
9996
final NavigablePath navigablePath = new NavigablePath(
@@ -400,7 +397,7 @@ protected <X extends SqlAstNode> X replaceExpression(X expression) {
400397
columnNames,
401398
false,
402399
true,
403-
factory
400+
converter.getCreationContext().getSessionFactory()
404401
);
405402
outerQuerySpec.getFromClause().addRoot( queryPartTableGroup );
406403

hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.metamodel.mapping.JdbcMapping;
1515
import org.hibernate.metamodel.model.domain.DomainType;
1616
import org.hibernate.metamodel.model.domain.ReturnableType;
17+
import org.hibernate.query.BindingContext;
1718
import org.hibernate.query.sqm.SqmExpressible;
1819
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
1920
import org.hibernate.query.sqm.function.FunctionKind;
@@ -150,7 +151,7 @@ public static class Validator implements ArgumentsValidator {
150151
public void validate(
151152
List<? extends SqmTypedNode<?>> arguments,
152153
String functionName,
153-
TypeConfiguration typeConfiguration) {
154+
BindingContext bindingContext) {
154155
if ( arguments.size() != 1 ) {
155156
throw new FunctionArgumentException(
156157
String.format(
@@ -166,7 +167,7 @@ public void validate(
166167
final SqmExpressible<?> expressible = argument.getExpressible();
167168
final DomainType<?> domainType;
168169
if ( expressible != null && ( domainType = expressible.getSqmType() ) != null ) {
169-
final JdbcType jdbcType = getJdbcType( domainType, typeConfiguration );
170+
final JdbcType jdbcType = getJdbcType( domainType, bindingContext.getTypeConfiguration() );
170171
if ( !isNumeric( jdbcType ) ) {
171172
throw new FunctionArgumentException(
172173
String.format(
@@ -230,7 +231,8 @@ public BasicValuedMapping resolveFunctionReturnType(
230231
if ( impliedType != null ) {
231232
return impliedType;
232233
}
233-
final JdbcMapping jdbcMapping = ( (Expression) arguments.get( 0 ) ).getExpressionType().getSingleJdbcMapping();
234+
Expression expression = (Expression) arguments.get( 0 );
235+
final JdbcMapping jdbcMapping = expression.getExpressionType().getSingleJdbcMapping();
234236
if ( jdbcMapping instanceof BasicPluralType<?, ?> ) {
235237
return (BasicValuedMapping) jdbcMapping;
236238
}

hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.hibernate.QueryException;
1111
import org.hibernate.metamodel.model.domain.ReturnableType;
12+
import org.hibernate.query.BindingContext;
1213
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
1314
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
1415
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
@@ -41,7 +42,7 @@ public ChrLiteralEmulation(TypeConfiguration typeConfiguration) {
4142
StandardArgumentsValidators.exactly(1),
4243
new ArgumentsValidator() {
4344
@Override
44-
public void validate(List<? extends SqmTypedNode<?>> arguments, String functionName, TypeConfiguration typeConfiguration) {
45+
public void validate(List<? extends SqmTypedNode<?>> arguments, String functionName, BindingContext bindingContext) {
4546
if ( !( arguments.get( 0 ) instanceof SqmLiteral<?> ) ) {
4647
throw new QueryException(
4748
String.format(

hibernate-core/src/main/java/org/hibernate/dialect/function/CteGenerateSeriesFunction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,9 @@ protected CteStatement createSeriesCte(SqmToSqlAstConverter converter) {
150150
}
151151

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

hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88

99
import org.hibernate.metamodel.model.domain.ReturnableType;
10+
import org.hibernate.query.BindingContext;
1011
import org.hibernate.query.spi.QueryEngine;
1112
import org.hibernate.query.sqm.function.FunctionKind;
1213
import org.hibernate.query.sqm.function.SelfRenderingSqmFunction;
@@ -16,7 +17,6 @@
1617
import org.hibernate.query.sqm.tree.SqmTypedNode;
1718
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
1819
import org.hibernate.query.sqm.tree.select.SqmOrderByClause;
19-
import org.hibernate.type.spi.TypeConfiguration;
2020

2121
/**
2222
* A function that dynamically dispatches to other functions,
@@ -61,10 +61,7 @@ public <T> SelfRenderingSqmFunction<T> generateSqmExpression(
6161
List<? extends SqmTypedNode<?>> arguments,
6262
ReturnableType<T> impliedResultType,
6363
QueryEngine queryEngine) {
64-
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
65-
arguments,
66-
queryEngine.getTypeConfiguration()
67-
);
64+
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
6865
return functionDescriptor.generateSqmExpression( arguments, impliedResultType, queryEngine );
6966
}
7067

@@ -74,10 +71,7 @@ public <T> SelfRenderingSqmFunction<T> generateAggregateSqmExpression(
7471
SqmPredicate filter,
7572
ReturnableType<T> impliedResultType,
7673
QueryEngine queryEngine) {
77-
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
78-
arguments,
79-
queryEngine.getTypeConfiguration()
80-
);
74+
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
8175
return functionDescriptor.generateAggregateSqmExpression(
8276
arguments,
8377
filter,
@@ -93,10 +87,7 @@ public <T> SelfRenderingSqmFunction<T> generateOrderedSetAggregateSqmExpression(
9387
SqmOrderByClause withinGroupClause,
9488
ReturnableType<T> impliedResultType,
9589
QueryEngine queryEngine) {
96-
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
97-
arguments,
98-
queryEngine.getTypeConfiguration()
99-
);
90+
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
10091
return functionDescriptor.generateOrderedSetAggregateSqmExpression(
10192
arguments,
10293
filter,
@@ -114,10 +105,7 @@ public <T> SelfRenderingSqmFunction<T> generateWindowSqmExpression(
114105
Boolean fromFirst,
115106
ReturnableType<T> impliedResultType,
116107
QueryEngine queryEngine) {
117-
final SqmFunctionDescriptor functionDescriptor = validateGetFunction(
118-
arguments,
119-
queryEngine.getTypeConfiguration()
120-
);
108+
final SqmFunctionDescriptor functionDescriptor = validateGetFunction( arguments, queryEngine );
121109
return functionDescriptor.generateWindowSqmExpression(
122110
arguments,
123111
filter,
@@ -137,21 +125,21 @@ public ArgumentsValidator getArgumentsValidator() {
137125
public void validate(
138126
List<? extends SqmTypedNode<?>> arguments,
139127
String functionName,
140-
TypeConfiguration typeConfiguration) {
141-
validateGetFunction( arguments, typeConfiguration );
128+
BindingContext bindingContext) {
129+
validateGetFunction( arguments, bindingContext );
142130
}
143131

144132
private SqmFunctionDescriptor validateGetFunction(
145133
List<? extends SqmTypedNode<?>> arguments,
146-
TypeConfiguration typeConfiguration) {
134+
BindingContext bindingContext) {
147135
RuntimeException exception = null;
148136
for ( String overload : functionNames ) {
149137
final SqmFunctionDescriptor functionDescriptor = functionRegistry.findFunctionDescriptor( overload );
150138
if ( functionDescriptor == null ) {
151139
throw new IllegalArgumentException( "No function registered under the name '" + overload + "'" );
152140
}
153141
try {
154-
functionDescriptor.getArgumentsValidator().validate( arguments, overload, typeConfiguration );
142+
functionDescriptor.getArgumentsValidator().validate( arguments, overload, bindingContext );
155143
return functionDescriptor;
156144
}
157145
catch (RuntimeException ex) {

hibernate-core/src/main/java/org/hibernate/dialect/function/FormatFunction.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,7 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) {
221221
final FunctionRenderer substringFunction = getFunction( walker, "substring", 3 );
222222
final BasicType<String> stringType = typeConfiguration.getBasicTypeRegistry()
223223
.resolve( StandardBasicTypes.STRING );
224-
final Dialect dialect =
225-
walker.getCreationContext().getSessionFactory().getJdbcServices()
226-
.getDialect();
224+
final Dialect dialect = walker.getCreationContext().getDialect();
227225
Expression formatExpression = null;
228226
final StringBuilder sb = new StringBuilder();
229227
final StringBuilderSqlAppender sqlAppender = new StringBuilderSqlAppender( sb );
@@ -425,13 +423,12 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) {
425423

426424
private FunctionRenderer getFunction(SqmToSqlAstConverter walker, String name) {
427425
return (FunctionRenderer)
428-
walker.getCreationContext().getSessionFactory().getQueryEngine()
429-
.getSqmFunctionRegistry().findFunctionDescriptor( name );
426+
walker.getCreationContext().getSqmFunctionRegistry().findFunctionDescriptor( name );
430427
}
431428

432429
private FunctionRenderer getFunction(SqmToSqlAstConverter walker, String name, int argumentCount) {
433430
final SqmFunctionDescriptor functionDescriptor =
434-
walker.getCreationContext().getSessionFactory().getQueryEngine().getSqmFunctionRegistry()
431+
walker.getCreationContext().getSqmFunctionRegistry()
435432
.findFunctionDescriptor( name );
436433
if ( functionDescriptor instanceof MultipatternSqmFunctionDescriptor multipatternSqmFunctionDescriptor ) {
437434
return (FunctionRenderer) multipatternSqmFunctionDescriptor.getFunction( argumentCount );

hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66

77
import org.hibernate.metamodel.mapping.JdbcMapping;
88
import org.hibernate.metamodel.model.domain.DomainType;
9+
import org.hibernate.query.BindingContext;
910
import org.hibernate.query.sqm.SqmExpressible;
1011
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
1112
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
1213
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
1314
import org.hibernate.query.sqm.tree.SqmTypedNode;
1415
import org.hibernate.type.descriptor.jdbc.JdbcType;
15-
import org.hibernate.type.spi.TypeConfiguration;
1616

1717
import java.util.List;
1818
import java.util.Locale;
@@ -32,8 +32,8 @@ public GenerateSeriesArgumentValidator() {
3232
public void validate(
3333
List<? extends SqmTypedNode<?>> arguments,
3434
String functionName,
35-
TypeConfiguration typeConfiguration) {
36-
delegate.validate( arguments, functionName, typeConfiguration );
35+
BindingContext bindingContext) {
36+
delegate.validate( arguments, functionName, bindingContext );
3737

3838
final SqmTypedNode<?> start = arguments.get( 0 );
3939
final SqmTypedNode<?> stop = arguments.get( 1 );

hibernate-core/src/main/java/org/hibernate/dialect/function/InverseDistributionFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ protected MappingModelExpressible<?> getMappingModelExpressible(
189189
return basicValuedMapping;
190190
}
191191
try {
192-
return walker.getCreationContext().getSessionFactory().getMappingMetamodel()
192+
return walker.getCreationContext().getMappingMetamodel()
193193
.resolveMappingExpressible( getNodeType(), walker.getFromClauseAccess()::getTableGroup );
194194
}
195195
catch (Exception e) {

hibernate-core/src/main/java/org/hibernate/dialect/function/NumberSeriesGenerateSeriesFunction.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package org.hibernate.dialect.function;
66

77
import org.checkerframework.checker.nullness.qual.Nullable;
8-
import org.hibernate.engine.spi.SessionFactoryImplementor;
98
import org.hibernate.internal.util.NullnessHelper;
109
import org.hibernate.metamodel.mapping.BasicValuedMapping;
1110
import org.hibernate.metamodel.mapping.CollectionPart;
@@ -28,6 +27,7 @@
2827
import org.hibernate.sql.Template;
2928
import org.hibernate.sql.ast.SqlAstTranslator;
3029
import org.hibernate.sql.ast.spi.SqlAppender;
30+
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
3131
import org.hibernate.sql.ast.tree.SqlAstNode;
3232
import org.hibernate.sql.ast.tree.cte.CteContainer;
3333
import org.hibernate.sql.ast.tree.expression.BinaryArithmeticExpression;
@@ -107,8 +107,8 @@ protected static boolean needsVariable(Expression expression) {
107107
public static Expression add(Expression left, Expression right, SqmToSqlAstConverter converter) {
108108
if ( right instanceof org.hibernate.sql.ast.tree.expression.Duration duration ) {
109109
final BasicType<?> nodeType = (BasicType<?>) left.getExpressionType().getSingleJdbcMapping();
110-
final FunctionRenderer timestampadd = (FunctionRenderer) converter.getCreationContext().getSessionFactory()
111-
.getQueryEngine().getSqmFunctionRegistry().findFunctionDescriptor( "timestampadd" );
110+
final FunctionRenderer timestampadd = (FunctionRenderer) converter.getCreationContext()
111+
.getSqmFunctionRegistry().findFunctionDescriptor( "timestampadd" );
112112
return new SelfRenderingFunctionSqlAstExpression(
113113
"timestampadd",
114114
timestampadd,
@@ -155,10 +155,11 @@ public static Expression multiply(Expression left, Expression multiplier) {
155155

156156
static Expression castToTimestamp(SqlAstNode node, SqmToSqlAstConverter converter) {
157157
final BasicType<?> nodeType = (BasicType<?>) ((Expression) node).getExpressionType().getSingleJdbcMapping();
158-
final FunctionRenderer cast = (FunctionRenderer) converter.getCreationContext().getSessionFactory().getQueryEngine()
159-
.getSqmFunctionRegistry().findFunctionDescriptor( "cast" );
160-
final BasicType<?> timestampType = converter.getCreationContext().getTypeConfiguration()
161-
.getBasicTypeForJavaType( Timestamp.class );
158+
final FunctionRenderer cast = (FunctionRenderer)
159+
converter.getCreationContext().getSqmFunctionRegistry().findFunctionDescriptor( "cast" );
160+
final BasicType<?> timestampType =
161+
converter.getCreationContext().getTypeConfiguration()
162+
.getBasicTypeForJavaType( Timestamp.class );
162163
return new SelfRenderingFunctionSqlAstExpression(
163164
"cast",
164165
cast,
@@ -436,8 +437,10 @@ protected SelectableMapping[] resolveIterationVariableBasedFunctionReturnType(
436437
}
437438

438439
private static String timestampadd(String startExpression, String stepExpression, JdbcMapping type, org.hibernate.sql.ast.tree.expression.Duration duration, SqmToSqlAstConverter converter) {
439-
final FunctionRenderer renderer = (FunctionRenderer) converter.getCreationContext().getSessionFactory()
440-
.getQueryEngine().getSqmFunctionRegistry().findFunctionDescriptor( "timestampadd" );
440+
final SqlAstCreationContext creationContext = converter.getCreationContext();
441+
442+
final FunctionRenderer renderer = (FunctionRenderer) creationContext.getSqmFunctionRegistry()
443+
.findFunctionDescriptor( "timestampadd" );
441444
final QuerySpec fakeQuery = new QuerySpec( true );
442445
fakeQuery.getSelectClause().addSqlSelection( new SqlSelectionImpl(
443446
new SelfRenderingFunctionSqlAstExpression(
@@ -452,9 +455,9 @@ private static String timestampadd(String startExpression, String stepExpression
452455
type
453456
)
454457
) );
455-
final SqlAstTranslator<JdbcOperationQuerySelect> translator = converter.getCreationContext()
456-
.getSessionFactory().getJdbcServices().getDialect().getSqlAstTranslatorFactory()
457-
.buildSelectTranslator( converter.getCreationContext().getSessionFactory(), new SelectStatement( fakeQuery ) );
458+
final SqlAstTranslator<JdbcOperationQuerySelect> translator =
459+
creationContext.getDialect().getSqlAstTranslatorFactory()
460+
.buildSelectTranslator( creationContext.getSessionFactory(), new SelectStatement( fakeQuery ) );
458461
final JdbcOperationQuerySelect operation = translator.translate( null, QueryOptions.NONE );
459462
final String sqlString = operation.getSqlString();
460463
assert sqlString.startsWith( "select " );
@@ -481,11 +484,11 @@ private String getStepExpression(@Nullable Expression explicitStep, String table
481484

482485
private String getExpression(Expression expression, String tableIdentifierVariable, String syntheticColumnName, SqmToSqlAstConverter walker) {
483486
if ( expression instanceof Literal literal ) {
484-
final SessionFactoryImplementor sessionFactory = walker.getCreationContext().getSessionFactory();
485487
//noinspection unchecked
488+
final SqlAstCreationContext creationContext = walker.getCreationContext();
486489
return literal.getJdbcMapping().getJdbcLiteralFormatter()
487-
.toJdbcLiteral( literal.getLiteralValue(), sessionFactory.getJdbcServices().getDialect(),
488-
sessionFactory.getWrapperOptions() );
490+
.toJdbcLiteral( literal.getLiteralValue(), creationContext.getDialect(),
491+
creationContext.getWrapperOptions() );
489492
}
490493
else if ( expression instanceof ColumnReference columnReference ) {
491494
return columnReference.getExpressionText();

0 commit comments

Comments
 (0)