[jOOQ/jOOQ#8528] Interpret ALTER TABLE .. ADD FOREIGN KEY

This commit is contained in:
Lukas Eder 2019-10-15 16:05:55 +02:00
parent 3db42010ef
commit ec3a19fcd6

View File

@ -229,37 +229,14 @@ final class DDLInterpreter {
for (Constraint constraint : query.$constraints()) {
ConstraintImpl impl = (ConstraintImpl) constraint;
if (impl.$primaryKey() != null) {
if (impl.$primaryKey() != null)
mt.primaryKey = new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), mt, mt.fields(impl.$primaryKey(), true));
}
else if (impl.$unique() != null) {
else if (impl.$unique() != null)
mt.uniqueKeys.add(new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), mt, mt.fields(impl.$unique(), true)));
}
else if (impl.$foreignKey() != null) {
MutableTable mrf = schema.table(impl.$referencesTable());
MutableUniqueKey mu = null;
if (mrf == null)
throw tableNotExists(impl.$referencesTable());
List<MutableField> mfs = mt.fields(impl.$foreignKey(), true);
List<MutableField> mrfs = mrf.fields(impl.$references(), true);
if (!mrfs.isEmpty())
mu = mrf.uniqueKey(mrfs);
else if (mrf.primaryKey != null && mrf.primaryKey.keyFields.size() == mfs.size())
mu = mrf.primaryKey;
if (mu == null)
throw primaryKeyNotExists();
mt.foreignkeys.add(new MutableForeignKey(
(UnqualifiedName) impl.getUnqualifiedName(), mt, mfs, mu, impl.$onDelete(), impl.$onUpdate()
));
}
else {
else if (impl.$foreignKey() != null)
addForeignKey(schema, mt, impl);
else
throw unsupportedQuery(query);
}
}
for (Index index : query.$indexes()) {
@ -268,6 +245,29 @@ final class DDLInterpreter {
}
}
private final void addForeignKey(MutableSchema schema, MutableTable mt, ConstraintImpl impl) {
MutableTable mrf = schema.table(impl.$referencesTable());
MutableUniqueKey mu = null;
if (mrf == null)
throw tableNotExists(impl.$referencesTable());
List<MutableField> mfs = mt.fields(impl.$foreignKey(), true);
List<MutableField> mrfs = mrf.fields(impl.$references(), true);
if (!mrfs.isEmpty())
mu = mrf.uniqueKey(mrfs);
else if (mrf.primaryKey != null && mrf.primaryKey.keyFields.size() == mfs.size())
mu = mrf.primaryKey;
if (mu == null)
throw primaryKeyNotExists();
mt.foreignkeys.add(new MutableForeignKey(
(UnqualifiedName) impl.getUnqualifiedName(), mt, mfs, mu, impl.$onDelete(), impl.$onUpdate()
));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private final void accept0(AlterTableImpl query) {
Table<?> table = query.$table();
@ -325,6 +325,8 @@ final class DDLInterpreter {
existing.primaryKey = new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$primaryKey(), true));
else if (impl.$unique() != null)
existing.uniqueKeys.add(new MutableUniqueKey((UnqualifiedName) impl.getUnqualifiedName(), existing, existing.fields(impl.$unique(), true)));
else if (impl.$foreignKey() != null)
addForeignKey(schema, existing, impl);
else
throw unsupportedQuery(query);
}