From 36941b75b06b315e35645606cdd5519f5cba4d97 Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Wed, 18 Sep 2019 12:33:47 +0200 Subject: [PATCH] [jOOQ/jOOQ#8528] Add basic support for PRIMARY KEY constraints --- .../java/org/jooq/impl/ConstraintImpl.java | 89 ++++++++++--------- .../java/org/jooq/impl/DDLInterpreter.java | 37 ++++++-- 2 files changed, 77 insertions(+), 49 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java b/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java index 7af2968474..f6823fd712 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java @@ -168,6 +168,7 @@ implements super(name, null); } + final Field[] $unique() { return unique; } final Field[] $primaryKey() { return primaryKey; } // ------------------------------------------------------------------------ @@ -442,112 +443,112 @@ implements @Override public final ConstraintImpl foreignKey(Field field1) { - return foreignKey(new Field[] { field1 }); + return foreignKey(new Field[] { field1 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2) { - return foreignKey(new Field[] { field1, field2 }); + return foreignKey(new Field[] { field1, field2 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3) { - return foreignKey(new Field[] { field1, field2, field3 }); + return foreignKey(new Field[] { field1, field2, field3 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4) { - return foreignKey(new Field[] { field1, field2, field3, field4 }); + return foreignKey(new Field[] { field1, field2, field3, field4 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16, Field field17) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16, Field field17, Field field18) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16, Field field17, Field field18, Field field19) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16, Field field17, Field field18, Field field19, Field field20) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19, field20 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19, field20 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16, Field field17, Field field18, Field field19, Field field20, Field field21) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19, field20, field21 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19, field20, field21 }); } @Override public final ConstraintImpl foreignKey(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16, Field field17, Field field18, Field field19, Field field20, Field field21, Field field22) { - return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19, field20, field21, field22 }); + return foreignKey(new Field[] { field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17, field18, field19, field20, field21, field22 }); } @Override @@ -772,112 +773,112 @@ implements @Override public final ConstraintImpl references(Table table, Field t1) { - return references(table, new Field[] { t1 }); + return references(table, new Field[] { t1 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2) { - return references(table, new Field[] { t1, t2 }); + return references(table, new Field[] { t1, t2 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3) { - return references(table, new Field[] { t1, t2, t3 }); + return references(table, new Field[] { t1, t2, t3 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4) { - return references(table, new Field[] { t1, t2, t3, t4 }); + return references(table, new Field[] { t1, t2, t3, t4 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5) { - return references(table, new Field[] { t1, t2, t3, t4, t5 }); + return references(table, new Field[] { t1, t2, t3, t4, t5 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15, Field t16) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15, Field t16, Field t17) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15, Field t16, Field t17, Field t18) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15, Field t16, Field t17, Field t18, Field t19) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15, Field t16, Field t17, Field t18, Field t19, Field t20) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15, Field t16, Field t17, Field t18, Field t19, Field t20, Field t21) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21 }); } @Override public final ConstraintImpl references(Table table, Field t1, Field t2, Field t3, Field t4, Field t5, Field t6, Field t7, Field t8, Field t9, Field t10, Field t11, Field t12, Field t13, Field t14, Field t15, Field t16, Field t17, Field t18, Field t19, Field t20, Field t21, Field t22) { - return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22 }); + return references(table, new Field[] { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22 }); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java index 4edfb45bfc..81cecc5fc6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java +++ b/jOOQ/src/main/java/org/jooq/impl/DDLInterpreter.java @@ -127,7 +127,11 @@ final class DDLInterpreter { for (Constraint constraint : query.$constraints()) if (constraint instanceof ConstraintImpl) { ConstraintImpl impl = (ConstraintImpl) constraint; - t.primaryKey(impl.$primaryKey()); + // XXX handle case that primary key already exists? + if (impl.$primaryKey() != null) + t.primaryKey(impl.getUnqualifiedName(), impl.$primaryKey()); + if (impl.$unique() != null) + t.uniqueKey(impl.getUnqualifiedName(), impl.$unique()); } else // XXX log warning? @@ -272,9 +276,10 @@ final class DDLInterpreter { } private static class MutableTable extends TableImpl { - private static final long serialVersionUID = -7474225786973716638L; + private static final long serialVersionUID = -7474225786973716638L; - private UniqueKey primaryKey; + private UniqueKey primaryKey; + private List> keys; MutableTable(Name name, MutableSchema schema) { super(normalize(name), schema); @@ -286,9 +291,18 @@ final class DDLInterpreter { } @SuppressWarnings({ "unchecked", "rawtypes" }) - public void primaryKey(Field[] primaryKeyFields) { + void primaryKey(Name name, Field[] primaryKeyFields) { if (primaryKeyFields != null) - this.primaryKey = new UniqueKeyImpl(this, copiedFields(primaryKeyFields)); + this.primaryKey = new UniqueKeyImpl(this, normalize(name).first(), copiedFields(primaryKeyFields)); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + void uniqueKey(Name name, Field[] uniqueKeyFields) { + if (uniqueKeyFields != null) { + if (keys == null) + keys = new ArrayList<>(); + keys.add(new UniqueKeyImpl(this, normalize(name).first(), copiedFields(uniqueKeyFields))); + } } private final TableField[] copiedFields(Field[] input) { @@ -302,6 +316,19 @@ final class DDLInterpreter { public UniqueKey getPrimaryKey() { return primaryKey; } + + @Override + public List> getKeys() { + if (primaryKey == null) + return keys == null ? Collections.emptyList() : Collections.unmodifiableList(keys); + else if (keys == null) + return Collections.singletonList(primaryKey); + + List> result = new ArrayList<>(); + result.add(primaryKey); + result.addAll(keys); + return Collections.unmodifiableList(result); + } } }