diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java index b87d68307e..bfd416a344 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/GenerationTool.java @@ -290,6 +290,7 @@ public class GenerationTool { database.setIncludeExcludeColumns(TRUE.equals(d.isIncludeExcludeColumns())); database.setRecordVersionFields(new String[] { defaultString(d.getRecordVersionFields()) }); database.setRecordTimestampFields(new String[] { defaultString(d.getRecordTimestampFields()) }); + database.setOverridePrimaryKeys(new String[] { defaultString(d.getOverridePrimaryKeys()) }); database.setConfiguredCustomTypes(d.getCustomTypes()); database.setConfiguredEnumTypes(d.getEnumTypes()); database.setConfiguredForcedTypes(d.getForcedTypes()); diff --git a/jOOQ-meta/pom.xml b/jOOQ-meta/pom.xml index da872fc3b5..72c7e6c5a0 100644 --- a/jOOQ-meta/pom.xml +++ b/jOOQ-meta/pom.xml @@ -48,7 +48,7 @@ src/main/resources/xsd src/main/resources/xjb - jooq-codegen-3.3.0.xsd + jooq-codegen-3.4.0.xsd org.jooq.util.jaxb diff --git a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java index 6a0400a613..82feafcc79 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/AbstractDatabase.java @@ -90,6 +90,7 @@ public abstract class AbstractDatabase implements Database { private boolean includeExcludeColumns; private String[] recordVersionFields; private String[] recordTimestampFields; + private String[] overridePrimaryKeys; private boolean supportsUnsignedTypes; private boolean dateAsTimestamp; private List configuredSchemata; @@ -327,6 +328,16 @@ public abstract class AbstractDatabase implements Database { return recordTimestampFields; } + @Override + public void setOverridePrimaryKeys(String[] overridePrimaryKeys) { + this.overridePrimaryKeys = overridePrimaryKeys; + } + + @Override + public String[] getOverridePrimaryKeys() { + return overridePrimaryKeys; + } + @Override public final void setConfiguredEnumTypes(List configuredEnumTypes) { this.configuredEnumTypes = configuredEnumTypes; @@ -785,22 +796,26 @@ public abstract class AbstractDatabase implements Database { List result = new ArrayList(); definitionsLoop: for (T definition : definitions) { - for (String exclude : excludes) { - if (exclude != null && - (definition.getName().matches(exclude.trim()) || - definition.getQualifiedName().matches(exclude.trim()))) { + if (excludes != null) { + for (String exclude : excludes) { + if (exclude != null && + (definition.getName().matches(exclude.trim()) || + definition.getQualifiedName().matches(exclude.trim()))) { - continue definitionsLoop; + continue definitionsLoop; + } } } - for (String include : includes) { - if (include != null && - (definition.getName().matches(include.trim()) || - definition.getQualifiedName().matches(include.trim()))) { + if (includes != null) { + for (String include : includes) { + if (include != null && + (definition.getName().matches(include.trim()) || + definition.getQualifiedName().matches(include.trim()))) { - result.add(definition); - continue definitionsLoop; + result.add(definition); + continue definitionsLoop; + } } } } @@ -842,6 +857,13 @@ public abstract class AbstractDatabase implements Database { log.error("Error while fetching check constraints", e); } + try { + overridePrimaryKeys(result); + } + catch (Exception e) { + log.error("Error while overriding primary keys", e); + } + return result; } @@ -862,6 +884,17 @@ public abstract class AbstractDatabase implements Database { return fetched.size() + " (" + included.size() + " included, " + (fetched.size() - included.size()) + " excluded)"; } + private final void overridePrimaryKeys(DefaultRelations r) { + List allKeys = r.getUniqueKeys(); + List filteredKeys = filterExcludeInclude(allKeys, null, overridePrimaryKeys); + + log.info("Overriding primary keys", fetchedSize(allKeys, filteredKeys)); + + for (UniqueKeyDefinition key : filteredKeys) { + r.overridePrimaryKey(key); + } + } + /** * Create a new Factory */ diff --git a/jOOQ-meta/src/main/java/org/jooq/util/Database.java b/jOOQ-meta/src/main/java/org/jooq/util/Database.java index be9ecfe3a4..c147ec326d 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/Database.java @@ -259,6 +259,18 @@ public interface Database { */ String[] getRecordTimestampFields(); + /** + * Unique keys matching these regular expressions will be considered as + * primary keys in generated code. + */ + void setOverridePrimaryKeys(String[] primaryKeys); + + /** + * Unique keys matching these regular expressions will be considered as + * primary keys in generated code. + */ + String[] getOverridePrimaryKeys(); + /** * Database objects matching any of these field names will be generated as * custom types. diff --git a/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java b/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java index 7b15a6efbc..6f71297398 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/DefaultRelations.java @@ -42,10 +42,12 @@ package org.jooq.util; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.jooq.tools.JooqLogger; @@ -98,6 +100,31 @@ public class DefaultRelations implements Relations { key.getKeyColumns().add(column); } + public void overridePrimaryKey(UniqueKeyDefinition key) { + UniqueKeyDefinition old = null; + + // Remove the existing key from the column -> key mapping + primaryKeysByColumn = null; + + // Remove the existing key from the key mapping + Iterator> it = primaryKeys.entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + + if (entry.getValue().getTable().equals(key.getTable())) { + old = entry.getValue(); + it.remove(); + break; + } + } + + // Add the new primary key + primaryKeys.put(key(key.getTable(), key.getName()), key); + log.info("Overriding primary key", "Table : " + key.getTable() + + ", previous key : " + ((old == null) ? "none" : old.getName()) + + ", new key : " + key.getName()); + } + private UniqueKeyDefinition getUniqueKey(String keyName, ColumnDefinition column, boolean isPK) { UniqueKeyDefinition key = uniqueKeys.get(key(column, keyName)); @@ -208,8 +235,6 @@ public class DefaultRelations implements Relations { return new ArrayList(result); } - - @Override public List getUniqueKeys(SchemaDefinition schema) { Set result = new LinkedHashSet(); diff --git a/jOOQ-meta/src/main/resources/xjb/binding.xjb b/jOOQ-meta/src/main/resources/xjb/binding.xjb index 5c81bd0390..9517d40c4d 100644 --- a/jOOQ-meta/src/main/resources/xjb/binding.xjb +++ b/jOOQ-meta/src/main/resources/xjb/binding.xjb @@ -11,7 +11,7 @@ - + @@ -19,7 +19,7 @@ - + diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.4.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.4.0.xsd new file mode 100644 index 0000000000..7da4e84bdc --- /dev/null +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.4.0.xsd @@ -0,0 +1,632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +