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 425133a4a4..802a900f58 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -90,7 +90,6 @@ import org.jooq.Domain; import org.jooq.EnumType; import org.jooq.Field; import org.jooq.ForeignKey; -import org.jooq.Identity; import org.jooq.Index; // ... import org.jooq.Name; @@ -141,7 +140,6 @@ import org.jooq.meta.EmbeddableColumnDefinition; import org.jooq.meta.EmbeddableDefinition; import org.jooq.meta.EnumDefinition; import org.jooq.meta.ForeignKeyDefinition; -import org.jooq.meta.IdentityDefinition; import org.jooq.meta.IndexColumnDefinition; import org.jooq.meta.IndexDefinition; import org.jooq.meta.JavaTypeResolver; @@ -750,42 +748,9 @@ public class JavaGenerator extends AbstractGenerator { else out.println("public class Keys {"); - List allIdentities = new ArrayList<>(); List allUniqueKeys = new ArrayList<>(); List allForeignKeys = new ArrayList<>(); - out.header("IDENTITY definitions"); - out.println(); - - for (TableDefinition table : database.getTables(schema)) { - try { - IdentityDefinition identity = table.getIdentity(); - - if (identity != null) { - empty = false; - - final String identityType = out.ref(getStrategy().getFullJavaClassName(identity.getColumn().getContainer(), Mode.RECORD)); - final String columnTypeFull = getJavaType(identity.getColumn().getType(resolver())); - final String columnType = out.ref(columnTypeFull); - final String identityId = getStrategy().getJavaIdentifier(identity.getColumn().getContainer()); - final int block = allIdentities.size() / INITIALISER_SIZE; - - printDeprecationIfUnknownType(out, columnTypeFull); - if (scala || kotlin) - out.println("val IDENTITY_%s = Identities%s.IDENTITY_%s", - identityId, block, identityId); - else - out.println("public static final %s<%s, %s> IDENTITY_%s = Identities%s.IDENTITY_%s;", - Identity.class, identityType, columnType, identityId, block, identityId); - - allIdentities.add(identity); - } - } - catch (Exception e) { - log.error("Error while generating table " + table, e); - } - } - // Unique keys out.header("UNIQUE and PRIMARY KEY definitions"); out.println(); @@ -845,23 +810,11 @@ public class JavaGenerator extends AbstractGenerator { // [#1459] Print nested classes for actual static field initialisations // keeping top-level initialiser small - int identityCounter = 0; int uniqueKeyCounter = 0; int foreignKeyCounter = 0; out.header("[#1459] distribute members to avoid static initialisers > 64kb"); - // Identities - // ---------- - - for (IdentityDefinition identity : allIdentities) { - printIdentity(out, identityCounter, identity); - identityCounter++; - } - - if (identityCounter > 0) - out.println("}"); - // UniqueKeys // ---------- @@ -1040,59 +993,6 @@ public class JavaGenerator extends AbstractGenerator { ); } - protected void printIdentity(JavaWriter out, int identityCounter, IdentityDefinition identity) { - final int block = identityCounter / INITIALISER_SIZE; - final String identityTypeFull = getJavaType(identity.getColumn().getType(resolver())); - final String identityType = out.ref(identityTypeFull); - - // Print new nested class - if (identityCounter % INITIALISER_SIZE == 0) { - if (identityCounter > 0) - out.println("}"); - - out.println(); - - if (scala || kotlin) - out.println("private object Identities%s {", block); - else - out.println("private static class Identities%s {", block); - } - - printDeprecationIfUnknownType(out, identityTypeFull); - if (scala) - out.print("val %s: %s[%s, %s] = ", - getStrategy().getJavaIdentifier(identity), - Identity.class, - out.ref(getStrategy().getFullJavaClassName(identity.getTable(), Mode.RECORD)), - identityType); - else if (kotlin) - out.print("val %s: %s<%s, %s?> = ", - getStrategy().getJavaIdentifier(identity), - Identity.class, - out.ref(getStrategy().getFullJavaClassName(identity.getTable(), Mode.RECORD)), - identityType); - else - out.print("static final %s<%s, %s> %s = ", - Identity.class, - out.ref(getStrategy().getFullJavaClassName(identity.getTable(), Mode.RECORD)), - identityType, - getStrategy().getJavaIdentifier(identity)); - - printCreateIdentity(out, identity); - - if (scala || kotlin) - out.println(); - else - out.println(";"); - } - - private void printCreateIdentity(JavaWriter out, IdentityDefinition identity) { - out.print("%s.createIdentity(%s, %s)", - Internal.class, - out.ref(getStrategy().getFullJavaIdentifier(identity.getColumn().getContainer()), 2), - out.ref(getStrategy().getFullJavaIdentifier(identity.getColumn()), colRefSegments(identity.getColumn()))); - } - protected void printUniqueKey(JavaWriter out, int uniqueKeyCounter, UniqueKeyDefinition uniqueKey) { final int block = uniqueKeyCounter / INITIALISER_SIZE; @@ -4620,58 +4520,6 @@ public class JavaGenerator extends AbstractGenerator { // Add primary / unique / foreign key information if (generateRelations()) { - IdentityDefinition identity = table.getIdentity(); - - // The identity column - if (identity != null) { - final String identityTypeFull = getJavaType(identity.getColumn().getType(resolver())); - final String identityType = out.ref(identityTypeFull); - final String identityFullId = generateGlobalKeyReferences() - ? out.ref(getStrategy().getFullJavaIdentifier(identity), 2) - : null; - - if (scala) { - out.println(); - - printDeprecationIfUnknownType(out, identityTypeFull); - out.print("override def getIdentity: %s[%s, %s] = ", Identity.class, recordType, identityType); - - if (identityFullId != null) - out.print("%s", identityFullId); - else - printCreateIdentity(out, identity); - - out.println(); - } - else if (kotlin) { - printDeprecationIfUnknownType(out, identityTypeFull); - out.print("override fun getIdentity(): %s<%s, %s?> = ", Identity.class, recordType, identityType); - - if (identityFullId != null) - out.print("%s", identityFullId); - else - printCreateIdentity(out, identity); - - out.println(); - } - else { - if (printDeprecationIfUnknownType(out, identityTypeFull)) - out.override(); - else - out.overrideInherit(); - - out.println("public %s<%s, %s> getIdentity() {", Identity.class, recordType, identityType); - out.print("return "); - - if (identityFullId != null) - out.print("%s", identityFullId); - else - printCreateIdentity(out, identity); - - out.println(";"); - out.println("}"); - } - } // The primary / main unique key if (primaryKey != null) { diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 6553ec8077..98fe2e3610 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -113,6 +113,7 @@ import org.jooq.TablePartitionByStep; import org.jooq.UniqueKey; // ... // ... +import org.jooq.tools.JooqLogger; /** * @author Lukas Eder @@ -122,12 +123,14 @@ abstract class AbstractTable extends AbstractNamed implements /** * Generated UID */ - private static final long serialVersionUID = 3155496238969274871L; - private static final Clause[] CLAUSES = { TABLE }; + private static final JooqLogger log = JooqLogger.getLogger(AbstractTable.class); + private static final long serialVersionUID = 3155496238969274871L; + private static final Clause[] CLAUSES = { TABLE }; - private final TableOptions options; - private Schema tableschema; - private transient DataType tabletype; + private final TableOptions options; + private Schema tableschema; + private transient DataType tabletype; + private transient Identity identity; AbstractTable(TableOptions options, Name name) { this(options, name, null, null); @@ -444,9 +447,22 @@ abstract class AbstractTable extends AbstractNamed implements *

* Subclasses should override this method */ + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Identity getIdentity() { - return null; + if (identity == null) { + for (Field f : fields()) + if (f instanceof TableField && f.getDataType().identity()) + if (identity == null) + identity = new IdentityImpl(this, (TableField) f); + else + log.info("Multiple identities", "There are multiple identity fields in table " + this + ", which is not supported by jOOQ"); + + if (identity == null) + identity = (Identity) IdentityImpl.NULL; + } + + return identity == IdentityImpl.NULL ? null : identity; } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java index f410c13428..90a7e0d9f7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java @@ -46,7 +46,6 @@ import org.jooq.Check; import org.jooq.Domain; import org.jooq.Field; import org.jooq.ForeignKey; -import org.jooq.Identity; import org.jooq.Index; import org.jooq.Meta; import org.jooq.QueryPart; @@ -321,7 +320,6 @@ final class FilteredMeta extends AbstractMeta { private transient List indexes; private transient List> keys; private transient UniqueKey primaryKey; - private transient Identity identity; private transient List> references; private FilteredTable(FilteredSchema schema, Table delegate) { @@ -347,7 +345,6 @@ final class FilteredMeta extends AbstractMeta { } @Override - @SuppressWarnings("unchecked") public final List> getKeys() { if (keys == null) { keys = new ArrayList<>(); @@ -359,10 +356,6 @@ final class FilteredMeta extends AbstractMeta { if (pk != null) if (primaryKeyFilter == null || primaryKeyFilter.test(pk)) primaryKey = key(pk); - - Identity id = delegate.getIdentity(); - if (id != null) - identity = Internal.createIdentity(this, (TableField) field(id.getField())); } return Collections.unmodifiableList(keys); @@ -411,12 +404,6 @@ final class FilteredMeta extends AbstractMeta { return Collections.unmodifiableList(references); } - @Override - public final Identity getIdentity() { - getKeys(); - return identity; - } - @Override public final List> getChecks() { return delegate.getChecks(); diff --git a/jOOQ/src/main/java/org/jooq/impl/IdentityImpl.java b/jOOQ/src/main/java/org/jooq/impl/IdentityImpl.java index b5ab9ee8e8..fb026b3dec 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IdentityImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/IdentityImpl.java @@ -50,10 +50,11 @@ final class IdentityImpl implements Identity { /** * Generated UID */ - private static final long serialVersionUID = 162853300137140844L; + private static final long serialVersionUID = 162853300137140844L; + static final IdentityImpl NULL = new IdentityImpl<>(null, null); - private final Table table; - private final TableField field; + private final Table table; + private final TableField field; IdentityImpl(Table table, TableField field) { this.table = table; diff --git a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java index 0a93ea2bd0..6f977cd8f7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MetaImpl.java @@ -76,7 +76,6 @@ import org.jooq.ConstraintEnforcementStep; import org.jooq.DataType; import org.jooq.Field; import org.jooq.ForeignKey; -import org.jooq.Identity; import org.jooq.Index; import org.jooq.Meta; import org.jooq.Name; @@ -546,16 +545,6 @@ final class MetaImpl extends AbstractMeta { init(columns); } - @SuppressWarnings("unchecked") - @Override - public Identity getIdentity() { - for (Field field : fields()) - if (field.getDataType().identity()) - return new IdentityImpl<>(this, (TableField) field); - - return null; - } - @Override public final List getIndexes() { final String schema = getSchema() == null ? null : getSchema().getName(); diff --git a/jOOQ/src/main/java/org/jooq/impl/MigrationImpl.java b/jOOQ/src/main/java/org/jooq/impl/MigrationImpl.java index abd284d895..13a86947cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MigrationImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MigrationImpl.java @@ -62,7 +62,6 @@ import org.jooq.Configuration; import org.jooq.Constants; import org.jooq.ContextTransactionalRunnable; import org.jooq.Field; -import org.jooq.Identity; import org.jooq.Meta; import org.jooq.Migration; import org.jooq.MigrationListener; @@ -518,11 +517,6 @@ final class MigrationImpl extends AbstractScope implements Migration { super(alias, null, aliased, parameters, DSL.comment("The migration log of jOOQ Migrations.")); } - @Override - public Identity getIdentity() { - return Internal.createIdentity(JOOQ_MIGRATIONS_CHANGELOG, JOOQ_MIGRATIONS_CHANGELOG.ID); - } - @Override public UniqueKey getPrimaryKey() { return Internal.createUniqueKey(JOOQ_MIGRATIONS_CHANGELOG, "JOOQ_MIGRATIONS_CHANGELOG_PK", JOOQ_MIGRATIONS_CHANGELOG.ID); diff --git a/jOOQ/src/main/java/org/jooq/impl/Snapshot.java b/jOOQ/src/main/java/org/jooq/impl/Snapshot.java index cfb320792e..457b336691 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Snapshot.java +++ b/jOOQ/src/main/java/org/jooq/impl/Snapshot.java @@ -48,7 +48,6 @@ import org.jooq.Check; import org.jooq.Domain; import org.jooq.Field; import org.jooq.ForeignKey; -import org.jooq.Identity; import org.jooq.Index; import org.jooq.Meta; import org.jooq.Record; @@ -189,7 +188,6 @@ final class Snapshot extends AbstractMeta { private UniqueKey primaryKey; private final List> foreignKeys; private final List> checks; - private Identity identity; SnapshotTable(SnapshotSchema schema, Table table) { super(table.getQualifiedName(), schema, null, null, table.getCommentPart(), table.getOptions()); @@ -199,12 +197,8 @@ final class Snapshot extends AbstractMeta { foreignKeys = new ArrayList<>(); checks = new ArrayList<>(); - for (Field field : table.fields()) { - TableField f = createField(field.getUnqualifiedName(), field.getDataType(), this, field.getComment()); - - if (field.getDataType().identity() && identity == null) - identity = Internal.createIdentity(this, f); - } + for (Field field : table.fields()) + createField(field.getUnqualifiedName(), field.getDataType(), this, field.getComment()); for (Index index : table.getIndexes()) { List> indexFields = index.getFields(); @@ -289,11 +283,6 @@ final class Snapshot extends AbstractMeta { public final List> getChecks() { return Collections.unmodifiableList(checks); } - - @Override - public final Identity getIdentity() { - return identity; - } } private class SnapshotSequence extends SequenceImpl { diff --git a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java index 831548a209..cc49f36b01 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableAlias.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableAlias.java @@ -45,7 +45,6 @@ import org.jooq.Clause; import org.jooq.Context; import org.jooq.Field; import org.jooq.ForeignKey; -import org.jooq.Identity; import org.jooq.Name; import org.jooq.Record; import org.jooq.Row; @@ -113,11 +112,6 @@ final class TableAlias extends AbstractTable { return null; } - @Override - public final Identity getIdentity() { - return alias.wrapped().getIdentity(); - } - @Override public final UniqueKey getPrimaryKey() { return alias.wrapped().getPrimaryKey();