Skip to content

Commit c824e1a

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

File tree

3 files changed

+28
-25
lines changed

3 files changed

+28
-25
lines changed

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -412,15 +412,15 @@ public boolean checkNamedQuery(String name) {
412412
public void setUsesQuarkusOrm(boolean b) {
413413
usesQuarkusOrm = b;
414414
}
415-
415+
416416
public boolean usesQuarkusOrm() {
417417
return usesQuarkusOrm;
418418
}
419419

420420
public void setUsesQuarkusReactive(boolean b) {
421421
usesQuarkusReactive = b;
422422
}
423-
423+
424424
public boolean usesQuarkusReactive() {
425425
return usesQuarkusReactive;
426426
}
@@ -504,7 +504,21 @@ 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
}

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
@@ -646,9 +646,15 @@ private void indexEnumValues(TypeMirror type) {
646646
final DeclaredType declaredType = (DeclaredType) type;
647647
final TypeElement fieldType = (TypeElement) declaredType.asElement();
648648
if ( fieldType.getKind() == ElementKind.ENUM ) {
649-
for (Element enumMember : fieldType.getEnclosedElements() ) {
649+
for ( Element enumMember : fieldType.getEnclosedElements() ) {
650650
if ( enumMember.getKind() == ElementKind.ENUM_CONSTANT ) {
651+
final Element enclosingElement = fieldType.getEnclosingElement();
652+
final boolean hasOuterType =
653+
enclosingElement.getKind().isClass() || enclosingElement.getKind().isInterface();
651654
context.addEnumValue( fieldType.getQualifiedName().toString(),
655+
fieldType.getSimpleName().toString(),
656+
hasOuterType ? ((TypeElement) enclosingElement).getQualifiedName().toString() : null,
657+
hasOuterType ? enclosingElement.getSimpleName().toString() : null,
652658
enumMember.getSimpleName().toString() );
653659
}
654660
}

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
@@ -59,7 +59,6 @@
5959
import static org.hibernate.internal.util.StringHelper.root;
6060
import static org.hibernate.internal.util.StringHelper.split;
6161
import static org.hibernate.internal.util.StringHelper.unroot;
62-
import static org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl.addAllowedEnumLiteralsToEnumTypesMap;
6362
import static org.hibernate.processor.util.Constants.JAVA_OBJECT;
6463

6564
/**
@@ -92,7 +91,7 @@ public static MockSessionFactory create(
9291
private final Types typeUtil;
9392
private final Filer filer;
9493
private final Map<String, String> entityNameMappings;
95-
private final Map<String, Set<String>> allowedEnumLiteralsToEnumTypeNames;
94+
private final Map<String, Set<String>> enumTypesByValue;
9695

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

124107
@Override
@@ -236,7 +219,7 @@ private static JdbcType enumJdbcType(Element member) {
236219

237220
@Override @Nullable
238221
Set<String> getEnumTypesForValue(String value) {
239-
Set<String> result = allowedEnumLiteralsToEnumTypeNames.get( value);
222+
Set<String> result = enumTypesByValue.get(value);
240223
if ( result != null ) {
241224
return result;
242225
}

0 commit comments

Comments
 (0)