From c342bc2c199b8c387fd2cd067f6f3e655434ee7e Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 5 Aug 2016 15:44:39 +0200 Subject: [PATCH] [#5460] Added support for constraints --- .../jooq/impl/InformationSchemaExport.java | 124 +++++++++++++++--- 1 file changed, 109 insertions(+), 15 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java index 8722766c6f..0647647b6a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java +++ b/jOOQ/src/main/java/org/jooq/impl/InformationSchemaExport.java @@ -40,18 +40,29 @@ */ package org.jooq.impl; +import static org.jooq.util.xml.jaxb.TableConstraintType.FOREIGN_KEY; +import static org.jooq.util.xml.jaxb.TableConstraintType.PRIMARY_KEY; +import static org.jooq.util.xml.jaxb.TableConstraintType.UNIQUE; + import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.jooq.Configuration; import org.jooq.Field; +import org.jooq.ForeignKey; +import org.jooq.Key; import org.jooq.Schema; import org.jooq.Sequence; import org.jooq.Table; +import org.jooq.UniqueKey; import org.jooq.tools.StringUtils; import org.jooq.util.xml.jaxb.Column; import org.jooq.util.xml.jaxb.InformationSchema; +import org.jooq.util.xml.jaxb.KeyColumnUsage; +import org.jooq.util.xml.jaxb.ReferentialConstraint; +import org.jooq.util.xml.jaxb.TableConstraint; +import org.jooq.util.xml.jaxb.TableConstraintType; /** * @author Lukas Eder @@ -61,15 +72,17 @@ final class InformationSchemaExport { static final InformationSchema exportTables(Configuration configuration, List> tables) { InformationSchema result = new InformationSchema(); - Set schemas = new LinkedHashSet(); - for (Table t : tables) - schemas.add(t.getSchema()); + Set includedSchemas = new LinkedHashSet(); + Set> includedTables = new LinkedHashSet>(tables); - for (Schema s : schemas) + for (Table t : tables) + includedSchemas.add(t.getSchema()); + + for (Schema s : includedSchemas) exportSchema0(result, s); for (Table t : tables) - exportTable0(configuration, result, t); + exportTable0(configuration, result, t, includedTables); return result; } @@ -77,11 +90,16 @@ final class InformationSchemaExport { static final InformationSchema exportSchemas(Configuration configuration, List schemas) { InformationSchema result = new InformationSchema(); + Set> includedTables = new LinkedHashSet>(); + for (Schema s : schemas) + for (Table t : s.getTables()) + includedTables.add(t); + for (Schema s : schemas) { exportSchema0(result, s); for (Table t : s.getTables()) - exportTable0(configuration, result, t); + exportTable0(configuration, result, t, includedTables); for (Sequence q : s.getSequences()) exportSequences0(configuration, result, q); @@ -90,7 +108,7 @@ final class InformationSchemaExport { return result; } - private static void exportSequences0(Configuration configuration, InformationSchema result, Sequence q) { + private static final void exportSequences0(Configuration configuration, InformationSchema result, Sequence q) { org.jooq.util.xml.jaxb.Sequence iq = new org.jooq.util.xml.jaxb.Sequence(); if (!StringUtils.isBlank(q.getCatalog().getName())) @@ -114,7 +132,19 @@ final class InformationSchemaExport { result.getSequences().add(iq); } - private static void exportTable0(Configuration configuration, InformationSchema result, Table t) { + private static final void exportSchema0(InformationSchema result, Schema s) { + org.jooq.util.xml.jaxb.Schema is = new org.jooq.util.xml.jaxb.Schema(); + + if (!StringUtils.isBlank(s.getCatalog().getName())) + is.setCatalogName(s.getCatalog().getName()); + + if (!StringUtils.isBlank(s.getName())) { + is.setSchemaName(s.getName()); + result.getSchemata().add(is); + } + } + + private static final void exportTable0(Configuration configuration, InformationSchema result, Table t, Set> includedTables) { org.jooq.util.xml.jaxb.Table it = new org.jooq.util.xml.jaxb.Table(); if (!StringUtils.isBlank(t.getCatalog().getName())) @@ -156,17 +186,81 @@ final class InformationSchemaExport { result.getColumns().add(ic); } + + for (UniqueKey key : t.getKeys()) + exportKey0(result, t, key, key.isPrimary() ? PRIMARY_KEY : UNIQUE); + + for (ForeignKey fk : t.getReferences()) + if (includedTables.contains(fk.getKey().getTable())) + exportKey0(result, t, fk, FOREIGN_KEY); } - private static final void exportSchema0(InformationSchema result, Schema s) { - org.jooq.util.xml.jaxb.Schema is = new org.jooq.util.xml.jaxb.Schema(); + private static final void exportKey0(InformationSchema result, Table t, Key key, TableConstraintType constraintType) { + TableConstraint tc = new TableConstraint(); - if (!StringUtils.isBlank(s.getCatalog().getName())) - is.setCatalogName(s.getCatalog().getName()); + String catalogName = t.getCatalog().getName(); + String schemaName = t.getSchema().getName(); - if (!StringUtils.isBlank(s.getName())) { - is.setSchemaName(s.getName()); - result.getSchemata().add(is); + tc.setConstraintName(key.getName()); + tc.setConstraintType(constraintType); + + if (!StringUtils.isBlank(catalogName)) { + tc.setConstraintCatalog(catalogName); + tc.setTableCatalog(catalogName); + } + + if (!StringUtils.isBlank(schemaName)) { + tc.setConstraintSchema(schemaName); + tc.setTableSchema(schemaName); + } + + tc.setTableName(t.getName()); + result.getTableConstraints().add(tc); + + int i = 0; + for (Field f : key.getFields()) { + KeyColumnUsage kc = new KeyColumnUsage(); + + if (!StringUtils.isBlank(catalogName)) { + kc.setConstraintCatalog(catalogName); + kc.setTableCatalog(catalogName); + } + + if (!StringUtils.isBlank(schemaName)) { + kc.setConstraintSchema(schemaName); + kc.setTableSchema(schemaName); + } + + kc.setColumnName(f.getName()); + kc.setTableName(t.getName()); + kc.setOrdinalPosition(++i); + kc.setConstraintName(key.getName()); + + result.getKeyColumnUsages().add(kc); + } + + if (constraintType == FOREIGN_KEY) { + ReferentialConstraint rc = new ReferentialConstraint(); + UniqueKey uk = ((ForeignKey) key).getKey(); + String ukCatalogName = uk.getTable().getCatalog().getName(); + String ukSchemaName = uk.getTable().getSchema().getName(); + + if (!StringUtils.isBlank(catalogName)) + rc.setConstraintCatalog(catalogName); + + if (!StringUtils.isBlank(ukCatalogName)) + rc.setUniqueConstraintCatalog(ukCatalogName); + + if (!StringUtils.isBlank(schemaName)) + rc.setConstraintSchema(schemaName); + + if (!StringUtils.isBlank(ukSchemaName)) + rc.setUniqueConstraintSchema(ukSchemaName); + + rc.setConstraintName(key.getName()); + rc.setUniqueConstraintName(uk.getName()); + + result.getReferentialConstraints().add(rc); } }