Avoid to recreate the DomainParameterXref twice

This commit is contained in:
Fabio Massimo Ercoli 2021-11-25 15:23:36 +01:00 committed by Christian Beikov
parent 427204910c
commit 430071027c
1 changed files with 20 additions and 24 deletions

View File

@ -112,10 +112,23 @@ public class QueryInterpretationCacheStandardImpl implements QueryInterpretation
final boolean stats = statistics.isStatisticsEnabled();
final long startTime = ( stats ) ? System.nanoTime() : 0L;
final DomainParameterXref domainParameterXref;
ImmutableHqlInterpretation immutableHqlInterpretation = hqlInterpretationCache.get( queryString );
if ( immutableHqlInterpretation == null ) {
log.debugf( "Creating and caching HqlInterpretation - %s", queryString );
immutableHqlInterpretation = create( queryString, creator );
final SqmStatement<?> sqmStatement = creator.apply( queryString );
final ParameterMetadataImplementor parameterMetadata;
if ( sqmStatement.getSqmParameters().isEmpty() ) {
domainParameterXref = DomainParameterXref.empty();
parameterMetadata = ParameterMetadataImpl.EMPTY;
}
else {
domainParameterXref = DomainParameterXref.from( sqmStatement );
parameterMetadata = new ParameterMetadataImpl( domainParameterXref.getQueryParameters() );
}
immutableHqlInterpretation = new ImmutableHqlInterpretation( sqmStatement, parameterMetadata);
hqlInterpretationCache.put( queryString, immutableHqlInterpretation );
if ( stats ) {
@ -128,9 +141,6 @@ public class QueryInterpretationCacheStandardImpl implements QueryInterpretation
if ( stats ) {
statistics.queryPlanCacheHit( queryString );
}
}
DomainParameterXref domainParameterXref;
if ( immutableHqlInterpretation.sqmStatement.getSqmParameters().isEmpty() ) {
domainParameterXref = DomainParameterXref.empty();
@ -138,6 +148,7 @@ public class QueryInterpretationCacheStandardImpl implements QueryInterpretation
else {
domainParameterXref = DomainParameterXref.from( immutableHqlInterpretation.sqmStatement );
}
}
return new SimpleHqlInterpretationImpl(
immutableHqlInterpretation.sqmStatement,
@ -173,21 +184,6 @@ public class QueryInterpretationCacheStandardImpl implements QueryInterpretation
queryPlanCache.clear();
}
private ImmutableHqlInterpretation create(String queryString, Function<String, SqmStatement<?>> creator) {
final SqmStatement<?> sqmStatement = creator.apply( queryString );
final ParameterMetadataImplementor parameterMetadata;
if ( sqmStatement.getSqmParameters().isEmpty() ) {
parameterMetadata = ParameterMetadataImpl.EMPTY;
}
else {
// TODO Avoid to recreate the DomainParameterXref twice
parameterMetadata = new ParameterMetadataImpl( DomainParameterXref.from( sqmStatement ).getQueryParameters() );
}
return new ImmutableHqlInterpretation( sqmStatement, parameterMetadata);
}
private static class ImmutableHqlInterpretation {
private final SqmStatement sqmStatement;