[jOOQ/jOOQ#10397] Default implementation of AbstractTable.getIdentity() should check Table.fields() for any Field with DataType.identity()
This commit is contained in:
parent
a1d3d20d0c
commit
12e20eb413
@ -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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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> {
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user