1010import org .hibernate .boot .model .FunctionContributor ;
1111import org .hibernate .boot .registry .classloading .spi .ClassLoaderService ;
1212import org .hibernate .boot .spi .MetadataImplementor ;
13- import org .hibernate .boot .spi .SessionFactoryOptions ;
1413import org .hibernate .cfg .AvailableSettings ;
1514import org .hibernate .dialect .Dialect ;
15+ import org .hibernate .engine .jdbc .spi .JdbcServices ;
1616import org .hibernate .engine .query .spi .NativeQueryInterpreter ;
17- import org .hibernate .engine .spi .SessionFactoryImplementor ;
1817import org .hibernate .internal .CoreLogging ;
1918import org .hibernate .internal .util .config .ConfigurationHelper ;
19+ import org .hibernate .query .BindingContext ;
2020import org .hibernate .query .hql .HqlTranslator ;
2121import org .hibernate .query .hql .internal .StandardHqlTranslator ;
2222import org .hibernate .query .hql .spi .SqmCreationOptions ;
3232import org .hibernate .query .sqm .sql .SqmTranslatorFactory ;
3333import org .hibernate .query .sqm .sql .StandardSqmTranslatorFactory ;
3434import org .hibernate .service .ServiceRegistry ;
35- import org .hibernate .stat .spi .StatisticsImplementor ;
35+ import org .hibernate .service .spi .ServiceRegistryImplementor ;
3636import org .hibernate .type .spi .TypeConfiguration ;
3737import org .jboss .logging .Logger ;
3838
3939import java .util .ArrayList ;
4040import java .util .Collection ;
4141import java .util .List ;
4242import java .util .Map ;
43- import java .util .function .Supplier ;
4443
4544import static java .util .Comparator .comparingInt ;
4645
@@ -54,23 +53,31 @@ public class QueryEngineImpl implements QueryEngine {
5453
5554 private static final Logger LOG_HQL_FUNCTIONS = CoreLogging .logger ("org.hibernate.HQL_FUNCTIONS" );
5655
57- public static QueryEngine from (SessionFactoryImplementor sessionFactory , MetadataImplementor metadata ) {
58- final QueryEngineOptions options = sessionFactory .getSessionFactoryOptions ();
59- final Dialect dialect = sessionFactory .getJdbcServices ().getDialect ();
56+ public static QueryEngineImpl from (
57+ MetadataImplementor metadata ,
58+ QueryEngineOptions options ,
59+ SqmCreationContext sqmCreationContext ,
60+ ServiceRegistryImplementor serviceRegistry ,
61+ Map <String ,Object > properties ,
62+ String name ) {
63+ final Dialect dialect = serviceRegistry .requireService ( JdbcServices .class ).getDialect ();
6064 return new QueryEngineImpl (
61- sessionFactory ,
6265 metadata .getTypeConfiguration (),
63- resolveHqlTranslator ( options , dialect , sessionFactory , new SqmCreationOptionsStandard ( options ) ),
66+ resolveHqlTranslator ( options , dialect , sqmCreationContext , new SqmCreationOptionsStandard ( options ) ),
6467 resolveSqmTranslatorFactory ( options , dialect ),
65- createFunctionRegistry ( sessionFactory , metadata , options , dialect ),
66- metadata .buildNamedQueryRepository ( sessionFactory ),
67- buildInterpretationCache ( sessionFactory ::getStatistics , sessionFactory .getProperties () ),
68- sessionFactory .getServiceRegistry ().getService (NativeQueryInterpreter .class )
68+ createFunctionRegistry ( serviceRegistry , metadata , options , dialect ),
69+ metadata .buildNamedQueryRepository (),
70+ buildInterpretationCache ( serviceRegistry , properties ),
71+ serviceRegistry .getService (NativeQueryInterpreter .class ),
72+ sqmCreationContext ,
73+ options ,
74+ options .getUuid (),
75+ name
6976 );
7077 }
7178
7279 private static SqmFunctionRegistry createFunctionRegistry (
73- SessionFactoryImplementor sessionFactory ,
80+ ServiceRegistry serviceRegistry ,
7481 MetadataImplementor metadata ,
7582 QueryEngineOptions queryEngineOptions ,
7683 Dialect dialect ) {
@@ -84,21 +91,17 @@ private static SqmFunctionRegistry createFunctionRegistry(
8491 }
8592
8693 //TODO: probably better to turn this back into an anonymous class
87- final FunctionContributions functionContributions = new QueryEngineImpl .FunctionContributionsImpl (
88- sessionFactory .getServiceRegistry (),
89- metadata .getTypeConfiguration (),
90- sqmFunctionRegistry
91- );
92- for ( FunctionContributor contributor : sortedFunctionContributors ( sessionFactory .getServiceRegistry () ) ) {
94+ final FunctionContributions functionContributions =
95+ new FunctionContributionsImpl ( serviceRegistry , metadata .getTypeConfiguration (), sqmFunctionRegistry );
96+ for ( FunctionContributor contributor : sortedFunctionContributors ( serviceRegistry ) ) {
9397 contributor .contributeFunctions ( functionContributions );
9498 }
9599
96100 dialect .initializeFunctionRegistry ( functionContributions );
97101
98102 if ( LOG_HQL_FUNCTIONS .isDebugEnabled () ) {
99- sqmFunctionRegistry .getFunctionsByName ().forEach (
100- entry -> LOG_HQL_FUNCTIONS .debug ( entry .getValue ().getSignature ( entry .getKey () ) )
101- );
103+ sqmFunctionRegistry .getFunctionsByName ()
104+ .forEach ( entry -> LOG_HQL_FUNCTIONS .debug ( entry .getValue ().getSignature ( entry .getKey () ) ) );
102105 }
103106
104107 return sqmFunctionRegistry ;
@@ -114,30 +117,30 @@ private static SqmFunctionRegistry createFunctionRegistry(
114117 private final SqmFunctionRegistry sqmFunctionRegistry ;
115118
116119 private QueryEngineImpl (
117- SessionFactoryImplementor sessionFactory ,
118120 TypeConfiguration typeConfiguration ,
119121 HqlTranslator hqlTranslator ,
120122 SqmTranslatorFactory sqmTranslatorFactory ,
121123 SqmFunctionRegistry functionRegistry ,
122124 NamedObjectRepository namedObjectRepository ,
123125 QueryInterpretationCache interpretationCache ,
124- NativeQueryInterpreter nativeQueryInterpreter ) {
126+ NativeQueryInterpreter nativeQueryInterpreter ,
127+ BindingContext context ,
128+ QueryEngineOptions options ,
129+ String uuid , String name ) {
125130 this .typeConfiguration = typeConfiguration ;
126131 this .sqmFunctionRegistry = functionRegistry ;
127132 this .sqmTranslatorFactory = sqmTranslatorFactory ;
128133 this .hqlTranslator = hqlTranslator ;
129134 this .namedObjectRepository = namedObjectRepository ;
130135 this .interpretationCache = interpretationCache ;
131136 this .nativeQueryInterpreter = nativeQueryInterpreter ;
132- final SessionFactoryOptions sessionFactoryOptions = sessionFactory .getSessionFactoryOptions ();
133- this .criteriaBuilder = new SqmCriteriaNodeBuilder (
134- sessionFactory .getUuid (),
135- sessionFactory .getName (),
136- this ,
137- sessionFactoryOptions .getJpaCompliance ().isJpaQueryComplianceEnabled (),
138- sessionFactoryOptions .getCriteriaValueHandlingMode (),
139- () -> sessionFactory
140- );
137+ this .criteriaBuilder = createCriteriaBuilder ( context , options , uuid , name );
138+ }
139+
140+ private SqmCriteriaNodeBuilder createCriteriaBuilder (
141+ BindingContext context , QueryEngineOptions options ,
142+ String uuid , String name ) {
143+ return new SqmCriteriaNodeBuilder ( uuid , name , this , options , context );
141144 }
142145
143146 private static HqlTranslator resolveHqlTranslator (
@@ -171,10 +174,10 @@ else if ( dialect.getSqmTranslatorFactory() != null ) {
171174 }
172175
173176 private static List <FunctionContributor > sortedFunctionContributors (ServiceRegistry serviceRegistry ) {
174- Collection <FunctionContributor > functionContributors =
177+ final Collection <FunctionContributor > functionContributors =
175178 serviceRegistry .requireService (ClassLoaderService .class )
176179 .loadJavaServices (FunctionContributor .class );
177- List <FunctionContributor > contributors = new ArrayList <>( functionContributors );
180+ final List <FunctionContributor > contributors = new ArrayList <>( functionContributors );
178181 contributors .sort (
179182 comparingInt ( FunctionContributor ::ordinal )
180183 .thenComparing ( a -> a .getClass ().getCanonicalName () )
@@ -183,8 +186,7 @@ private static List<FunctionContributor> sortedFunctionContributors(ServiceRegis
183186 }
184187
185188 private static QueryInterpretationCache buildInterpretationCache (
186- Supplier <StatisticsImplementor > statisticsSupplier ,
187- Map <String , Object > properties ) {
189+ ServiceRegistry serviceRegistry , Map <String , Object > properties ) {
188190 final boolean explicitUseCache = ConfigurationHelper .getBoolean (
189191 AvailableSettings .QUERY_PLAN_CACHE_ENABLED ,
190192 properties ,
@@ -202,11 +204,11 @@ private static QueryInterpretationCache buildInterpretationCache(
202204 ? explicitMaxPlanSize
203205 : QueryEngine .DEFAULT_QUERY_PLAN_MAX_COUNT ;
204206
205- return new QueryInterpretationCacheStandardImpl ( size , statisticsSupplier );
207+ return new QueryInterpretationCacheStandardImpl ( size , serviceRegistry );
206208 }
207209 else {
208210 // disabled
209- return new QueryInterpretationCacheDisabledImpl ( statisticsSupplier );
211+ return new QueryInterpretationCacheDisabledImpl ( serviceRegistry );
210212 }
211213 }
212214
@@ -299,5 +301,4 @@ public ServiceRegistry getServiceRegistry() {
299301 return serviceRegistry ;
300302 }
301303 }
302-
303304}
0 commit comments