From 90d8788bca42807842a8ad2d1f78dbdbea8e478d Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 12 Aug 2014 18:22:12 +0200 Subject: [PATCH] [#3451] Added support for PRIMARY KEY and UNIQUE KEY constraints --- .../java/org/jooq/util/xml/XMLDatabase.java | 100 +++++++++++++++--- .../main/resources/xsd/jooq-meta-3.5.0.xsd | 61 +++++++++++ jOOQ-test/src/main/resources/database.xml | 21 ++++ .../test/oracle4/generatedclasses/Keys.java | 5 + .../generatedclasses/tables/TAuthor.java | 18 +++- .../tables/daos/TAuthorDao.java | 47 ++++++++ .../tables/pojos/TAuthor.java | 5 +- .../tables/records/TAuthorRecord.java | 19 +++- 8 files changed, 257 insertions(+), 19 deletions(-) create mode 100644 jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/daos/TAuthorDao.java diff --git a/jOOQ-meta/src/main/java/org/jooq/util/xml/XMLDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/xml/XMLDatabase.java index 865cee1978..413141add2 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/xml/XMLDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/xml/XMLDatabase.java @@ -41,9 +41,14 @@ package org.jooq.util.xml; +import static org.jooq.tools.StringUtils.defaultIfNull; +import static org.jooq.util.xml.jaxb.TableConstraintType.PRIMARY_KEY; +import static org.jooq.util.xml.jaxb.TableConstraintType.UNIQUE; + import java.io.File; -import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import javax.xml.bind.JAXB; @@ -51,6 +56,7 @@ import javax.xml.bind.JAXB; import org.jooq.DSLContext; import org.jooq.SQLDialect; import org.jooq.impl.DSL; +import org.jooq.tools.StringUtils; import org.jooq.util.AbstractDatabase; import org.jooq.util.ArrayDefinition; import org.jooq.util.DataTypeDefinition; @@ -65,9 +71,12 @@ import org.jooq.util.SequenceDefinition; import org.jooq.util.TableDefinition; import org.jooq.util.UDTDefinition; import org.jooq.util.xml.jaxb.InformationSchema; +import org.jooq.util.xml.jaxb.KeyColumnUsage; import org.jooq.util.xml.jaxb.Schema; import org.jooq.util.xml.jaxb.Sequence; import org.jooq.util.xml.jaxb.Table; +import org.jooq.util.xml.jaxb.TableConstraint; +import org.jooq.util.xml.jaxb.TableConstraintType; /** * The XML Database. @@ -101,23 +110,87 @@ public class XMLDatabase extends AbstractDatabase { } @Override - protected void loadPrimaryKeys(DefaultRelations relations) throws SQLException { + protected void loadPrimaryKeys(DefaultRelations relations) { + for (KeyColumnUsage usage : keyColumnUsage(PRIMARY_KEY)) { + SchemaDefinition schema = getSchema(usage.getConstraintSchema()); + String key = usage.getConstraintName(); + String tableName = usage.getTableName(); + String columnName = usage.getColumnName(); + + TableDefinition table = getTable(schema, tableName); + if (table != null) { + relations.addPrimaryKey(key, table.getColumn(columnName)); + } + } } @Override - protected void loadUniqueKeys(DefaultRelations relations) throws SQLException { + protected void loadUniqueKeys(DefaultRelations relations) { + for (KeyColumnUsage usage : keyColumnUsage(UNIQUE)) { + SchemaDefinition schema = getSchema(usage.getConstraintSchema()); + String key = usage.getConstraintName(); + String tableName = usage.getTableName(); + String columnName = usage.getColumnName(); + + TableDefinition table = getTable(schema, tableName); + if (table != null) { + relations.addPrimaryKey(key, table.getColumn(columnName)); + } + } + } + + private List keyColumnUsage(TableConstraintType constraintType) { + List result = new ArrayList(); + + for (TableConstraint constraint : info().getTableConstraints()) { + if (constraintType == constraint.getConstraintType() + && getInputSchemata().contains(constraint.getConstraintSchema())) { + + for (KeyColumnUsage usage : info().getKeyColumnUsages()) { + if ( StringUtils.equals(constraint.getConstraintCatalog(), usage.getConstraintCatalog()) + && StringUtils.equals(constraint.getConstraintSchema(), usage.getConstraintSchema()) + && StringUtils.equals(constraint.getConstraintName(), usage.getConstraintName())) { + + result.add(usage); + } + } + } + } + + Collections.sort(result, new Comparator() { + @Override + public int compare(KeyColumnUsage o1, KeyColumnUsage o2) { + int r = 0; + + r = defaultIfNull(o1.getConstraintCatalog(), "").compareTo(defaultIfNull(o2.getConstraintCatalog(), "")); + if (r != 0) + return r; + + r = defaultIfNull(o1.getConstraintSchema(), "").compareTo(defaultIfNull(o2.getConstraintSchema(), "")); + if (r != 0) + return r; + + r = defaultIfNull(o1.getConstraintName(), "").compareTo(defaultIfNull(o2.getConstraintName(), "")); + if (r != 0) + return r; + + return Integer.valueOf(o1.getOrdinalPosition()).compareTo(o2.getOrdinalPosition()); + } + }); + + return result; } @Override - protected void loadForeignKeys(DefaultRelations relations) throws SQLException { + protected void loadForeignKeys(DefaultRelations relations) { } @Override - protected void loadCheckConstraints(DefaultRelations r) throws SQLException { + protected void loadCheckConstraints(DefaultRelations r) { } @Override - protected List getSchemata0() throws SQLException { + protected List getSchemata0() { List result = new ArrayList(); for (Schema schema : info().getSchemata()) { @@ -131,12 +204,13 @@ public class XMLDatabase extends AbstractDatabase { @Override - protected List getSequences0() throws SQLException { + protected List getSequences0() { List result = new ArrayList(); for (Sequence sequence : info().getSequences()) { if (getInputSchemata().contains(sequence.getSequenceSchema())) { SchemaDefinition schema = getSchema(sequence.getSequenceSchema()); + DataTypeDefinition type = new DefaultDataTypeDefinition( this, schema, @@ -156,7 +230,7 @@ public class XMLDatabase extends AbstractDatabase { } @Override - protected List getTables0() throws SQLException { + protected List getTables0() { List result = new ArrayList(); for (Table table : info().getTables()) { @@ -171,31 +245,31 @@ public class XMLDatabase extends AbstractDatabase { } @Override - protected List getEnums0() throws SQLException { + protected List getEnums0() { List result = new ArrayList(); return result; } @Override - protected List getUDTs0() throws SQLException { + protected List getUDTs0() { List result = new ArrayList(); return result; } @Override - protected List getArrays0() throws SQLException { + protected List getArrays0() { List result = new ArrayList(); return result; } @Override - protected List getRoutines0() throws SQLException { + protected List getRoutines0() { List result = new ArrayList(); return result; } @Override - protected List getPackages0() throws SQLException { + protected List getPackages0() { List result = new ArrayList(); return result; } diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-meta-3.5.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-meta-3.5.0.xsd index 52a32300ee..4c9c3d204c 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-meta-3.5.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-meta-3.5.0.xsd @@ -11,6 +11,8 @@ + + @@ -82,4 +84,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ-test/src/main/resources/database.xml b/jOOQ-test/src/main/resources/database.xml index 126d9a98b5..b5e1b8ef5e 100644 --- a/jOOQ-test/src/main/resources/database.xml +++ b/jOOQ-test/src/main/resources/database.xml @@ -33,4 +33,25 @@ 7 + + + + TEST + PK_T_AUTHOR + PRIMARY KEY + TEST + T_AUTHOR + + + + + + TEST + PK_T_AUTHOR + TEST + T_AUTHOR + ID + 1 + + diff --git a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/Keys.java b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/Keys.java index 65b4ed6b15..e9f99986b7 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/Keys.java +++ b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/Keys.java @@ -21,6 +21,7 @@ public class Keys { // UNIQUE and PRIMARY KEY definitions // ------------------------------------------------------------------------- + public static final org.jooq.UniqueKey PK_T_AUTHOR = UniqueKeys0.PK_T_AUTHOR; // ------------------------------------------------------------------------- // FOREIGN KEY definitions @@ -30,4 +31,8 @@ public class Keys { // ------------------------------------------------------------------------- // [#1459] distribute members to avoid static initialisers > 64kb // ------------------------------------------------------------------------- + + private static class UniqueKeys0 extends org.jooq.impl.AbstractKeys { + public static final org.jooq.UniqueKey PK_T_AUTHOR = createUniqueKey(org.jooq.test.oracle4.generatedclasses.tables.TAuthor.T_AUTHOR, org.jooq.test.oracle4.generatedclasses.tables.TAuthor.T_AUTHOR.ID); + } } diff --git a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/TAuthor.java b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/TAuthor.java index db2b234f98..9e61494393 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/TAuthor.java +++ b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/TAuthor.java @@ -9,7 +9,7 @@ package org.jooq.test.oracle4.generatedclasses.tables; @java.lang.SuppressWarnings({ "all", "unchecked", "rawtypes" }) public class TAuthor extends org.jooq.impl.TableImpl { - private static final long serialVersionUID = 799437775; + private static final long serialVersionUID = 1532762721; /** * The singleton instance of TEST.T_AUTHOR @@ -51,6 +51,22 @@ public class TAuthor extends org.jooq.impl.TableImpl getPrimaryKey() { + return org.jooq.test.oracle4.generatedclasses.Keys.PK_T_AUTHOR; + } + + /** + * {@inheritDoc} + */ + @Override + public java.util.List> getKeys() { + return java.util.Arrays.>asList(org.jooq.test.oracle4.generatedclasses.Keys.PK_T_AUTHOR); + } + /** * {@inheritDoc} */ diff --git a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/daos/TAuthorDao.java b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/daos/TAuthorDao.java new file mode 100644 index 0000000000..118ec04a3b --- /dev/null +++ b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/daos/TAuthorDao.java @@ -0,0 +1,47 @@ +/** + * This class is generated by jOOQ + */ +package org.jooq.test.oracle4.generatedclasses.tables.daos; + +/** + * This class is generated by jOOQ. + */ +@java.lang.SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class TAuthorDao extends org.jooq.impl.DAOImpl { + + /** + * Create a new TAuthorDao without any configuration + */ + public TAuthorDao() { + super(org.jooq.test.oracle4.generatedclasses.tables.TAuthor.T_AUTHOR, org.jooq.test.oracle4.generatedclasses.tables.pojos.TAuthor.class); + } + + /** + * Create a new TAuthorDao with an attached configuration + */ + public TAuthorDao(org.jooq.Configuration configuration) { + super(org.jooq.test.oracle4.generatedclasses.tables.TAuthor.T_AUTHOR, org.jooq.test.oracle4.generatedclasses.tables.pojos.TAuthor.class, configuration); + } + + /** + * {@inheritDoc} + */ + @Override + protected java.lang.Integer getId(org.jooq.test.oracle4.generatedclasses.tables.pojos.TAuthor object) { + return object.getId(); + } + + /** + * Fetch records that have ID IN (values) + */ + public java.util.List fetchById(java.lang.Integer... values) { + return fetch(org.jooq.test.oracle4.generatedclasses.tables.TAuthor.T_AUTHOR.ID, values); + } + + /** + * Fetch a unique record that has ID = value + */ + public org.jooq.test.oracle4.generatedclasses.tables.pojos.TAuthor fetchOneById(java.lang.Integer value) { + return fetchOne(org.jooq.test.oracle4.generatedclasses.tables.TAuthor.T_AUTHOR.ID, value); + } +} diff --git a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/pojos/TAuthor.java b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/pojos/TAuthor.java index cb92384a1b..58349cda3a 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/pojos/TAuthor.java +++ b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/pojos/TAuthor.java @@ -11,7 +11,7 @@ package org.jooq.test.oracle4.generatedclasses.tables.pojos; @javax.persistence.Table(name = "T_AUTHOR", schema = "TEST") public class TAuthor implements java.io.Serializable { - private static final long serialVersionUID = -2112424480; + private static final long serialVersionUID = -895002231; private java.lang.Integer id; @@ -23,7 +23,8 @@ public class TAuthor implements java.io.Serializable { this.id = id; } - @javax.persistence.Column(name = "ID", nullable = false, precision = 7) + @javax.persistence.Id + @javax.persistence.Column(name = "ID", unique = true, nullable = false, precision = 7) @javax.validation.constraints.NotNull public java.lang.Integer getId() { return this.id; diff --git a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/records/TAuthorRecord.java b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/records/TAuthorRecord.java index 027331e7ae..8d481701e4 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/records/TAuthorRecord.java +++ b/jOOQ-test/src/test/java/org/jooq/test/oracle4/generatedclasses/tables/records/TAuthorRecord.java @@ -9,9 +9,9 @@ package org.jooq.test.oracle4.generatedclasses.tables.records; @java.lang.SuppressWarnings({ "all", "unchecked", "rawtypes" }) @javax.persistence.Entity @javax.persistence.Table(name = "T_AUTHOR", schema = "TEST") -public class TAuthorRecord extends org.jooq.impl.TableRecordImpl implements org.jooq.Record1 { +public class TAuthorRecord extends org.jooq.impl.UpdatableRecordImpl implements org.jooq.Record1 { - private static final long serialVersionUID = -115873836; + private static final long serialVersionUID = -2050117306; /** * Setter for TEST.T_AUTHOR.ID. @@ -23,12 +23,25 @@ public class TAuthorRecord extends org.jooq.impl.TableRecordImplTEST.T_AUTHOR.ID. */ - @javax.persistence.Column(name = "ID", nullable = false, precision = 7) + @javax.persistence.Id + @javax.persistence.Column(name = "ID", unique = true, nullable = false, precision = 7) @javax.validation.constraints.NotNull public java.lang.Integer getId() { return (java.lang.Integer) getValue(0); } + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public org.jooq.Record1 key() { + return (org.jooq.Record1) super.key(); + } + // ------------------------------------------------------------------------- // Record1 type implementation // -------------------------------------------------------------------------