Skip to content

Commit aea3b18

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 09fbe7d commit aea3b18

File tree

60 files changed

+473
-362
lines changed

Some content is hidden

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

60 files changed

+473
-362
lines changed

hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,6 @@
44
*/
55
package org.hibernate.boot.query;
66

7-
import java.util.ArrayList;
8-
import java.util.Collections;
9-
import java.util.HashMap;
10-
import java.util.HashSet;
11-
import java.util.List;
12-
import java.util.Locale;
13-
import java.util.Map;
14-
import java.util.Set;
15-
import java.util.StringTokenizer;
16-
import java.util.function.Supplier;
17-
187
import org.hibernate.LockMode;
198
import org.hibernate.MappingException;
209
import org.hibernate.boot.BootLogging;
@@ -43,10 +32,9 @@
4332
import org.hibernate.metamodel.mapping.EntityMappingType;
4433
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
4534
import org.hibernate.persister.collection.CollectionPersister;
35+
import org.hibernate.query.internal.FetchMementoBasicStandard;
4636
import org.hibernate.query.internal.FetchMementoEmbeddableStandard;
4737
import org.hibernate.query.internal.FetchMementoEntityStandard;
48-
import org.hibernate.spi.NavigablePath;
49-
import org.hibernate.query.internal.FetchMementoBasicStandard;
5038
import org.hibernate.query.internal.FetchMementoHbmStandard;
5139
import org.hibernate.query.internal.FetchMementoHbmStandard.FetchParentMemento;
5240
import org.hibernate.query.internal.NamedResultSetMappingMementoImpl;
@@ -58,11 +46,23 @@
5846
import org.hibernate.query.named.FetchMementoBasic;
5947
import org.hibernate.query.named.NamedResultSetMappingMemento;
6048
import org.hibernate.query.named.ResultMemento;
49+
import org.hibernate.spi.NavigablePath;
6150
import org.hibernate.sql.results.graph.Fetchable;
6251
import org.hibernate.sql.results.graph.FetchableContainer;
6352
import org.hibernate.sql.results.graph.entity.EntityValuedFetchable;
6453
import org.hibernate.type.BasicType;
6554

55+
import java.util.ArrayList;
56+
import java.util.Collections;
57+
import java.util.HashMap;
58+
import java.util.HashSet;
59+
import java.util.List;
60+
import java.util.Locale;
61+
import java.util.Map;
62+
import java.util.Set;
63+
import java.util.StringTokenizer;
64+
import java.util.function.Supplier;
65+
6666
/**
6767
* Boot-time descriptor of a result set mapping as defined in an {@code hbm.xml} file
6868
* either implicitly or explicitly
@@ -372,10 +372,8 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
372372
registrationName
373373
);
374374

375-
final EntityMappingType entityDescriptor = resolutionContext
376-
.getSessionFactory()
377-
.getRuntimeMetamodels()
378-
.getEntityMappingType( entityName );
375+
final EntityMappingType entityDescriptor =
376+
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );
379377
applyFetchJoins( joinDescriptorsAccess, tableAlias, propertyFetchDescriptors );
380378

381379
final NavigablePath entityPath = new NavigablePath( entityName );
@@ -421,10 +419,8 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
421419
@Override
422420
public FetchParentMemento resolveParentMemento(ResultSetMappingResolutionContext resolutionContext) {
423421
if ( thisAsParentMemento == null ) {
424-
final EntityMappingType entityDescriptor = resolutionContext
425-
.getSessionFactory()
426-
.getRuntimeMetamodels()
427-
.getEntityMappingType( entityName );
422+
final EntityMappingType entityDescriptor =
423+
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );
428424
thisAsParentMemento = new HbmFetchParentMemento(
429425
new NavigablePath( entityDescriptor.getEntityName() ),
430426
entityDescriptor
@@ -916,10 +912,9 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
916912
@Override
917913
public FetchParentMemento resolveParentMemento(ResultSetMappingResolutionContext resolutionContext) {
918914
if ( thisAsParentMemento == null ) {
919-
final CollectionPersister collectionDescriptor = resolutionContext.getSessionFactory()
920-
.getRuntimeMetamodels()
921-
.getMappingMetamodel()
922-
.getCollectionDescriptor( collectionPath.getFullPath() );
915+
final CollectionPersister collectionDescriptor =
916+
resolutionContext.getMappingMetamodel()
917+
.getCollectionDescriptor( collectionPath.getFullPath() );
923918

924919
thisAsParentMemento = new HbmFetchParentMemento( collectionPath, collectionDescriptor.getAttributeMapping() );
925920
}
@@ -957,10 +952,9 @@ public ResultMementoBasicStandard resolve(ResultSetMappingResolutionContext reso
957952
);
958953

959954
if ( hibernateTypeName != null ) {
960-
final BasicType<?> namedType = resolutionContext.getSessionFactory()
961-
.getTypeConfiguration()
962-
.getBasicTypeRegistry()
963-
.getRegisteredType( hibernateTypeName );
955+
final BasicType<?> namedType =
956+
resolutionContext.getTypeConfiguration().getBasicTypeRegistry()
957+
.getRegisteredType( hibernateTypeName );
964958

965959
if ( namedType == null ) {
966960
throw new IllegalArgumentException( "Could not resolve named type : " + hibernateTypeName );

hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@
1212

1313
import org.hibernate.LockMode;
1414
import org.hibernate.MappingException;
15-
import org.hibernate.engine.spi.SessionFactoryImplementor;
1615
import org.hibernate.internal.util.StringHelper;
1716
import org.hibernate.internal.util.collections.ArrayHelper;
18-
import org.hibernate.metamodel.RuntimeMetamodels;
1917
import org.hibernate.metamodel.mapping.BasicValuedModelPart;
2018
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
2119
import org.hibernate.metamodel.mapping.EntityMappingType;
@@ -214,10 +212,9 @@ public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext
214212
(mapping) -> argumentResultMementos.add( mapping.resolve( resolutionContext ) )
215213
);
216214

217-
final SessionFactoryImplementor sessionFactory = resolutionContext.getSessionFactory();
218-
final JavaType<?> targetJtd = sessionFactory.getTypeConfiguration()
219-
.getJavaTypeRegistry()
220-
.getDescriptor( targetJavaType );
215+
final JavaType<?> targetJtd =
216+
resolutionContext.getTypeConfiguration().getJavaTypeRegistry()
217+
.getDescriptor( targetJavaType );
221218

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

271268
@Override
272269
public ResultMemento resolve(ResultSetMappingResolutionContext resolutionContext) {
273-
final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels();
274-
final EntityMappingType entityDescriptor = runtimeMetamodels.getEntityMappingType( entityName );
270+
final EntityMappingType entityDescriptor =
271+
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );
275272

276273
final FetchMementoBasic discriminatorMemento = resolveDiscriminatorMemento(
277274
entityDescriptor,
@@ -366,8 +363,8 @@ private void addColumn(FieldResult fieldResult) {
366363

367364
@Override
368365
public ResultMemento asResultMemento(NavigablePath path, ResultSetMappingResolutionContext resolutionContext) {
369-
final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels();
370-
final EntityMappingType entityMapping = runtimeMetamodels.getEntityMappingType( entityName );
366+
final EntityMappingType entityMapping =
367+
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );
371368

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

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

387384
@Override
388385
public FetchMemento resolve(ResultSetMappingResolutionContext resolutionContext) {
389-
final RuntimeMetamodels runtimeMetamodels = resolutionContext.getSessionFactory().getRuntimeMetamodels();
390-
final EntityMappingType entityMapping = runtimeMetamodels.getEntityMappingType( entityName );
386+
final EntityMappingType entityMapping =
387+
resolutionContext.getMappingMetamodel().getEntityDescriptor( entityName );
391388

392389
ModelPart subPart = entityMapping.findSubPart(
393390
propertyPathParts[0],

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,7 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo
211211
else {
212212
predicateContainer = querySpec;
213213
}
214-
final BasicType<Integer> integerType = converter.getCreationContext()
215-
.getSessionFactory()
214+
final BasicType<Integer> integerType = converter.getSqmCreationContext()
216215
.getNodeBuilder()
217216
.getIntegerType();
218217
final Expression oneBasedOrdinal = new ColumnReference(
@@ -247,8 +246,7 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo
247246
}
248247
else {
249248
// When start < stop, step must be positive and value is only valid if it's less than or equal to stop
250-
final BasicType<Boolean> booleanType = converter.getCreationContext()
251-
.getSessionFactory()
249+
final BasicType<Boolean> booleanType = converter.getSqmCreationContext()
252250
.getNodeBuilder()
253251
.getBooleanType();
254252
final Predicate positiveProgress = new Junction(

hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.hibernate.metamodel.model.domain.ReturnableType;
1212
import org.hibernate.query.sqm.SqmExpressible;
1313
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
14-
import org.hibernate.query.sqm.internal.TypecheckUtil;
1514
import org.hibernate.query.sqm.produce.function.ArgumentsValidator;
1615
import org.hibernate.query.sqm.produce.function.FunctionArgumentException;
1716
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
@@ -23,6 +22,8 @@
2322
import org.hibernate.type.BottomType;
2423
import org.hibernate.type.spi.TypeConfiguration;
2524

25+
import static org.hibernate.query.sqm.internal.TypecheckUtil.areTypesComparable;
26+
2627
public class ArrayConstructorFunction extends AbstractSqmSelfRenderingFunctionDescriptor {
2728

2829
private final boolean withKeyword;
@@ -84,7 +85,8 @@ public void validate(
8485
if ( firstType == null ) {
8586
firstType = argument;
8687
}
87-
else if ( !TypecheckUtil.areTypesComparable( firstType, argument, sessionFactory ) ) {
88+
else if ( !areTypesComparable( firstType, argument,
89+
sessionFactory.getQueryEngine().getCriteriaBuilder() ) ) {
8890
throw new FunctionArgumentException(
8991
String.format(
9092
"All array arguments must have a compatible type compatible to the first argument type [%s], but argument %d has type '%s'",

hibernate-core/src/main/java/org/hibernate/dialect/function/array/H2UnnestFunction.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,7 @@ public TableGroup convertToSqlAst(
109109
tg -> tg.findTableGroupJoin( functionTableGroup ) == null ? null : tg
110110
);
111111
final TableGroupJoin join = parentTableGroup.findTableGroupJoin( functionTableGroup );
112-
final BasicType<Integer> integerType = walker.getCreationContext()
113-
.getSessionFactory()
112+
final BasicType<Integer> integerType = walker.getSqmCreationContext()
114113
.getNodeBuilder()
115114
.getIntegerType();
116115
final Expression lhs = new SelfRenderingExpression() {

hibernate-core/src/main/java/org/hibernate/dialect/function/json/H2JsonTableFunction.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo
161161
else {
162162
predicateContainer = querySpec;
163163
}
164-
final BasicType<Integer> integerType = converter.getCreationContext()
165-
.getSessionFactory()
164+
final BasicType<Integer> integerType = converter.getSqmCreationContext()
166165
.getNodeBuilder()
167166
.getIntegerType();
168167
final Expression jsonDocument;
@@ -233,8 +232,7 @@ public QuerySpec transform(CteContainer cteContainer, QuerySpec querySpec, SqmTo
233232
true,
234233
converter.getCreationContext().getSessionFactory()
235234
);
236-
final BasicType<Integer> integerType = converter.getCreationContext()
237-
.getSessionFactory()
235+
final BasicType<Integer> integerType = converter.getSqmCreationContext()
238236
.getNodeBuilder()
239237
.getIntegerType();
240238

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.hibernate.proxy.EntityNotFoundDelegate;
4848
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
4949
import org.hibernate.query.spi.QueryEngine;
50+
import org.hibernate.query.sql.spi.SqlTranslationEngine;
5051
import org.hibernate.relational.SchemaManager;
5152
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
5253
import org.hibernate.service.spi.ServiceRegistryImplementor;
@@ -277,11 +278,6 @@ public ServiceRegistryImplementor getServiceRegistry() {
277278
return delegate.getServiceRegistry();
278279
}
279280

280-
@Override
281-
public Integer getMaximumFetchDepth() {
282-
return delegate.getMaximumFetchDepth();
283-
}
284-
285281
@Override
286282
public void addObserver(SessionFactoryObserver observer) {
287283
delegate.addObserver( observer );
@@ -342,6 +338,11 @@ public QueryEngine getQueryEngine() {
342338
return delegate.getQueryEngine();
343339
}
344340

341+
@Override
342+
public SqlTranslationEngine getSqlTranslationEngine() {
343+
return delegate.getSqlTranslationEngine();
344+
}
345+
345346
@Override
346347
public Reference getReference() throws NamingException {
347348
return delegate.getReference();
@@ -392,11 +393,6 @@ public <T> List<EntityGraph<? super T>> findEntityGraphsByType(Class<T> entityCl
392393
return delegate.findEntityGraphsByType(entityClass);
393394
}
394395

395-
@Override
396-
public Class<?> classForName(String className) {
397-
return delegate.classForName( className );
398-
}
399-
400396
@Override
401397
public EventListenerGroups getEventListenerGroups() {
402398
return delegate.getEventListenerGroups();

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@
2323
import org.hibernate.event.spi.EventEngine;
2424
import org.hibernate.graph.spi.RootGraphImplementor;
2525
import org.hibernate.event.service.spi.EventListenerGroups;
26+
import org.hibernate.metamodel.model.domain.JpaMetamodel;
2627
import org.hibernate.metamodel.spi.MappingMetamodelImplementor;
2728
import org.hibernate.metamodel.spi.RuntimeMetamodelsImplementor;
2829
import org.hibernate.proxy.EntityNotFoundDelegate;
29-
import org.hibernate.query.sqm.spi.SqmCreationContext;
30+
import org.hibernate.query.spi.QueryEngine;
31+
import org.hibernate.query.sql.spi.SqlTranslationEngine;
3032
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
3133
import org.hibernate.service.spi.ServiceRegistryImplementor;
3234
import org.hibernate.sql.ast.spi.ParameterMarkerStrategy;
33-
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
3435
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducerProvider;
3536
import org.hibernate.stat.spi.StatisticsImplementor;
3637
import org.hibernate.generator.Generator;
@@ -49,8 +50,7 @@
4950
* @author Gavin King
5051
* @author Steve Ebersole
5152
*/
52-
public interface SessionFactoryImplementor
53-
extends MappingContext, SessionFactory, SqmCreationContext, SqlAstCreationContext {
53+
public interface SessionFactoryImplementor extends MappingContext, SessionFactory {
5454
/**
5555
* Get the UUID for this {@code SessionFactory}.
5656
* <p>
@@ -80,19 +80,6 @@ public interface SessionFactoryImplementor
8080
@Override
8181
SessionImplementor openSession();
8282

83-
@Override
84-
TypeConfiguration getTypeConfiguration();
85-
86-
@Override
87-
default SessionFactoryImplementor getSessionFactory() {
88-
return this;
89-
}
90-
91-
@Override
92-
default MappingMetamodelImplementor getMappingMetamodel() {
93-
return getRuntimeMetamodels().getMappingMetamodel();
94-
}
95-
9683
@Override
9784
SessionBuilderImplementor withOptions();
9885

@@ -107,8 +94,22 @@ default MappingMetamodelImplementor getMappingMetamodel() {
10794
@Override
10895
StatisticsImplementor getStatistics();
10996

97+
TypeConfiguration getTypeConfiguration();
98+
11099
RuntimeMetamodelsImplementor getRuntimeMetamodels();
111100

101+
default MappingMetamodelImplementor getMappingMetamodel() {
102+
return getRuntimeMetamodels().getMappingMetamodel();
103+
}
104+
105+
default JpaMetamodel getJpaMetamodel() {
106+
return getRuntimeMetamodels().getJpaMetamodel();
107+
}
108+
109+
QueryEngine getQueryEngine();
110+
111+
SqlTranslationEngine getSqlTranslationEngine();
112+
112113
/**
113114
* Access to the {@code ServiceRegistry} for this {@code SessionFactory}.
114115
*
@@ -228,4 +229,5 @@ default MappingMetamodelImplementor getMappingMetamodel() {
228229
* The best guess entity name for an entity not in an association
229230
*/
230231
String bestGuessEntityName(Object object);
232+
231233
}

0 commit comments

Comments
 (0)