Skip to content

Commit

Permalink
HHH-12917 Interning of strings for Filter definitions
Browse files Browse the repository at this point in the history
(cherry picked from commit 4fa0491)
  • Loading branch information
Sanne authored and gbadner committed Feb 7, 2019
1 parent 8b4fd69 commit e520fd9
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.sql.Template;

import static org.hibernate.internal.util.StringHelper.safeInterning;

/**
* Implementation of FilterHelper.
*
Expand Down Expand Up @@ -44,23 +46,27 @@ public FilterHelper(List<FilterConfiguration> filters, SessionFactoryImplementor
filterCount = 0;
for ( final FilterConfiguration filter : filters ) {
filterAutoAliasFlags[filterCount] = false;
filterNames[filterCount] = filter.getName();
filterConditions[filterCount] = filter.getCondition();
filterNames[filterCount] = safeInterning( filter.getName() );
filterConditions[filterCount] = safeInterning( filter.getCondition() );
filterAliasTableMaps[filterCount] = filter.getAliasTableMap( factory );
if ( ( filterAliasTableMaps[filterCount].isEmpty() || isTableFromPersistentClass( filterAliasTableMaps[filterCount] ) ) && filter
.useAutoAliasInjection() ) {
filterConditions[filterCount] = Template.renderWhereStringTemplate(
filter.getCondition(),
FilterImpl.MARKER,
factory.getDialect(),
factory.getSqlFunctionRegistry()
filterConditions[filterCount] = safeInterning(
Template.renderWhereStringTemplate(
filter.getCondition(),
FilterImpl.MARKER,
factory.getDialect(),
factory.getSqlFunctionRegistry()
)
);
filterAutoAliasFlags[filterCount] = true;
}
filterConditions[filterCount] = StringHelper.replace(
filterConditions[filterCount],
":",
":" + filterNames[filterCount] + "."
filterConditions[filterCount] = safeInterning(
StringHelper.replace(
filterConditions[filterCount],
":",
":" + filterNames[filterCount] + "."
)
);
filterCount++;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -886,4 +886,25 @@ else if ( isSecondExpressionNonEmpty ) {
return null;
}
}

/**
* Return the interned form of a String, or null if the parameter is null.
* <p>
* Use with caution: excessive interning is known to cause issues.
* Best to use only with strings which are known to be long lived constants,
* and for which the chances of being actual duplicates is proven.
* (Even better: avoid needing interning by design changes such as reusing
* the known reference)
* @param string The string to intern.
* @return The interned string.
*/
public static String safeInterning(final String string) {
if ( string == null ) {
return null;
}
else {
return string.intern();
}
}

}

0 comments on commit e520fd9

Please sign in to comment.