Skip to content

Commit c4fa949

Browse files
committed
minor cleanups in JdbcSelectExecutorStandardImpl
1 parent aeb3b86 commit c4fa949

File tree

1 file changed

+69
-48
lines changed

1 file changed

+69
-48
lines changed

hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java

Lines changed: 69 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
import org.hibernate.SharedSessionContract;
1313
import org.hibernate.cache.spi.QueryKey;
1414
import org.hibernate.cache.spi.QueryResultsCache;
15+
import org.hibernate.engine.spi.LoadQueryInfluencers;
1516
import org.hibernate.engine.spi.PersistenceContext;
1617
import org.hibernate.engine.spi.SessionFactoryImplementor;
1718
import org.hibernate.engine.spi.SharedSessionContractImplementor;
18-
import org.hibernate.internal.util.collections.ArrayHelper;
1919
import org.hibernate.query.TupleTransformer;
2020
import org.hibernate.query.spi.QueryOptions;
2121
import org.hibernate.sql.exec.SqlExecLogger;
@@ -28,6 +28,7 @@
2828
import org.hibernate.sql.results.internal.RowProcessingStateStandardImpl;
2929
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
3030
import org.hibernate.sql.results.internal.RowTransformerTupleTransformerAdapter;
31+
import org.hibernate.sql.results.jdbc.internal.AbstractJdbcValues;
3132
import org.hibernate.sql.results.jdbc.internal.CachedJdbcValuesMetadata;
3233
import org.hibernate.sql.results.jdbc.internal.DeferredResultSetAccess;
3334
import org.hibernate.sql.results.jdbc.internal.JdbcValuesCacheHit;
@@ -48,6 +49,7 @@
4849
import org.hibernate.type.spi.TypeConfiguration;
4950

5051
import static org.hibernate.internal.util.NullnessHelper.coalesceSuppliedValues;
52+
import static org.hibernate.internal.util.collections.ArrayHelper.indexOf;
5153

5254
/**
5355
* Standard JdbcSelectExecutor implementation used by Hibernate,
@@ -145,22 +147,7 @@ private <T, R> T doExecuteQuery(
145147
);
146148

147149
if ( rowTransformer == null ) {
148-
@SuppressWarnings("unchecked")
149-
final TupleTransformer<R> tupleTransformer = (TupleTransformer<R>) executionContext
150-
.getQueryOptions()
151-
.getTupleTransformer();
152-
153-
if ( tupleTransformer == null ) {
154-
rowTransformer = RowTransformerStandardImpl.instance();
155-
}
156-
else {
157-
final List<DomainResult<?>> domainResults = jdbcValues.getValuesMapping().getDomainResults();
158-
final String[] aliases = new String[domainResults.size()];
159-
for ( int i = 0; i < domainResults.size(); i++ ) {
160-
aliases[i] = domainResults.get( i ).getResultVariable();
161-
}
162-
rowTransformer = new RowTransformerTupleTransformerAdapter<>( aliases, tupleTransformer );
163-
}
150+
rowTransformer = getRowTransformer( executionContext, jdbcValues );
164151
}
165152

166153
final SharedSessionContractImplementor session = executionContext.getSession();
@@ -204,10 +191,8 @@ public boolean shouldReturnProxies() {
204191
}
205192
};
206193

207-
final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState = new JdbcValuesSourceProcessingStateStandardImpl(
208-
executionContext,
209-
processingOptions
210-
);
194+
final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState =
195+
new JdbcValuesSourceProcessingStateStandardImpl( executionContext, processingOptions );
211196

212197
final RowReader<R> rowReader = ResultsHelper.createRowReader(
213198
session.getFactory(),
@@ -234,7 +219,8 @@ public boolean shouldReturnProxies() {
234219

235220
if ( stats ) {
236221
final long endTime = System.nanoTime();
237-
final long milliseconds = TimeUnit.MILLISECONDS.convert( endTime - startTime, TimeUnit.NANOSECONDS );
222+
final long milliseconds =
223+
TimeUnit.MILLISECONDS.convert( endTime - startTime, TimeUnit.NANOSECONDS );
238224
statistics.queryExecuted(
239225
executionContext.getQueryIdentifier( jdbcSelect.getSqlString() ),
240226
getResultSize( result ),
@@ -245,11 +231,25 @@ public boolean shouldReturnProxies() {
245231
return result;
246232
}
247233

248-
private <T> int getResultSize(T result) {
249-
if ( result instanceof List ) {
250-
return ( (List<?>) result ).size();
234+
private static <R> RowTransformer<R> getRowTransformer(ExecutionContext executionContext, JdbcValues jdbcValues) {
235+
@SuppressWarnings("unchecked")
236+
final TupleTransformer<R> tupleTransformer =
237+
(TupleTransformer<R>) executionContext.getQueryOptions().getTupleTransformer();
238+
if ( tupleTransformer == null ) {
239+
return RowTransformerStandardImpl.instance();
240+
}
241+
else {
242+
final List<DomainResult<?>> domainResults = jdbcValues.getValuesMapping().getDomainResults();
243+
final String[] aliases = new String[domainResults.size()];
244+
for ( int i = 0; i < domainResults.size(); i++ ) {
245+
aliases[i] = domainResults.get( i ).getResultVariable();
246+
}
247+
return new RowTransformerTupleTransformerAdapter<>( aliases, tupleTransformer );
251248
}
252-
return -1;
249+
}
250+
251+
private <T> int getResultSize(T result) {
252+
return result instanceof List<?> list ? list.size() : -1;
253253
}
254254

255255
private JdbcValues resolveJdbcValuesSource(
@@ -264,8 +264,11 @@ private JdbcValues resolveJdbcValuesSource(
264264

265265
final CacheMode cacheMode = resolveCacheMode( executionContext );
266266
final JdbcValuesMappingProducer mappingProducer = jdbcSelect.getJdbcValuesMappingProducer();
267-
final boolean cacheable = queryCacheEnabled && canBeCached
268-
&& executionContext.getQueryOptions().isResultCachingEnabled() == Boolean.TRUE;
267+
final QueryOptions queryOptions = executionContext.getQueryOptions();
268+
final boolean cacheable =
269+
queryCacheEnabled
270+
&& canBeCached
271+
&& queryOptions.isResultCachingEnabled() == Boolean.TRUE;
269272

270273
final QueryKey queryResultsCacheKey;
271274
final List<?> cachedResults;
@@ -280,11 +283,11 @@ private JdbcValues resolveJdbcValuesSource(
280283
}
281284

282285
final QueryResultsCache queryCache = factory.getCache()
283-
.getQueryResultsCache( executionContext.getQueryOptions().getResultCacheRegionName() );
286+
.getQueryResultsCache( queryOptions.getResultCacheRegionName() );
284287

285288
queryResultsCacheKey = QueryKey.from(
286289
jdbcSelect.getSqlString(),
287-
executionContext.getQueryOptions().getLimit(),
290+
queryOptions.getLimit(),
288291
executionContext.getQueryParameterBindings(),
289292
session
290293
);
@@ -324,7 +327,7 @@ private JdbcValues resolveJdbcValuesSource(
324327
if ( cacheable && cacheMode.isPutEnabled() ) {
325328
queryResultsCacheKey = QueryKey.from(
326329
jdbcSelect.getSqlString(),
327-
executionContext.getQueryOptions().getLimit(),
330+
queryOptions.getLimit(),
328331
executionContext.getQueryParameterBindings(),
329332
session
330333
);
@@ -334,20 +337,41 @@ private JdbcValues resolveJdbcValuesSource(
334337
}
335338
}
336339

340+
return resolveJdbcValues(
341+
queryIdentifier,
342+
executionContext,
343+
resultSetAccess,
344+
cachedResults,
345+
queryResultsCacheKey,
346+
mappingProducer,
347+
session,
348+
factory
349+
);
350+
}
351+
352+
private static AbstractJdbcValues resolveJdbcValues(
353+
String queryIdentifier,
354+
ExecutionContext executionContext,
355+
DeferredResultSetAccess resultSetAccess,
356+
List<?> cachedResults,
357+
QueryKey queryResultsCacheKey,
358+
JdbcValuesMappingProducer mappingProducer,
359+
SharedSessionContractImplementor session,
360+
SessionFactoryImplementor factory) {
361+
final LoadQueryInfluencers loadQueryInfluencers = session.getLoadQueryInfluencers();
337362
if ( cachedResults == null ) {
338363
final CachedJdbcValuesMetadata metadataForCache;
339364
final JdbcValuesMapping jdbcValuesMapping;
340365
if ( queryResultsCacheKey == null ) {
341-
jdbcValuesMapping = mappingProducer.resolve( resultSetAccess, session.getLoadQueryInfluencers(), factory );
366+
jdbcValuesMapping = mappingProducer.resolve( resultSetAccess, loadQueryInfluencers, factory );
342367
metadataForCache = null;
343368
}
344369
else {
345370
// If we need to put the values into the cache, we need to be able to capture the JdbcValuesMetadata
346371
final CapturingJdbcValuesMetadata capturingMetadata = new CapturingJdbcValuesMetadata( resultSetAccess );
347-
jdbcValuesMapping = mappingProducer.resolve( capturingMetadata, session.getLoadQueryInfluencers(), factory );
372+
jdbcValuesMapping = mappingProducer.resolve( capturingMetadata, loadQueryInfluencers, factory );
348373
metadataForCache = capturingMetadata.resolveMetadataForCache();
349374
}
350-
351375
return new JdbcValuesResultSetImpl(
352376
resultSetAccess,
353377
queryResultsCacheKey,
@@ -360,14 +384,13 @@ private JdbcValues resolveJdbcValuesSource(
360384
);
361385
}
362386
else {
363-
final JdbcValuesMapping jdbcValuesMapping;
364-
if ( cachedResults.isEmpty() || !( cachedResults.get( 0 ) instanceof JdbcValuesMetadata ) ) {
365-
jdbcValuesMapping = mappingProducer.resolve( resultSetAccess, session.getLoadQueryInfluencers(), factory );
366-
}
367-
else {
368-
jdbcValuesMapping = mappingProducer.resolve( (JdbcValuesMetadata) cachedResults.get( 0 ), session.getLoadQueryInfluencers(), factory );
369-
}
370-
return new JdbcValuesCacheHit( cachedResults, jdbcValuesMapping );
387+
final JdbcValuesMetadata valuesMetadata =
388+
!cachedResults.isEmpty()
389+
&& cachedResults.get( 0 ) instanceof JdbcValuesMetadata jdbcValuesMetadata
390+
? jdbcValuesMetadata
391+
: resultSetAccess;
392+
return new JdbcValuesCacheHit( cachedResults,
393+
mappingProducer.resolve( valuesMetadata, loadQueryInfluencers, factory ) );
371394
}
372395
}
373396

@@ -414,7 +437,7 @@ public int resolveColumnPosition(String columnName) {
414437
position = resultSetAccess.resolveColumnPosition( columnName );
415438
columnNames[position - 1] = columnName;
416439
}
417-
else if ( ( position = ArrayHelper.indexOf( columnNames, columnName ) + 1 ) == 0 ) {
440+
else if ( ( position = indexOf( columnNames, columnName ) + 1 ) == 0 ) {
418441
position = resultSetAccess.resolveColumnPosition( columnName );
419442
columnNames[position - 1] = columnName;
420443
}
@@ -446,16 +469,14 @@ public <J> BasicType<J> resolveType(
446469
if ( columnNames == null ) {
447470
initializeArrays();
448471
}
449-
final BasicType<J> basicType = resultSetAccess.resolveType( position, explicitJavaType, typeConfiguration );
472+
final BasicType<J> basicType =
473+
resultSetAccess.resolveType( position, explicitJavaType, typeConfiguration );
450474
types[position - 1] = basicType;
451475
return basicType;
452476
}
453477

454478
public CachedJdbcValuesMetadata resolveMetadataForCache() {
455-
if ( columnNames == null ) {
456-
return null;
457-
}
458-
return new CachedJdbcValuesMetadata( columnNames, types );
479+
return columnNames == null ? null : new CachedJdbcValuesMetadata( columnNames, types );
459480
}
460481
}
461482

0 commit comments

Comments
 (0)