[jOOQ/jOOQ#11258] Reuse some FK copying logic

This commit is contained in:
Lukas Eder 2021-01-20 15:31:50 +01:00
parent a5f0733f06
commit 9347069bec
4 changed files with 20 additions and 19 deletions

View File

@ -65,6 +65,7 @@ import org.jooq.Record;
import org.jooq.Schema;
import org.jooq.Sequence;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.UniqueKey;
import org.jooq.util.xml.jaxb.InformationSchema;
@ -658,6 +659,22 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable
return lookupKey(table, fk.getKey());
}
@SuppressWarnings("unchecked")
final <R extends Record> ForeignKey<R, ?> copyFK(Table<R> fkTable, UniqueKey<?> uk, ForeignKey<R, ?> oldFk) {
Table<?> ukTable = uk.getTable();
TableField<R, ?>[] oldFkFields = oldFk.getFieldsArray();
TableField<R, ?>[] fkFields = new TableField[oldFkFields.length];
TableField<?, ?>[] ukfields = new TableField[oldFkFields.length];
for (int i = 0; i < oldFkFields.length; i++) {
fkFields[i] = (TableField<R, ?>) fkTable.field(oldFkFields[i]);
ukfields[i] = (TableField<?, ?>) ukTable.field(oldFkFields[i]);
}
return Internal.createForeignKey(fkTable, oldFk.getQualifiedName(), fkFields, uk, (TableField[]) ukfields, oldFk.enforced());
}
@Override
public int hashCode() {
return ddl().hashCode();

View File

@ -455,13 +455,7 @@ final class FilteredMeta extends AbstractMeta {
else if (!uk.isPrimary() && uniqueKeyFilter != null && !uniqueKeyFilter.test(uk))
continue fkLoop;
TableField<R, ?>[] fields1 = fk.getFieldsArray();
TableField<?, ?>[] fields2 = new TableField[fields1.length];
for (int i = 0; i < fields2.length; i++)
fields2[i] = (TableField<?, ?>) uk.getTable().field(fields1[i]);
references.add(Internal.createForeignKey(this, fk.getQualifiedName(), fields1, uk, (TableField[]) fields2, fk.enforced()));
references.add(copyFK(this, uk, fk));
}
}

View File

@ -226,6 +226,6 @@ final class ReferenceImpl<R extends Record, O extends Record> extends AbstractKe
final ConstraintEnforcementStep constraint0() {
return DSL.constraint(getName())
.foreignKey(getFieldsArray())
.references(uk.getTable(), uk.getFieldsArray());
.references(uk.getTable(), getKeyFieldsArray());
}
}

View File

@ -244,23 +244,13 @@ final class Snapshot extends AbstractMeta {
return result;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
final void resolveReferences() {
// TODO: Is there a better way than temporarily keeping the wrong
// ReferenceImpl in this list until we "know better"?
for (int i = 0; i < foreignKeys.size(); i++) {
ForeignKey<R, ?> fk = foreignKeys.get(i);
UniqueKey uk = lookupUniqueKey(fk);
foreignKeys.set(i, org.jooq.impl.Internal.createForeignKey(
this,
fk.getQualifiedName(),
fields(fk.getFieldsArray()),
uk,
fields(uk.getFieldsArray()),
fk.enforced()
));
foreignKeys.set(i, copyFK(this, lookupUniqueKey(fk), fk));
}
}