From f30dd6d33ebb17b1bdf0c7acf92632ddc888a0b6 Mon Sep 17 00:00:00 2001 From: "Vikrant Balyan (vvb)" Date: Sat, 14 Aug 2021 02:07:30 +0530 Subject: [PATCH 1/3] adds memoization to speed up csharp code generation --- .../org/openapitools/codegen/DefaultCodegen.java | 9 +++++++++ .../codegen/languages/AbstractCSharpCodegen.java | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index fc98a969d14e..2c86379c5c6d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -256,6 +256,9 @@ apiTemplateFiles are for API outputs only (controllers/handlers). // A cache to efficiently lookup a Schema instance based on the return value of `toModelName()`. private Map modelNameToSchemaCache; + // A cache to efficiently lookup schema `toModelName()` based on the schema Key + private Map schemaKeyToModelNameCache = new HashMap<>(); + @Override public List cliOptions() { return cliOptions; @@ -2322,6 +2325,12 @@ public String toApiName(String name) { */ @Override public String toModelName(final String name) { + if (schemaKeyToModelNameCache.containsKey(name)) { + return schemaKeyToModelNameCache.get(name); + } + + schemaKeyToModelNameCache.put(name, camelize(modelNamePrefix + "_" + name + "_" + modelNameSuffix)); + return camelize(modelNamePrefix + "_" + name + "_" + modelNameSuffix); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java index fa09150e5557..3795c44d3a4a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java @@ -90,6 +90,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co // special property keywords not allowed as these are the function names in the model files protected Set propertySpecialKeywords = new HashSet<>(Arrays.asList("ToString", "ToJson", "GetHashCode", "Equals", "ShouldSerializeToString")); + // A cache to efficiently lookup schema `toModelName()` based on the schema Key + private Map schemaKeyToModelNameCache = new HashMap<>(); + public AbstractCSharpCodegen() { super(); @@ -1035,6 +1038,13 @@ public String toModelName(String name) { if (importMapping.containsKey(name)) { return importMapping.get(name); } + + // memoization + String origName = name; + if (schemaKeyToModelNameCache.containsKey(origName)) { + return schemaKeyToModelNameCache.get(origName); + } + if (!StringUtils.isEmpty(modelNamePrefix)) { name = modelNamePrefix + "_" + name; } @@ -1058,6 +1068,8 @@ public String toModelName(String name) { name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } + schemaKeyToModelNameCache.put(origName, camelize(name)); + // camelize the model name // phone_number => PhoneNumber return camelize(name); From 7baa29f35eaf1fe0c996a1792a8bb6f641569917 Mon Sep 17 00:00:00 2001 From: "Vikrant Balyan (vvb)" Date: Sat, 14 Aug 2021 02:31:00 +0530 Subject: [PATCH 2/3] takes care of review comments --- .../main/java/org/openapitools/codegen/DefaultCodegen.java | 6 +++--- .../codegen/languages/AbstractCSharpCodegen.java | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 2c86379c5c6d..4d0b35007fa1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2329,9 +2329,9 @@ public String toModelName(final String name) { return schemaKeyToModelNameCache.get(name); } - schemaKeyToModelNameCache.put(name, camelize(modelNamePrefix + "_" + name + "_" + modelNameSuffix)); - - return camelize(modelNamePrefix + "_" + name + "_" + modelNameSuffix); + String camelizedName = camelize(modelNamePrefix + "_" + name + "_" + modelNameSuffix); + schemaKeyToModelNameCache.put(name, camelizedName); + return camelizedName; } private static class NamedSchema { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java index 3795c44d3a4a..7093997f0b92 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java @@ -1068,11 +1068,12 @@ public String toModelName(String name) { name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } - schemaKeyToModelNameCache.put(origName, camelize(name)); + String camelizedName = camelize(name); + schemaKeyToModelNameCache.put(origName, camelizedName); // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return camelizedName; } @Override From bc3c27a810cf153d7fb064afc438f1e695f5750c Mon Sep 17 00:00:00 2001 From: "Vikrant Balyan (vvb)" Date: Sat, 14 Aug 2021 16:22:30 +0530 Subject: [PATCH 3/3] memoize adds to toModel for Go generator as well --- .../codegen/languages/GoClientCodegen.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java index 11861b579249..60c0d9117db8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java @@ -49,6 +49,9 @@ public class GoClientCodegen extends AbstractGoCodegen { protected boolean isGoSubmodule = false; protected boolean useOneOfDiscriminatorLookup = false; // use oneOf discriminator's mapping for model lookup + // A cache to efficiently lookup schema `toModelName()` based on the schema Key + private Map schemaKeyToModelNameCache = new HashMap<>(); + public GoClientCodegen() { super(); @@ -312,8 +315,14 @@ public String toApiDocFilename(String name) { @Override public String toModelName(String name) { + if (schemaKeyToModelNameCache.containsKey(name)) { + return schemaKeyToModelNameCache.get(name); + } + // underscoring would also lowercase the whole name, thus losing acronyms which are in capitals - return camelize(toModel(name, false)); + String camelizedName = camelize(toModel(name, false)); + schemaKeyToModelNameCache.put(name, camelizedName); + return camelizedName; } public String escapeReservedWord(String name) {