From b30e478de370cbbd309505d87bc155750626d8f1 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 18 Feb 2013 17:12:31 +0100 Subject: [PATCH] [#2238] Code generation runs extremely slow for large schemas (Inefficient DefaultRelations.getUniqueKeys() and getForeignKeys() methods) --- .../org/jooq/util/AbstractDefinition.java | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDefinition.java index 2de6020bca..fb750b06cb 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDefinition.java @@ -54,6 +54,11 @@ public abstract class AbstractDefinition implements Definition { private final String comment; private final String overload; + // [#2238] Some caches for strings that are heavy to calculate in large schemas + private transient String qualifiedInputName; + private transient String qualifiedOutputName; + private transient Integer hashCode; + public AbstractDefinition(Database database, SchemaDefinition schema, String name) { this(database, schema, name, null); } @@ -121,21 +126,25 @@ public abstract class AbstractDefinition implements Definition { */ @Override public final String getQualifiedInputName() { - StringBuilder sb = new StringBuilder(); + if (qualifiedInputName == null) { + StringBuilder sb = new StringBuilder(); - String separator = ""; - for (Definition part : getDefinitionPath()) { - if (part instanceof SchemaDefinition && ((SchemaDefinition) part).isDefaultSchema()) { - continue; + String separator = ""; + for (Definition part : getDefinitionPath()) { + if (part instanceof SchemaDefinition && ((SchemaDefinition) part).isDefaultSchema()) { + continue; + } + + sb.append(separator); + sb.append(part.getInputName()); + + separator = "."; } - sb.append(separator); - sb.append(part.getInputName()); - - separator = "."; + qualifiedInputName = sb.toString(); } - return sb.toString(); + return qualifiedInputName; } /** @@ -145,21 +154,25 @@ public abstract class AbstractDefinition implements Definition { */ @Override public final String getQualifiedOutputName() { - StringBuilder sb = new StringBuilder(); + if (qualifiedOutputName == null) { + StringBuilder sb = new StringBuilder(); - String separator = ""; - for (Definition part : getDefinitionPath()) { - if (part instanceof SchemaDefinition && ((SchemaDefinition) part).isDefaultSchema()) { - continue; + String separator = ""; + for (Definition part : getDefinitionPath()) { + if (part instanceof SchemaDefinition && ((SchemaDefinition) part).isDefaultSchema()) { + continue; + } + + sb.append(separator); + sb.append(part.getOutputName()); + + separator = "."; } - sb.append(separator); - sb.append(part.getOutputName()); - - separator = "."; + qualifiedOutputName = sb.toString(); } - return sb.toString(); + return qualifiedOutputName; } @Override @@ -188,7 +201,11 @@ public abstract class AbstractDefinition implements Definition { @Override public final int hashCode() { - return getQualifiedName().hashCode(); + if (hashCode == null) { + hashCode = getQualifiedName().hashCode(); + } + + return hashCode; } protected final Executor create() {