From df5f0cdd14bbb77206d5b7b6b945c1662c77f7bc Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 15 Sep 2020 16:19:24 +0200 Subject: [PATCH] [jOOQ/jOOQ#10632] [jOOQ/jOOQ#10633] - Log all column and parameter types in DEBUG level in JavaGenerator - Add DataTypeDefinition.getMatchNames() --- .../java/org/jooq/codegen/GenerationTool.java | 1 + .../java/org/jooq/codegen/JavaGenerator.java | 28 +++++++++++++++---- .../java/org/jooq/meta/AbstractDatabase.java | 17 +++-------- .../org/jooq/meta/DataTypeDefinition.java | 8 ++++++ .../jooq/meta/DefaultDataTypeDefinition.java | 28 +++++++++++++++++++ .../jooq/meta/derby/sys/tables/Syschecks.java | 4 +-- 6 files changed, 65 insertions(+), 21 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index a3d32a5d96..9df7d2efdb 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -915,6 +915,7 @@ public class GenerationTool { + "- regular expressions depending on whitespace (Pattern.COMMENTS is turned on!)\n" + "- missing or inadequate object qualification\n" + "- the " + objectType + " are obsolete\n" + + "Try turning on DEBUG logging (-X in Maven, and in jOOQ) to get additional info about the schema" ); for (Object o : list) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 5a3cf3c5cf..443326d0f1 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -2632,6 +2632,11 @@ public class JavaGenerator extends AbstractGenerator { protected void generateUDT(SchemaDefinition schema, UDTDefinition udt) { JavaWriter out = newJavaWriter(getFile(udt)); log.info("Generating UDT ", out.file().getName()); + + if (log.isDebugEnabled()) + for (AttributeDefinition attribute : udt.getAttributes()) + log.debug("With attribute", "name=" + attribute.getOutputName() + ", matching type names=" + attribute.getDefinedType().getMatchNames()); + generateUDT(udt, out); closeJavaWriter(out); } @@ -4813,6 +4818,17 @@ public class JavaGenerator extends AbstractGenerator { JavaWriter out = newJavaWriter(getFile(table)); out.refConflicts(getStrategy().getJavaIdentifiers(table.getColumns())); out.refConflicts(getStrategy().getJavaIdentifiers(table.getReferencedEmbeddables())); + + log.info("Generating table", out.file().getName() + + " [input=" + table.getInputName() + + ", output=" + table.getOutputName() + + ", pk=" + (table.getPrimaryKey() != null ? table.getPrimaryKey().getName() : "N/A") + + "]"); + + if (log.isDebugEnabled()) + for (ColumnDefinition column : table.getColumns()) + log.debug("With column", "name=" + column.getOutputName() + ", matching type names=" + column.getDefinedType().getMatchNames()); + generateTable(table, out); closeJavaWriter(out); } @@ -4839,12 +4855,6 @@ public class JavaGenerator extends AbstractGenerator { : "table"; final List parameters = table.getParameters(); - log.info("Generating table", out.file().getName() + - " [input=" + table.getInputName() + - ", output=" + table.getOutputName() + - ", pk=" + (primaryKey != null ? primaryKey.getName() : "N/A") + - "]"); - printPackage(out, table); if (scala) { @@ -5758,6 +5768,7 @@ public class JavaGenerator extends AbstractGenerator { @SuppressWarnings("unused") protected void generateEmbeddable(SchemaDefinition schema, EmbeddableDefinition embeddable) { JavaWriter out = newJavaWriter(getFile(embeddable, Mode.RECORD)); + log.info("Generating embeddable", out.file().getName()); generateRecord0(embeddable, out); closeJavaWriter(out); } @@ -6733,6 +6744,11 @@ public class JavaGenerator extends AbstractGenerator { protected void generateRoutine(SchemaDefinition schema, RoutineDefinition routine) { JavaWriter out = newJavaWriter(getFile(routine)); log.info("Generating routine", out.file().getName()); + + if (log.isDebugEnabled()) + for (ParameterDefinition parameter : routine.getAllParameters()) + log.debug("With parameter", "name=" + parameter.getOutputName() + ", matching type names=" + parameter.getDefinedType().getMatchNames()); + generateRoutine(routine, out); closeJavaWriter(out); } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index 625be4c644..0069617367 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -1816,20 +1816,11 @@ public abstract class AbstractDatabase implements Database { } private boolean matches(DataTypeDefinition type, Pattern pattern) { - return ( pattern.matcher(type.getType()).matches() ) - || ( type.getLength() != 0 - && pattern.matcher(type.getType() + "(" + type.getLength() + ")").matches() ) - || ( type.getScale() == 0 - && pattern.matcher(type.getType() + "(" + type.getPrecision() + ")").matches() ) - || ( pattern.matcher(type.getType() + "(" + type.getPrecision() + "," + type.getScale() + ")").matches() ) - || ( pattern.matcher(type.getType() + "(" + type.getPrecision() + ", " + type.getScale() + ")").matches() ) + for (String matchName : type.getMatchNames()) + if (pattern.matcher(matchName).matches()) + return true; - // [#5872] We should match user-defined types as well, in case of which the type might be reported - // as USER-DEFINED (in PostgreSQL) - || ( !StringUtils.isBlank(type.getUserType()) - && ( pattern.matcher(type.getUserType()).matches() - || pattern.matcher(type.getQualifiedUserType().unquotedName().toString()).matches() ) - ); + return false; } @Override diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DataTypeDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DataTypeDefinition.java index 83412a14b1..3cf2845af5 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DataTypeDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DataTypeDefinition.java @@ -37,7 +37,10 @@ */ package org.jooq.meta; +import java.util.List; + import org.jooq.Name; +import org.jooq.meta.jaxb.ForcedType; /** * A definition for a data type object. @@ -146,4 +149,9 @@ public interface DataTypeDefinition { */ SchemaDefinition getSchema(); + /** + * The various type names by which this type can be matched by a + * {@link ForcedType}. + */ + List getMatchNames(); } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java index 3a9c78e5a8..0c4aa3017c 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultDataTypeDefinition.java @@ -44,9 +44,14 @@ import static org.jooq.impl.DefaultDataType.normalise; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; import org.jooq.Name; import org.jooq.SQLDialect; +import org.jooq.tools.StringUtils; import org.jooq.types.UByte; import org.jooq.types.UInteger; import org.jooq.types.ULong; @@ -347,6 +352,29 @@ public class DefaultDataTypeDefinition implements DataTypeDefinition { return false; } + @Override + public List getMatchNames() { + Set result = new LinkedHashSet<>(); + result.add(getType()); + + if (getLength() != 0) + result.add(getType() + "(" + getLength() + ")"); + if (getScale() == 0) + result.add(getType() + "(" + getPrecision() + ")"); + + result.add(getType() + "(" + getPrecision() + "," + getScale() + ")"); + result.add(getType() + "(" + getPrecision() + ", " + getScale() + ")"); + + // [#5872] We should match user-defined types as well, in case of which the type might be reported + // as USER-DEFINED (in PostgreSQL) + if (!StringUtils.isBlank(getUserType())) { + result.add(getUserType()); + result.add(getQualifiedUserType().unquotedName().toString()); + } + + return new ArrayList<>(result); + } + @Override public int hashCode() { final int prime = 31; diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/derby/sys/tables/Syschecks.java b/jOOQ-meta/src/main/java/org/jooq/meta/derby/sys/tables/Syschecks.java index 7bbd557177..3fced65f59 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/derby/sys/tables/Syschecks.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/derby/sys/tables/Syschecks.java @@ -28,7 +28,7 @@ import org.jooq.meta.derby.sys.Sys; @SuppressWarnings({ "all", "unchecked", "rawtypes" }) public class Syschecks extends TableImpl { - private static final long serialVersionUID = -1008578696; + private static final long serialVersionUID = -1825970802; /** * The reference instance of SYS.SYSCHECKS @@ -57,7 +57,7 @@ public class Syschecks extends TableImpl { * @deprecated Unknown data type. Please define an explicit {@link org.jooq.Binding} to specify how this type should be handled. Deprecation can be turned off using {@literal } in your code generator configuration. */ @java.lang.Deprecated - public final TableField REFERENCEDCOLUMNS = createField(DSL.name("REFERENCEDCOLUMNS"), org.jooq.impl.DefaultDataType.getDefaultDataType("\"org.apache.derby.catalog.ReferencedColumns\"").nullable(false), this, ""); + public final TableField REFERENCEDCOLUMNS = createField(DSL.name("REFERENCEDCOLUMNS"), org.jooq.impl.SQLDataType.OTHER.nullable(false), this, ""); private Syschecks(Name alias, Table aliased) { this(alias, aliased, null);