Skip to content

Commit a86f5ce

Browse files
committed
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 a86f5ce

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)