[jOOQ/jOOQ#10397] Default implementation of AbstractTable.getIdentity() should check Table.fields() for any Field with DataType.identity()

This commit is contained in:
Lukas Eder 2020-07-15 11:58:36 +02:00
parent a1d3d20d0c
commit 12e20eb413
8 changed files with 28 additions and 210 deletions

View File

@ -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<IdentityDefinition> allIdentities = new ArrayList<>();
List<UniqueKeyDefinition> allUniqueKeys = new ArrayList<>();
List<ForeignKeyDefinition> 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) {

View File

@ -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<R extends Record> 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<R> tabletype;
private final TableOptions options;
private Schema tableschema;
private transient DataType<R> tabletype;
private transient Identity<R, ?> identity;
AbstractTable(TableOptions options, Name name) {
this(options, name, null, null);
@ -444,9 +447,22 @@ abstract class AbstractTable<R extends Record> extends AbstractNamed implements
* <p>
* Subclasses should override this method
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Identity<R, ?> 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<R, ?>) IdentityImpl.NULL;
}
return identity == IdentityImpl.NULL ? null : identity;
}
/**

View File

@ -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<Index> indexes;
private transient List<UniqueKey<R>> keys;
private transient UniqueKey<R> primaryKey;
private transient Identity<R, ?> identity;
private transient List<ForeignKey<R, ?>> references;
private FilteredTable(FilteredSchema schema, Table<R> delegate) {
@ -347,7 +345,6 @@ final class FilteredMeta extends AbstractMeta {
}
@Override
@SuppressWarnings("unchecked")
public final List<UniqueKey<R>> 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<R, ?> id = delegate.getIdentity();
if (id != null)
identity = Internal.createIdentity(this, (TableField<R, Object>) field(id.getField()));
}
return Collections.unmodifiableList(keys);
@ -411,12 +404,6 @@ final class FilteredMeta extends AbstractMeta {
return Collections.unmodifiableList(references);
}
@Override
public final Identity<R, ?> getIdentity() {
getKeys();
return identity;
}
@Override
public final List<Check<R>> getChecks() {
return delegate.getChecks();

View File

@ -50,10 +50,11 @@ final class IdentityImpl<R extends Record, T> implements Identity<R, T> {
/**
* 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<R> table;
private final TableField<R, T> field;
private final Table<R> table;
private final TableField<R, T> field;
IdentityImpl(Table<R> table, TableField<R, T> field) {
this.table = table;

View File

@ -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<Record, ?> getIdentity() {
for (Field<?> field : fields())
if (field.getDataType().identity())
return new IdentityImpl<>(this, (TableField<Record, ?>) field);
return null;
}
@Override
public final List<Index> getIndexes() {
final String schema = getSchema() == null ? null : getSchema().getName();

View File

@ -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<JooqMigrationsChangelogRecord, Long> getIdentity() {
return Internal.createIdentity(JOOQ_MIGRATIONS_CHANGELOG, JOOQ_MIGRATIONS_CHANGELOG.ID);
}
@Override
public UniqueKey<JooqMigrationsChangelogRecord> getPrimaryKey() {
return Internal.createUniqueKey(JOOQ_MIGRATIONS_CHANGELOG, "JOOQ_MIGRATIONS_CHANGELOG_PK", JOOQ_MIGRATIONS_CHANGELOG.ID);

View File

@ -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<R> primaryKey;
private final List<ForeignKey<R, ?>> foreignKeys;
private final List<Check<R>> checks;
private Identity<R, ?> identity;
SnapshotTable(SnapshotSchema schema, Table<R> 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<R, ?> 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<SortField<?>> indexFields = index.getFields();
@ -289,11 +283,6 @@ final class Snapshot extends AbstractMeta {
public final List<Check<R>> getChecks() {
return Collections.unmodifiableList(checks);
}
@Override
public final Identity<R, ?> getIdentity() {
return identity;
}
}
private class SnapshotSequence<T extends Number> extends SequenceImpl<T> {

View File

@ -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<R extends Record> extends AbstractTable<R> {
return null;
}
@Override
public final Identity<R, ?> getIdentity() {
return alias.wrapped().getIdentity();
}
@Override
public final UniqueKey<R> getPrimaryKey() {
return alias.wrapped().getPrimaryKey();