Skip to content

Commit de34086

Browse files
committed
HHH-18863 change the way enum types -> values are cached to avoid lookups
1 parent ece2981 commit de34086

File tree

3 files changed

+27
-25
lines changed

3 files changed

+27
-25
lines changed

tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -504,12 +504,25 @@ public Map<String,Set<String>> getEnumTypesByValue() {
504504
return enumTypesByValue;
505505
}
506506

507-
public void addEnumValue(String type, String value) {
508-
enumTypesByValue.computeIfAbsent( value, s -> new TreeSet<>() ).add( type );
507+
public void addEnumValue(
508+
String qualifiedTypeName, String shortTypeName,
509+
@Nullable String outerTypeQualifiedName, @Nullable String outerShortTypeName,
510+
String value) {
511+
addEnumValue( qualifiedTypeName, value );
512+
addEnumValue( qualifiedTypeName, qualifiedTypeName + '.' + value );
513+
addEnumValue( qualifiedTypeName, shortTypeName + '.' + value );
514+
if ( outerShortTypeName != null ) {
515+
addEnumValue( qualifiedTypeName, outerShortTypeName + '.' + shortTypeName + '.' + value );
516+
addEnumValue( qualifiedTypeName, outerShortTypeName + '$' + shortTypeName + '.' + value );
517+
addEnumValue( qualifiedTypeName, outerTypeQualifiedName + '$' + shortTypeName + '.' + value );
518+
}
519+
}
520+
521+
private void addEnumValue(String qualifiedTypeName, String value) {
522+
enumTypesByValue.computeIfAbsent( value, s -> new TreeSet<>() ).add( qualifiedTypeName );
509523
}
510524

511-
@Nullable
512-
public TypeElement entityType(String entityName) {
525+
public @Nullable TypeElement entityType(String entityName) {
513526
final Elements elementUtils = getElementUtils();
514527
final String qualifiedName = qualifiedNameForEntityName(entityName);
515528
if ( qualifiedName != null ) {

tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,9 +643,15 @@ private void indexEnumValues(TypeMirror type) {
643643
final DeclaredType declaredType = (DeclaredType) type;
644644
final TypeElement fieldType = (TypeElement) declaredType.asElement();
645645
if ( fieldType.getKind() == ElementKind.ENUM ) {
646-
for (Element enumMember : fieldType.getEnclosedElements() ) {
646+
for ( Element enumMember : fieldType.getEnclosedElements() ) {
647647
if ( enumMember.getKind() == ElementKind.ENUM_CONSTANT ) {
648+
final Element enclosingElement = fieldType.getEnclosingElement();
649+
final boolean hasOuterType =
650+
enclosingElement.getKind().isClass() || enclosingElement.getKind().isInterface();
648651
context.addEnumValue( fieldType.getQualifiedName().toString(),
652+
fieldType.getSimpleName().toString(),
653+
hasOuterType ? ((TypeElement) enclosingElement).getQualifiedName().toString() : null,
654+
hasOuterType ? enclosingElement.getSimpleName().toString() : null,
649655
enumMember.getSimpleName().toString() );
650656
}
651657
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/ProcessorSessionFactory.java

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import static org.hibernate.internal.util.StringHelper.root;
5858
import static org.hibernate.internal.util.StringHelper.split;
5959
import static org.hibernate.internal.util.StringHelper.unroot;
60-
import static org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.addAllowedEnumLiteralsToEnumTypesMap;
6160
import static org.hibernate.processor.util.Constants.JAVA_OBJECT;
6261

6362
/**
@@ -90,7 +89,7 @@ public static MockSessionFactory create(
9089
private final Types typeUtil;
9190
private final Filer filer;
9291
private final Map<String, String> entityNameMappings;
93-
private final Map<String, Set<String>> allowedEnumLiteralsToEnumTypeNames;
92+
private final Map<String, Set<String>> enumTypesByValue;
9493

9594
public ProcessorSessionFactory(
9695
ProcessingEnvironment processingEnvironment,
@@ -100,23 +99,7 @@ public ProcessorSessionFactory(
10099
typeUtil = processingEnvironment.getTypeUtils();
101100
filer = processingEnvironment.getFiler();
102101
this.entityNameMappings = entityNameMappings;
103-
final Map<String, Set<String>> allowedEnumLiteralsToEnumTypeNames = new HashMap<>( enumTypesByValue.size() << 2 );
104-
for ( Map.Entry<String, Set<String>> entry : enumTypesByValue.entrySet() ) {
105-
final String enumConstantName = entry.getKey();
106-
for ( String enumClassName : entry.getValue() ) {
107-
final TypeElement enumTypeElement = elementUtil.getTypeElement( enumClassName );
108-
if ( enumTypeElement != null ) {
109-
addAllowedEnumLiteralsToEnumTypesMap(
110-
allowedEnumLiteralsToEnumTypeNames,
111-
enumConstantName,
112-
enumTypeElement.getSimpleName().toString(),
113-
elementUtil.getBinaryName( enumTypeElement ).toString(),
114-
enumClassName
115-
);
116-
}
117-
}
118-
}
119-
this.allowedEnumLiteralsToEnumTypeNames = allowedEnumLiteralsToEnumTypeNames;
102+
this.enumTypesByValue = enumTypesByValue;
120103
}
121104

122105
@Override
@@ -233,7 +216,7 @@ private static JdbcType enumJdbcType(Element member) {
233216

234217
@Override @Nullable
235218
Set<String> getEnumTypesForValue(String value) {
236-
final Set<String> result = allowedEnumLiteralsToEnumTypeNames.get( value);
219+
final Set<String> result = enumTypesByValue.get(value);
237220
if ( result != null ) {
238221
return result;
239222
}

0 commit comments

Comments
 (0)