[jOOQ/jOOQ#10588] Apply synthetic keys to jOOQ-meta, use implicit joins

(WIP)
This commit is contained in:
Lukas Eder 2020-09-08 17:27:40 +02:00
parent a00eda2c02
commit 9fa6814779
7 changed files with 67 additions and 41 deletions

View File

@ -277,18 +277,14 @@ public class H2Database extends AbstractDatabase {
CROSS_REFERENCES.FKTABLE_SCHEMA,
CROSS_REFERENCES.FKCOLUMN_NAME,
CROSS_REFERENCES.PKCOLUMN_NAME,
CONSTRAINTS.CONSTRAINT_NAME,
CONSTRAINTS.TABLE_NAME,
CONSTRAINTS.CONSTRAINT_SCHEMA)
CROSS_REFERENCES.referencedConstraint().CONSTRAINT_NAME,
CROSS_REFERENCES.referencedConstraint().TABLE_NAME,
CROSS_REFERENCES.referencedConstraint().CONSTRAINT_SCHEMA)
.from(CROSS_REFERENCES)
.join(CONSTRAINTS)
.on(CROSS_REFERENCES.PK_NAME.equal(CONSTRAINTS.UNIQUE_INDEX_NAME))
.and(CROSS_REFERENCES.PKTABLE_NAME.equal(CONSTRAINTS.TABLE_NAME))
.and(CROSS_REFERENCES.PKTABLE_SCHEMA.equal(CONSTRAINTS.TABLE_SCHEMA))
.where(CROSS_REFERENCES.FKTABLE_SCHEMA.in(getInputSchemata()))
// Workaround for https://github.com/h2database/h2database/issues/1000
.and(CONSTRAINTS.CONSTRAINT_TYPE.in("PRIMARY KEY", "PRIMARY_KEY", "UNIQUE"))
.and(CROSS_REFERENCES.referencedConstraint().CONSTRAINT_TYPE.in("PRIMARY KEY", "PRIMARY_KEY", "UNIQUE"))
.orderBy(
CROSS_REFERENCES.FKTABLE_SCHEMA.asc(),
CROSS_REFERENCES.FK_NAME.asc(),
@ -296,14 +292,14 @@ public class H2Database extends AbstractDatabase {
.fetch()) {
SchemaDefinition foreignKeySchema = getSchema(record.get(CROSS_REFERENCES.FKTABLE_SCHEMA));
SchemaDefinition uniqueKeySchema = getSchema(record.get(CONSTRAINTS.CONSTRAINT_SCHEMA));
SchemaDefinition uniqueKeySchema = getSchema(record.get(CROSS_REFERENCES.referencedConstraint().CONSTRAINT_SCHEMA));
if (foreignKeySchema != null && uniqueKeySchema != null) {
String foreignKey = record.get(CROSS_REFERENCES.FK_NAME);
String foreignKeyTableName = record.get(CROSS_REFERENCES.FKTABLE_NAME);
String foreignKeyColumn = record.get(CROSS_REFERENCES.FKCOLUMN_NAME);
String uniqueKey = record.get(CONSTRAINTS.CONSTRAINT_NAME);
String uniqueKeyTableName = record.get(CONSTRAINTS.TABLE_NAME);
String uniqueKey = record.get(CROSS_REFERENCES.referencedConstraint().CONSTRAINT_NAME);
String uniqueKeyTableName = record.get(CROSS_REFERENCES.referencedConstraint().TABLE_NAME);
String uniqueKeyColumn = record.get(CROSS_REFERENCES.PKCOLUMN_NAME);
TableDefinition foreignKeyTable = getTable(foreignKeySchema, foreignKeyTableName);

View File

@ -10,10 +10,12 @@ import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.impl.DSL;
import org.jooq.impl.Internal;
import org.jooq.meta.h2.information_schema.tables.Constraints;
import org.jooq.meta.h2.information_schema.tables.CrossReferences;
import org.jooq.meta.h2.information_schema.tables.Domains;
import org.jooq.meta.h2.information_schema.tables.Schemata;
import org.jooq.meta.h2.information_schema.tables.Sequences;
import org.jooq.meta.h2.information_schema.tables.Tables;
import org.jooq.meta.h2.information_schema.tables.Views;
/**
@ -27,6 +29,9 @@ public class Keys {
// UNIQUE and PRIMARY KEY definitions
// -------------------------------------------------------------------------
public static final UniqueKey<Record> SYNTHETIC_PK_CONSTRAINTS = Internal.createUniqueKey(Constraints.CONSTRAINTS, DSL.name("SYNTHETIC_PK_CONSTRAINTS"), new TableField[] { Constraints.CONSTRAINTS.CONSTRAINT_CATALOG, Constraints.CONSTRAINTS.CONSTRAINT_SCHEMA, Constraints.CONSTRAINTS.CONSTRAINT_NAME }, true);
public static final UniqueKey<Record> UNIQUE_INDEX_NAME = Internal.createUniqueKey(Constraints.CONSTRAINTS, DSL.name("UNIQUE_INDEX_NAME"), new TableField[] { Constraints.CONSTRAINTS.TABLE_CATALOG, Constraints.CONSTRAINTS.TABLE_SCHEMA, Constraints.CONSTRAINTS.UNIQUE_INDEX_NAME }, true);
public static final UniqueKey<Record> SYNTHETIC_PK_DOMAINS = Internal.createUniqueKey(Domains.DOMAINS, DSL.name("SYNTHETIC_PK_DOMAINS"), new TableField[] { Domains.DOMAINS.DOMAIN_CATALOG, Domains.DOMAINS.DOMAIN_SCHEMA, Domains.DOMAINS.DOMAIN_NAME }, true);
public static final UniqueKey<Record> SYNTHETIC_PK_SCHEMATA = Internal.createUniqueKey(Schemata.SCHEMATA, DSL.name("SYNTHETIC_PK_SCHEMATA"), new TableField[] { Schemata.SCHEMATA.CATALOG_NAME, Schemata.SCHEMATA.SCHEMA_NAME }, true);
public static final UniqueKey<Record> SYNTHETIC_PK_SEQUENCES = Internal.createUniqueKey(Sequences.SEQUENCES, DSL.name("SYNTHETIC_PK_SEQUENCES"), new TableField[] { Sequences.SEQUENCES.SEQUENCE_CATALOG, Sequences.SEQUENCES.SEQUENCE_SCHEMA, Sequences.SEQUENCES.SEQUENCE_NAME }, true);
public static final UniqueKey<Record> SYNTHETIC_PK_TABLES = Internal.createUniqueKey(Tables.TABLES, DSL.name("SYNTHETIC_PK_TABLES"), new TableField[] { Tables.TABLES.TABLE_CATALOG, Tables.TABLES.TABLE_SCHEMA, Tables.TABLES.TABLE_NAME }, true);
@ -35,6 +40,6 @@ public class Keys {
// FOREIGN KEY definitions
// -------------------------------------------------------------------------
public static final ForeignKey<Record, Record> SYNTHETIC_FK_SEQUENCES__SYNTHETIC_PK_SCHEMATA = Internal.createForeignKey(Sequences.SEQUENCES, DSL.name("SYNTHETIC_FK_SEQUENCES__SYNTHETIC_PK_SCHEMATA"), new TableField[] { Sequences.SEQUENCES.SEQUENCE_CATALOG, Sequences.SEQUENCES.SEQUENCE_SCHEMA }, Keys.SYNTHETIC_PK_SCHEMATA, new TableField[] { Schemata.SCHEMATA.CATALOG_NAME, Schemata.SCHEMATA.SCHEMA_NAME }, true);
public static final ForeignKey<Record, Record> SYNTHETIC_FK_VIEWS__SYNTHETIC_PK_TABLES = Internal.createForeignKey(Views.VIEWS, DSL.name("SYNTHETIC_FK_VIEWS__SYNTHETIC_PK_TABLES"), new TableField[] { Views.VIEWS.TABLE_CATALOG, Views.VIEWS.TABLE_SCHEMA, Views.VIEWS.TABLE_NAME }, Keys.SYNTHETIC_PK_TABLES, new TableField[] { Tables.TABLES.TABLE_CATALOG, Tables.TABLES.TABLE_SCHEMA, Tables.TABLES.TABLE_NAME }, true);
public static final ForeignKey<Record, Record> REFERENCED_CONSTRAINT = Internal.createForeignKey(CrossReferences.CROSS_REFERENCES, DSL.name("REFERENCED_CONSTRAINT"), new TableField[] { CrossReferences.CROSS_REFERENCES.PKTABLE_CATALOG, CrossReferences.CROSS_REFERENCES.PKTABLE_SCHEMA, CrossReferences.CROSS_REFERENCES.PK_NAME }, Keys.UNIQUE_INDEX_NAME, new TableField[] { Constraints.CONSTRAINTS.TABLE_CATALOG, Constraints.CONSTRAINTS.TABLE_SCHEMA, Constraints.CONSTRAINTS.UNIQUE_INDEX_NAME }, true);
public static final ForeignKey<Record, Record> REFERENCING_CONSTRAINT = Internal.createForeignKey(CrossReferences.CROSS_REFERENCES, DSL.name("REFERENCING_CONSTRAINT"), new TableField[] { CrossReferences.CROSS_REFERENCES.FKTABLE_CATALOG, CrossReferences.CROSS_REFERENCES.FKTABLE_SCHEMA, CrossReferences.CROSS_REFERENCES.FK_NAME }, Keys.SYNTHETIC_PK_CONSTRAINTS, new TableField[] { Constraints.CONSTRAINTS.CONSTRAINT_CATALOG, Constraints.CONSTRAINTS.CONSTRAINT_SCHEMA, Constraints.CONSTRAINTS.CONSTRAINT_NAME }, true);
}

View File

@ -4,6 +4,9 @@
package org.jooq.meta.h2.information_schema.tables;
import java.util.Arrays;
import java.util.List;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Name;
@ -12,10 +15,12 @@ import org.jooq.Schema;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.TableOptions;
import org.jooq.UniqueKey;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
import org.jooq.meta.h2.information_schema.InformationSchema;
import org.jooq.meta.h2.information_schema.Keys;
/**
@ -24,7 +29,7 @@ import org.jooq.meta.h2.information_schema.InformationSchema;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Constraints extends TableImpl<Record> {
private static final long serialVersionUID = -1874744305;
private static final long serialVersionUID = 1109555495;
/**
* The reference instance of <code>INFORMATION_SCHEMA.CONSTRAINTS</code>
@ -142,6 +147,16 @@ public class Constraints extends TableImpl<Record> {
return InformationSchema.INFORMATION_SCHEMA;
}
@Override
public UniqueKey<Record> getPrimaryKey() {
return Keys.SYNTHETIC_PK_CONSTRAINTS;
}
@Override
public List<UniqueKey<Record>> getKeys() {
return Arrays.<UniqueKey<Record>>asList(Keys.SYNTHETIC_PK_CONSTRAINTS, Keys.UNIQUE_INDEX_NAME);
}
@Override
public Constraints as(String alias) {
return new Constraints(DSL.name(alias), this);

View File

@ -4,6 +4,9 @@
package org.jooq.meta.h2.information_schema.tables;
import java.util.Arrays;
import java.util.List;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Name;
@ -16,6 +19,7 @@ import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
import org.jooq.meta.h2.information_schema.InformationSchema;
import org.jooq.meta.h2.information_schema.Keys;
/**
@ -24,7 +28,7 @@ import org.jooq.meta.h2.information_schema.InformationSchema;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class CrossReferences extends TableImpl<Record> {
private static final long serialVersionUID = 1748978946;
private static final long serialVersionUID = 917541835;
/**
* The reference instance of <code>INFORMATION_SCHEMA.CROSS_REFERENCES</code>
@ -147,6 +151,19 @@ public class CrossReferences extends TableImpl<Record> {
return InformationSchema.INFORMATION_SCHEMA;
}
@Override
public List<ForeignKey<Record, ?>> getReferences() {
return Arrays.<ForeignKey<Record, ?>>asList(Keys.REFERENCED_CONSTRAINT, Keys.REFERENCING_CONSTRAINT);
}
public Constraints referencedConstraint() {
return new Constraints(this, Keys.REFERENCED_CONSTRAINT);
}
public Constraints referencingConstraint() {
return new Constraints(this, Keys.REFERENCING_CONSTRAINT);
}
@Override
public CrossReferences as(String alias) {
return new CrossReferences(DSL.name(alias), this);

View File

@ -4,6 +4,9 @@
package org.jooq.meta.h2.information_schema.tables;
import java.util.Arrays;
import java.util.List;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Name;
@ -12,10 +15,12 @@ import org.jooq.Schema;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.TableOptions;
import org.jooq.UniqueKey;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
import org.jooq.meta.h2.information_schema.InformationSchema;
import org.jooq.meta.h2.information_schema.Keys;
/**
@ -24,7 +29,7 @@ import org.jooq.meta.h2.information_schema.InformationSchema;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Domains extends TableImpl<Record> {
private static final long serialVersionUID = 942942537;
private static final long serialVersionUID = -280782399;
/**
* The reference instance of <code>INFORMATION_SCHEMA.DOMAINS</code>
@ -147,6 +152,16 @@ public class Domains extends TableImpl<Record> {
return InformationSchema.INFORMATION_SCHEMA;
}
@Override
public UniqueKey<Record> getPrimaryKey() {
return Keys.SYNTHETIC_PK_DOMAINS;
}
@Override
public List<UniqueKey<Record>> getKeys() {
return Arrays.<UniqueKey<Record>>asList(Keys.SYNTHETIC_PK_DOMAINS);
}
@Override
public Domains as(String alias) {
return new Domains(DSL.name(alias), this);

View File

@ -29,7 +29,7 @@ import org.jooq.meta.h2.information_schema.Keys;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Sequences extends TableImpl<Record> {
private static final long serialVersionUID = 585173913;
private static final long serialVersionUID = 1626961889;
/**
* The reference instance of <code>INFORMATION_SCHEMA.SEQUENCES</code>
@ -152,15 +152,6 @@ public class Sequences extends TableImpl<Record> {
return Arrays.<UniqueKey<Record>>asList(Keys.SYNTHETIC_PK_SEQUENCES);
}
@Override
public List<ForeignKey<Record, ?>> getReferences() {
return Arrays.<ForeignKey<Record, ?>>asList(Keys.SYNTHETIC_FK_SEQUENCES__SYNTHETIC_PK_SCHEMATA);
}
public Schemata schemata() {
return new Schemata(this, Keys.SYNTHETIC_FK_SEQUENCES__SYNTHETIC_PK_SCHEMATA);
}
@Override
public Sequences as(String alias) {
return new Sequences(DSL.name(alias), this);

View File

@ -4,9 +4,6 @@
package org.jooq.meta.h2.information_schema.tables;
import java.util.Arrays;
import java.util.List;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Name;
@ -19,7 +16,6 @@ import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
import org.jooq.meta.h2.information_schema.InformationSchema;
import org.jooq.meta.h2.information_schema.Keys;
/**
@ -28,7 +24,7 @@ import org.jooq.meta.h2.information_schema.Keys;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Views extends TableImpl<Record> {
private static final long serialVersionUID = -517611495;
private static final long serialVersionUID = 870568262;
/**
* The reference instance of <code>INFORMATION_SCHEMA.VIEWS</code>
@ -126,15 +122,6 @@ public class Views extends TableImpl<Record> {
return InformationSchema.INFORMATION_SCHEMA;
}
@Override
public List<ForeignKey<Record, ?>> getReferences() {
return Arrays.<ForeignKey<Record, ?>>asList(Keys.SYNTHETIC_FK_VIEWS__SYNTHETIC_PK_TABLES);
}
public Tables tables() {
return new Tables(this, Keys.SYNTHETIC_FK_VIEWS__SYNTHETIC_PK_TABLES);
}
@Override
public Views as(String alias) {
return new Views(DSL.name(alias), this);