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

View File

@ -112,10 +112,23 @@ public HqlInterpretation resolveHqlInterpretation(
final boolean stats = statistics.isStatisticsEnabled(); final boolean stats = statistics.isStatisticsEnabled();
final long startTime = ( stats ) ? System.nanoTime() : 0L; final long startTime = ( stats ) ? System.nanoTime() : 0L;
final DomainParameterXref domainParameterXref;
ImmutableHqlInterpretation immutableHqlInterpretation = hqlInterpretationCache.get( queryString ); ImmutableHqlInterpretation immutableHqlInterpretation = hqlInterpretationCache.get( queryString );
if ( immutableHqlInterpretation == null ) { if ( immutableHqlInterpretation == null ) {
log.debugf( "Creating and caching HqlInterpretation - %s", queryString ); 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 ); hqlInterpretationCache.put( queryString, immutableHqlInterpretation );
if ( stats ) { if ( stats ) {
@ -128,9 +141,6 @@ public HqlInterpretation resolveHqlInterpretation(
if ( stats ) { if ( stats ) {
statistics.queryPlanCacheHit( queryString ); statistics.queryPlanCacheHit( queryString );
} }
}
DomainParameterXref domainParameterXref;
if ( immutableHqlInterpretation.sqmStatement.getSqmParameters().isEmpty() ) { if ( immutableHqlInterpretation.sqmStatement.getSqmParameters().isEmpty() ) {
domainParameterXref = DomainParameterXref.empty(); domainParameterXref = DomainParameterXref.empty();
@ -138,6 +148,7 @@ public HqlInterpretation resolveHqlInterpretation(
else { else {
domainParameterXref = DomainParameterXref.from( immutableHqlInterpretation.sqmStatement ); domainParameterXref = DomainParameterXref.from( immutableHqlInterpretation.sqmStatement );
} }
}
return new SimpleHqlInterpretationImpl( return new SimpleHqlInterpretationImpl(
immutableHqlInterpretation.sqmStatement, immutableHqlInterpretation.sqmStatement,
@ -173,21 +184,6 @@ public void close() {
queryPlanCache.clear(); 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 static class ImmutableHqlInterpretation {
private final SqmStatement sqmStatement; private final SqmStatement sqmStatement;