From 059f3fb4a3bbdba21f122ebd1d4463bd44f2f572 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 10 May 2021 22:59:59 +0200 Subject: [PATCH] [jOOQ/jOOQ#11804] Dogfooding --- jOOQ-codegen-maven/pom.xml | 11 +-- .../org/jooq/meta/cubrid/CUBRIDDatabase.java | 4 +- .../java/org/jooq/meta/h2/H2Database.java | 74 ++++++++----------- .../org/jooq/meta/hsqldb/HSQLDBDatabase.java | 7 +- .../org/jooq/meta/mysql/MySQLDatabase.java | 57 +++++++------- .../jooq/meta/postgres/PostgresDatabase.java | 50 ++++++------- 6 files changed, 89 insertions(+), 114 deletions(-) diff --git a/jOOQ-codegen-maven/pom.xml b/jOOQ-codegen-maven/pom.xml index c94aa046ac..8aeda3c649 100644 --- a/jOOQ-codegen-maven/pom.xml +++ b/jOOQ-codegen-maven/pom.xml @@ -28,15 +28,6 @@ - - - - apache-snapshot-repository - Apache Snapshot Repository - https://repository.apache.org/snapshots/ - - - @@ -74,7 +65,7 @@ org.apache.maven.plugin-tools maven-plugin-tools-annotations - 3.6.1-SNAPSHOT + 3.6.1 diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/cubrid/CUBRIDDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/cubrid/CUBRIDDatabase.java index 954aa84616..dc078dc3ef 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/cubrid/CUBRIDDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/cubrid/CUBRIDDatabase.java @@ -38,6 +38,7 @@ package org.jooq.meta.cubrid; +import static org.jooq.Records.toList; import static org.jooq.impl.DSL.concat; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.name; @@ -58,6 +59,7 @@ import org.jooq.Condition; import org.jooq.DSLContext; import org.jooq.Record; import org.jooq.Record3; +import org.jooq.Records; import org.jooq.Result; import org.jooq.SQLDialect; import org.jooq.impl.DSL; @@ -135,7 +137,7 @@ public class CUBRIDDatabase extends AbstractDatabase { .selectDistinct(DB_INDEX.CLASS_NAME) .from(DB_INDEX) .where(DB_INDEX.IS_FOREIGN_KEY.isTrue()) - .fetch(DB_INDEX.CLASS_NAME)) { + .collect(toList())) { for (Record record : create().fetch(meta.getImportedKeys(null, null, table))) { String foreignKeyName = diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java index 5a48527389..d5e057b5ba 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/h2/H2Database.java @@ -37,8 +37,7 @@ */ package org.jooq.meta.h2; -import static java.util.stream.Collectors.mapping; -import static java.util.stream.Collectors.toList; +import static org.jooq.Records.mapping; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; @@ -73,7 +72,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.stream.Collectors; import org.jooq.DSLContext; import org.jooq.Field; @@ -398,17 +396,9 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase @Override protected List getSchemata0() throws SQLException { return - create().select( - SCHEMATA.SCHEMA_NAME, - SCHEMATA.REMARKS) + create().select(SCHEMATA.SCHEMA_NAME, SCHEMATA.REMARKS) .from(SCHEMATA) - .collect(mapping( - r -> new SchemaDefinition(this, - r.get(SCHEMATA.SCHEMA_NAME), - r.get(SCHEMATA.REMARKS) - ), - toList() - )); + .fetch(mapping((s, r) -> new SchemaDefinition(this, s, r))); } @Override @@ -473,12 +463,14 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase protected List getTables0() throws SQLException { List result = new ArrayList<>(); - for (Record record : create().select( + final /* record */ class R { private final String schema; private final String table; private final TableType type; private final String comment; private final String source; public R(String schema, String table, TableType type, String comment, String source) { this.schema = schema; this.table = table; this.type = type; this.comment = comment; this.source = source; } public String schema() { return schema; } public String table() { return table; } public TableType type() { return type; } public String comment() { return comment; } public String source() { return source; } @Override public boolean equals(Object o) { if (!(o instanceof R)) return false; R other = (R) o; if (!java.util.Objects.equals(this.schema, other.schema)) return false; if (!java.util.Objects.equals(this.table, other.table)) return false; if (!java.util.Objects.equals(this.type, other.type)) return false; if (!java.util.Objects.equals(this.comment, other.comment)) return false; if (!java.util.Objects.equals(this.source, other.source)) return false; return true; } @Override public int hashCode() { return java.util.Objects.hash(this.schema, this.table, this.type, this.comment, this.source); } @Override public String toString() { return new StringBuilder("R[").append("schema=").append(this.schema).append(", table=").append(this.table).append(", type=").append(this.type).append(", comment=").append(this.comment).append(", source=").append(this.source).append("]").toString(); } } + + for (R r : create().select( TABLES.TABLE_SCHEMA, TABLES.TABLE_NAME, when(TABLES.TABLE_TYPE.eq(inline("VIEW")), inline(TableType.VIEW.name())) .when(TABLES.STORAGE_TYPE.like(inline("%TEMPORARY%")), inline(TableType.TEMPORARY.name())) - .else_(inline(TableType.TABLE.name())).as("table_type"), + .else_(inline(TableType.TABLE.name())).convertFrom(TableType::valueOf).as("table_type"), TABLES.REMARKS, VIEWS.VIEW_DEFINITION) .from(TABLES) @@ -488,19 +480,13 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase .where(TABLES.TABLE_SCHEMA.in(getInputSchemata())) .orderBy( TABLES.TABLE_SCHEMA, - TABLES.TABLE_NAME)) { + TABLES.TABLE_NAME) + .fetch(mapping(R::new))) { - SchemaDefinition schema = getSchema(record.get(TABLES.TABLE_SCHEMA)); + SchemaDefinition schema = getSchema(r.schema); - if (schema != null) { - String name = record.get(TABLES.TABLE_NAME); - String comment = record.get(TABLES.REMARKS); - TableType tableType = record.get("table_type", TableType.class); - String source = record.get(VIEWS.VIEW_DEFINITION); - - H2TableDefinition table = new H2TableDefinition(schema, name, comment, tableType, source); - result.add(table); - } + if (schema != null) + result.add(new H2TableDefinition(schema, r.table, r.comment, r.type, r.source)); } return result; @@ -580,8 +566,10 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase private void getInlineEnums(List result) { + final /* record */ class R { private final String schema; private final String table; private final String column; private final String type; public R(String schema, String table, String column, String type) { this.schema = schema; this.table = table; this.column = column; this.type = type; } public String schema() { return schema; } public String table() { return table; } public String column() { return column; } public String type() { return type; } @Override public boolean equals(Object o) { if (!(o instanceof R)) return false; R other = (R) o; if (!java.util.Objects.equals(this.schema, other.schema)) return false; if (!java.util.Objects.equals(this.table, other.table)) return false; if (!java.util.Objects.equals(this.column, other.column)) return false; if (!java.util.Objects.equals(this.type, other.type)) return false; return true; } @Override public int hashCode() { return java.util.Objects.hash(this.schema, this.table, this.column, this.type); } @Override public String toString() { return new StringBuilder("R[").append("schema=").append(this.schema).append(", table=").append(this.table).append(", column=").append(this.column).append(", type=").append(this.type).append("]").toString(); } } + enumLoop: - for (Record record : create() + for (R r : create() .select( COLUMNS.TABLE_SCHEMA, COLUMNS.TABLE_NAME, @@ -594,22 +582,20 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase .orderBy( COLUMNS.TABLE_SCHEMA.asc(), COLUMNS.TABLE_NAME.asc(), - COLUMNS.COLUMN_NAME.asc())) { + COLUMNS.COLUMN_NAME.asc()) + .fetch(mapping(R::new))) { - SchemaDefinition schema = getSchema(record.get(COLUMNS.TABLE_SCHEMA)); + SchemaDefinition schema = getSchema(r.schema); if (schema == null) continue enumLoop; - String table = record.get(COLUMNS.TABLE_NAME); - String column = record.get(COLUMNS.COLUMN_NAME); - String name = table + "_" + column; - String columnType = record.get(COLUMNS.COLUMN_TYPE); + String name = r.table + "_" + r.column; // [#1237] Don't generate enum classes for columns in MySQL tables // that are excluded from code generation - TableDefinition tableDefinition = getTable(schema, table); + TableDefinition tableDefinition = getTable(schema, r.table); if (tableDefinition != null) { - ColumnDefinition columnDefinition = tableDefinition.getColumn(column); + ColumnDefinition columnDefinition = tableDefinition.getColumn(r.column); if (columnDefinition != null) { @@ -619,7 +605,7 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, name, ""); CSVReader reader = new CSVReader( - new StringReader(columnType.replaceAll("(^enum\\()|(\\).*$)", "")) + new StringReader(r.type.replaceAll("(^enum\\()|(\\).*$)", "")) ,',' // Separator ,'\'' // Quote character ,true // Strict quotes @@ -637,8 +623,10 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase private void getDomainEnums(List result) { + final /* record */ class R { private final String schema; private final String name; private final String sql; public R(String schema, String name, String sql) { this.schema = schema; this.name = name; this.sql = sql; } public String schema() { return schema; } public String name() { return name; } public String sql() { return sql; } @Override public boolean equals(Object o) { if (!(o instanceof R)) return false; R other = (R) o; if (!java.util.Objects.equals(this.schema, other.schema)) return false; if (!java.util.Objects.equals(this.name, other.name)) return false; if (!java.util.Objects.equals(this.sql, other.sql)) return false; return true; } @Override public int hashCode() { return java.util.Objects.hash(this.schema, this.name, this.sql); } @Override public String toString() { return new StringBuilder("R[").append("schema=").append(this.schema).append(", name=").append(this.name).append(", sql=").append(this.sql).append("]").toString(); } } + enumLoop: - for (Record record : create() + for (R r : create() .select( DOMAINS.DOMAIN_SCHEMA, DOMAINS.DOMAIN_NAME, @@ -648,19 +636,17 @@ public class H2Database extends AbstractDatabase implements ResultQueryDatabase .and(DOMAINS.DOMAIN_SCHEMA.in(getInputSchemata())) .orderBy( DOMAINS.DOMAIN_SCHEMA, - DOMAINS.DOMAIN_NAME)) { + DOMAINS.DOMAIN_NAME) + .fetch(mapping(R::new))) { - SchemaDefinition schema = getSchema(record.get(DOMAINS.DOMAIN_SCHEMA)); + SchemaDefinition schema = getSchema(r.schema); if (schema == null) continue enumLoop; - String name = record.get(DOMAINS.DOMAIN_NAME); - String sql = record.get(DOMAINS.SQL); - - DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, name, ""); + DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, r.name, ""); CSVReader reader = new CSVReader( - new StringReader(sql.replaceAll("(?i:(^.*as enum\\()|(\\).*$))", "")) + new StringReader(r.sql.replaceAll("(?i:(^.*as enum\\()|(\\).*$))", "")) ,',' // Separator ,'\'' // Quote character ,true // Strict quotes diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java index 7306c5b567..dc7f19ac86 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/hsqldb/HSQLDBDatabase.java @@ -40,6 +40,7 @@ package org.jooq.meta.hsqldb; import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; +import static org.jooq.Records.mapping; import static org.jooq.impl.DSL.decode; import static org.jooq.impl.DSL.falseCondition; import static org.jooq.impl.DSL.field; @@ -78,6 +79,7 @@ import org.jooq.Field; import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record6; +import org.jooq.Records; import org.jooq.Result; import org.jooq.ResultQuery; import org.jooq.SQLDialect; @@ -385,10 +387,7 @@ public class HSQLDBDatabase extends AbstractDatabase implements ResultQueryDatab return create().select(SCHEMATA.SCHEMA_NAME) .from(SCHEMATA) - .collect(mapping( - r -> new SchemaDefinition(this, r.value1(), ""), - toList() - )); + .fetch(mapping(s -> new SchemaDefinition(this, s, ""))); } @Override diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java index 880d23eb47..f3649d3a2b 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/mysql/MySQLDatabase.java @@ -41,9 +41,9 @@ package org.jooq.meta.mysql; import static java.util.Arrays.asList; import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; +import static org.jooq.Records.mapping; import static org.jooq.SQLDialect.MYSQL; // ... -import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.noCondition; import static org.jooq.impl.DSL.row; @@ -75,6 +75,7 @@ import org.jooq.Record; import org.jooq.Record12; import org.jooq.Record5; import org.jooq.Record6; +import org.jooq.Records; import org.jooq.Result; import org.jooq.ResultQuery; import org.jooq.SQLDialect; @@ -458,55 +459,51 @@ public class MySQLDatabase extends AbstractDatabase implements ResultQueryDataba protected List getEnums0() throws SQLException { List result = new ArrayList<>(); - Result> records = create() - .select( - COLUMNS.TABLE_SCHEMA, - COLUMNS.COLUMN_COMMENT, - COLUMNS.TABLE_NAME, - COLUMNS.COLUMN_NAME, - COLUMNS.COLUMN_TYPE) - .from(COLUMNS) - .where( - COLUMNS.COLUMN_TYPE.like("enum(%)").and( - COLUMNS.TABLE_SCHEMA.in(workaroundFor5213(getInputSchemata())))) - .orderBy( - COLUMNS.TABLE_SCHEMA.asc(), - COLUMNS.TABLE_NAME.asc(), - COLUMNS.COLUMN_NAME.asc()) - .fetch(); + final /* record */ class R { private final String schema; private final String table; private final String column; private final String type; private final String comment; public R(String schema, String table, String column, String type, String comment) { this.schema = schema; this.table = table; this.column = column; this.type = type; this.comment = comment; } public String schema() { return schema; } public String table() { return table; } public String column() { return column; } public String type() { return type; } public String comment() { return comment; } @Override public boolean equals(Object o) { if (!(o instanceof R)) return false; R other = (R) o; if (!java.util.Objects.equals(this.schema, other.schema)) return false; if (!java.util.Objects.equals(this.table, other.table)) return false; if (!java.util.Objects.equals(this.column, other.column)) return false; if (!java.util.Objects.equals(this.type, other.type)) return false; if (!java.util.Objects.equals(this.comment, other.comment)) return false; return true; } @Override public int hashCode() { return java.util.Objects.hash(this.schema, this.table, this.column, this.type, this.comment); } @Override public String toString() { return new StringBuilder("R[").append("schema=").append(this.schema).append(", table=").append(this.table).append(", column=").append(this.column).append(", type=").append(this.type).append(", comment=").append(this.comment).append("]").toString(); } } - for (Record record : records) { - SchemaDefinition schema = getSchema(record.get(COLUMNS.TABLE_SCHEMA)); + for (R r : create() + .select( + COLUMNS.TABLE_SCHEMA, + COLUMNS.TABLE_NAME, + COLUMNS.COLUMN_NAME, + COLUMNS.COLUMN_TYPE, + COLUMNS.COLUMN_COMMENT) + .from(COLUMNS) + .where( + COLUMNS.COLUMN_TYPE.like("enum(%)").and( + COLUMNS.TABLE_SCHEMA.in(workaroundFor5213(getInputSchemata())))) + .orderBy( + COLUMNS.TABLE_SCHEMA.asc(), + COLUMNS.TABLE_NAME.asc(), + COLUMNS.COLUMN_NAME.asc()) + .fetch(mapping(R::new)) + ) { + SchemaDefinition schema = getSchema(r.schema); - String comment = record.get(COLUMNS.COLUMN_COMMENT); - String table = record.get(COLUMNS.TABLE_NAME); - String column = record.get(COLUMNS.COLUMN_NAME); - String name = table + "_" + column; - String columnType = record.get(COLUMNS.COLUMN_TYPE); + String name = r.table + "_" + r.column; // [#1237] Don't generate enum classes for columns in MySQL tables // that are excluded from code generation - TableDefinition tableDefinition = getTable(schema, table); + TableDefinition tableDefinition = getTable(schema, r.table); if (tableDefinition != null) { - ColumnDefinition columnDefinition = tableDefinition.getColumn(column); + ColumnDefinition columnDefinition = tableDefinition.getColumn(r.column); if (columnDefinition != null) { // [#1137] Avoid generating enum classes for enum types that // are explicitly forced to another type if (getConfiguredForcedType(columnDefinition, columnDefinition.getType()) == null) { - DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, name, comment); + DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, name, r.comment); CSVReader reader = new CSVReader( - new StringReader(columnType.replaceAll("(^enum\\()|(\\)$)", "")) + new StringReader(r.type.replaceAll("(^enum\\()|(\\)$)", "")) ,',' // Separator ,'\'' // Quote character ,true // Strict quotes ); - for (String string : reader.next()) { + for (String string : reader.next()) definition.addLiteral(string); - } result.add(definition); } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java index c18a74f4d7..2c0c2ef1cb 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/postgres/PostgresDatabase.java @@ -41,6 +41,7 @@ package org.jooq.meta.postgres; import static java.util.Arrays.asList; import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; +import static org.jooq.Records.mapping; import static org.jooq.Rows.toRowArray; import static org.jooq.SQLDialect.POSTGRES; // ... @@ -122,6 +123,7 @@ import org.jooq.Record12; import org.jooq.Record2; import org.jooq.Record5; import org.jooq.Record6; +import org.jooq.Records; import org.jooq.Result; import org.jooq.ResultQuery; import org.jooq.Rows; @@ -740,6 +742,8 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat return result; } + static final /* record */ class Identifier { private final String schema; private final String name; public Identifier(String schema, String name) { this.schema = schema; this.name = name; } public String schema() { return schema; } public String name() { return name; } @Override public boolean equals(Object o) { if (!(o instanceof Identifier)) return false; Identifier other = (Identifier) o; if (!java.util.Objects.equals(this.schema, other.schema)) return false; if (!java.util.Objects.equals(this.name, other.name)) return false; return true; } @Override public int hashCode() { return java.util.Objects.hash(this.schema, this.name); } @Override public String toString() { return new StringBuilder("Identifier[").append("schema=").append(this.schema).append(", name=").append(this.name).append("]").toString(); } } + @Override protected List getEnums0() throws SQLException { List result = new ArrayList<>(); @@ -750,26 +754,22 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat // [#2707] Fetch all enum type names first, in order to be able to // perform enumlabel::[typname] casts in the subsequent query for // cross-version compatible enum literal ordering - Result> types = create() - .select( - PG_TYPE.pgNamespace().NSPNAME, - PG_TYPE.TYPNAME) - .from(PG_TYPE) - .where(PG_TYPE.pgNamespace().NSPNAME.in(getInputSchemata())) - .and(oid(PG_TYPE).in(select(PG_ENUM.ENUMTYPID).from(PG_ENUM))) - .orderBy( - PG_TYPE.pgNamespace().NSPNAME, - PG_TYPE.TYPNAME) - .fetch(); - - for (Record2 type : types) { - String nspname = type.get(PG_TYPE.pgNamespace().NSPNAME); - String typname = type.get(PG_TYPE.TYPNAME); - + for (Identifier type : create() + .select( + PG_TYPE.pgNamespace().NSPNAME, + PG_TYPE.TYPNAME) + .from(PG_TYPE) + .where(PG_TYPE.pgNamespace().NSPNAME.in(getInputSchemata())) + .and(oid(PG_TYPE).in(select(PG_ENUM.ENUMTYPID).from(PG_ENUM))) + .orderBy( + PG_TYPE.pgNamespace().NSPNAME, + PG_TYPE.TYPNAME) + .fetch(mapping(Identifier::new))) { DefaultEnumDefinition definition = null; - for (String label : enumLabels(nspname, typname)) { - SchemaDefinition schema = getSchema(nspname); - String typeName = String.valueOf(typname); + + for (String label : enumLabels(type.schema, type.name)) { + SchemaDefinition schema = getSchema(type.schema); + String typeName = String.valueOf(type.name); if (definition == null || !definition.getName().equals(typeName)) { definition = new DefaultEnumDefinition(schema, typeName, null); @@ -894,7 +894,7 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat // [#2736] This table is unavailable in Amazon Redshift if (exists(ATTRIBUTES)) { - for (Record record : create() + for (Identifier udt : create() .selectDistinct( ATTRIBUTES.UDT_SCHEMA, ATTRIBUTES.UDT_NAME) @@ -903,12 +903,12 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat .orderBy( ATTRIBUTES.UDT_SCHEMA, ATTRIBUTES.UDT_NAME) - .fetch()) { + .fetch(mapping(Identifier::new))) { - SchemaDefinition schema = getSchema(record.get(ATTRIBUTES.UDT_SCHEMA)); - String name = record.get(ATTRIBUTES.UDT_NAME); + SchemaDefinition schema = getSchema(udt.schema); - result.add(new PostgresUDTDefinition(schema, name, null)); + if (schema != null) + result.add(new PostgresUDTDefinition(schema, udt.name, null)); } } @@ -1181,6 +1181,6 @@ public class PostgresDatabase extends AbstractDatabase implements ResultQueryDat .where(PG_ENUM.pgType().pgNamespace().NSPNAME.eq(nspname)) .and(PG_ENUM.pgType().TYPNAME.eq(typname)) .orderBy(orderBy) - .fetch(PG_ENUM.ENUMLABEL); + .collect(Records.toList()); } }