From ff6b6dd204838ece4570dbbcc45ee4eec1575a1c Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 16 Oct 2019 11:14:12 +0200 Subject: [PATCH] [jOOQ/jOOQ#8528] Cascade drop column commands to local constraints --- .../java/org/jooq/impl/DDLInterpreter.java | 45 +++++++++++++++++-- jOOQ/src/main/java/org/jooq/impl/Tools.java | 11 +++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java index de7053e477..cb537a8c72 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java @@ -43,6 +43,7 @@ import static org.jooq.impl.ConstraintType.PRIMARY_KEY; import static org.jooq.impl.DSL.unquotedName; import static org.jooq.impl.SQLDataType.BIGINT; import static org.jooq.impl.Tools.EMPTY_FIELD; +import static org.jooq.impl.Tools.intersect; import java.util.ArrayList; import java.util.Arrays; @@ -268,6 +269,46 @@ final class DDLInterpreter { )); } + private final void dropColumns(MutableTable table, List fields) { + Iterator it1 = table.indexes.iterator(); + + indexLoop: + while (it1.hasNext()) { + for (MutableSortField msf : it1.next().fields) { + if (fields.contains(msf.field)) { + it1.remove(); + continue indexLoop; + } + } + } + + if (table.primaryKey != null) + if (intersect(table.primaryKey.keyFields, fields)) + table.primaryKey = null; + + Iterator it2 = table.uniqueKeys.iterator(); + + ukLoop: + while (it2.hasNext()) { + if (intersect(it2.next().keyFields, fields)) { + it2.remove(); + continue ukLoop; + } + } + + Iterator it3 = table.foreignkeys.iterator(); + + fkLoop: + while (it3.hasNext()) { + if (intersect(it3.next().keyFields, fields)) { + it3.remove(); + continue fkLoop; + } + } + + table.fields.removeAll(fields); + } + @SuppressWarnings({ "rawtypes", "unchecked" }) private final void accept0(AlterTableImpl query) { Table table = query.$table(); @@ -377,14 +418,12 @@ final class DDLInterpreter { mk.name = (UnqualifiedName) renameConstraintTo.getUnqualifiedName(); } else if (dropColumns != null) { - // TODO Implement cascade - // TODO check if any constraints or indexes reference this column. List fields = existing.fields(dropColumns.toArray(EMPTY_FIELD), false); if (fields.size() < dropColumns.size() && !query.$ifExistsColumn()) existing.fields(dropColumns.toArray(EMPTY_FIELD), true); - existing.fields.removeAll(fields); + dropColumns(existing, fields); } else if (dropConstraint != null) { ConstraintImpl impl = (ConstraintImpl) dropConstraint; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index a43bf1619d..d88b5b4873 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5282,4 +5282,15 @@ final class Tools { } return sb.toString(); } + + /** + * Whether the intersection of two collection is non-empty. + */ + static final boolean intersect(Collection c1, Collection c2) { + for (T t1 : c1) + if (c2.contains(t1)) + return true; + + return false; + } }