From 92b559abda4a0899a2e7cebfd7589037a992d4aa Mon Sep 17 00:00:00 2001 From: gavinking Date: Mon, 18 May 2020 11:26:18 +0200 Subject: [PATCH] HHH-14024 add QueryPlanCreator functional interface simplifies customization of HQLQueryPlan instantiation --- .../boot/internal/SessionFactoryBuilderImpl.java | 3 ++- .../engine/query/spi/QueryPlanCache.java | 16 +++++++++------- .../hibernate/internal/SessionFactoryImpl.java | 11 ++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java index c9028f3d83..d77677ec8b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryBuilderImpl.java @@ -30,6 +30,7 @@ import org.hibernate.bytecode.spi.BytecodeProvider; import org.hibernate.cache.spi.TimestampsCacheFactory; import org.hibernate.context.spi.CurrentTenantIdentifierResolver; import org.hibernate.dialect.function.SQLFunction; +import org.hibernate.engine.query.spi.HQLQueryPlan; import org.hibernate.hql.spi.id.MultiTableBulkIdStrategy; import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.loader.BatchFetchStyle; @@ -468,7 +469,7 @@ public class SessionFactoryBuilderImpl implements SessionFactoryBuilderImplement final StandardServiceRegistry serviceRegistry = metadata.getMetadataBuildingOptions().getServiceRegistry(); BytecodeProvider bytecodeProvider = serviceRegistry.getService( BytecodeProvider.class ); addSessionFactoryObservers( new SessionFactoryObserverForBytecodeEnhancer( bytecodeProvider ) ); - return new SessionFactoryImpl( metadata, buildSessionFactoryOptions() ); + return new SessionFactoryImpl( metadata, buildSessionFactoryOptions(), HQLQueryPlan::new ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java index 0a867e6687..6a738937e4 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/query/spi/QueryPlanCache.java @@ -18,7 +18,6 @@ import java.util.concurrent.TimeUnit; import org.hibernate.Filter; import org.hibernate.MappingException; import org.hibernate.QueryException; -import org.hibernate.Session; import org.hibernate.cfg.Environment; import org.hibernate.engine.query.spi.sql.NativeSQLQuerySpecification; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -43,6 +42,11 @@ import org.hibernate.stat.spi.StatisticsImplementor; public class QueryPlanCache implements Serializable { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( QueryPlanCache.class ); + @FunctionalInterface + public interface QueryPlanCreator { + HQLQueryPlan createQueryPlan(String queryString, boolean shallow, Map enabledFilters, SessionFactoryImplementor factory); + } + /** * The default strong reference count. */ @@ -53,6 +57,7 @@ public class QueryPlanCache implements Serializable { public static final int DEFAULT_QUERY_PLAN_MAX_COUNT = 2048; private final SessionFactoryImplementor factory; + private QueryPlanCreator queryPlanCreator; /** * the cache of the actual plans... @@ -78,8 +83,9 @@ public class QueryPlanCache implements Serializable { * @param factory The SessionFactory */ @SuppressWarnings("deprecation") - public QueryPlanCache(final SessionFactoryImplementor factory) { + public QueryPlanCache(final SessionFactoryImplementor factory, QueryPlanCreator queryPlanCreator) { this.factory = factory; + this.queryPlanCreator = queryPlanCreator; Integer maxParameterMetadataCount = ConfigurationHelper.getInteger( Environment.QUERY_PLAN_CACHE_PARAMETER_METADATA_MAX_SIZE, @@ -153,7 +159,7 @@ public class QueryPlanCache implements Serializable { final long startTime = ( stats ) ? System.nanoTime() : 0L; LOG.tracev( "Unable to locate HQL query plan in cache; generating ({0})", queryString ); - value = createHQLQueryPlan( queryString, shallow, enabledFilters, factory ); + value = queryPlanCreator.createQueryPlan( queryString, shallow, enabledFilters, factory ); if ( stats ) { final long endTime = System.nanoTime(); @@ -173,10 +179,6 @@ public class QueryPlanCache implements Serializable { return value; } - protected HQLQueryPlan createHQLQueryPlan(String queryString, boolean shallow, Map enabledFilters, SessionFactoryImplementor factory) { - return new HQLQueryPlan( queryString, shallow, enabledFilters, factory ); - } - /** * Get the query plan for the given collection HQL filter fragment, creating it and caching it if not already cached * diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index a402ef86fc..dbb0114268 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -198,13 +198,10 @@ public class SessionFactoryImpl implements SessionFactoryImplementor { private final transient SessionBuilder defaultSessionOpenOptions; private final transient SessionBuilder temporarySessionOpenOptions; - public SessionFactoryImpl(final MetadataImplementor metadata, SessionFactoryOptions options) { - this( metadata, options, QueryPlanCache::new ); - } - - protected SessionFactoryImpl( + public SessionFactoryImpl( final MetadataImplementor metadata, - SessionFactoryOptions options, Function queryPlanCacheFunction) { + SessionFactoryOptions options, + QueryPlanCache.QueryPlanCreator queryPlanCacheFunction) { LOG.debug( "Building session factory" ); this.sessionFactoryOptions = options; @@ -265,7 +262,7 @@ public class SessionFactoryImpl implements SessionFactoryImplementor { LOG.debugf( "Session factory constructed with filter configurations : %s", filters ); LOG.debugf( "Instantiating session factory with properties: %s", properties ); - this.queryPlanCache = queryPlanCacheFunction.apply( this ); + this.queryPlanCache = new QueryPlanCache( this, queryPlanCacheFunction ); class IntegratorObserver implements SessionFactoryObserver { private ArrayList integrators = new ArrayList<>();