diff --git a/jOOQ/src/main/java/org/jooq/impl/DetachedMeta.java b/jOOQ/src/main/java/org/jooq/impl/DetachedMeta.java index 8ec876985a..695e0321cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DetachedMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/DetachedMeta.java @@ -137,10 +137,10 @@ final class DetachedMeta extends AbstractMeta { private static class DetachedSchema extends SchemaImpl { private static final long serialVersionUID = -95755926444275258L; - private final List> domains = new ArrayList<>(); - private final List> tables = new ArrayList<>(); - private final List> sequences = new ArrayList<>(); - private final List> udts = new ArrayList<>(); + private final List> domains = new ArrayList<>(); + private final List> tables = new ArrayList<>(); + private final List> sequences = new ArrayList<>(); + private final List> udts = new ArrayList<>(); private DetachedSchema(String name, Catalog owner, String comment) { super(name, owner, comment); @@ -202,10 +202,10 @@ final class DetachedMeta extends AbstractMeta { private static class DetachedTable extends TableImpl { private static final long serialVersionUID = -6070726881709997500L; - private final List indexes = new ArrayList<>(); - private final List> keys = new ArrayList<>(); - private UniqueKey primaryKey; - private final List> references = new ArrayList<>(); + private final List indexes = new ArrayList<>(); + private final List> keys = new ArrayList<>(); + private UniqueKey primaryKey; + private final List> references = new ArrayList<>(); private DetachedTable(Name name, Schema owner, Comment comment) { super(name, owner, null, null, comment); diff --git a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java index 4594a58773..a038f234f8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java @@ -43,12 +43,16 @@ import java.util.List; import org.jooq.Catalog; import org.jooq.Domain; +import org.jooq.Field; +import org.jooq.ForeignKey; import org.jooq.Index; import org.jooq.Meta; import org.jooq.QueryPart; +import org.jooq.Record; import org.jooq.Schema; import org.jooq.Sequence; import org.jooq.Table; +import org.jooq.TableField; import org.jooq.UDT; import org.jooq.UniqueKey; @@ -239,7 +243,7 @@ final class FilteredMeta extends AbstractMeta { for (Schema s : delegate.getSchemas()) if (schemaFilter == null || schemaFilter.test(s)) - schemas.add(new FilteredSchema(s)); + schemas.add(new FilteredSchema(this, s)); } return Collections.unmodifiableList(schemas); @@ -254,8 +258,8 @@ final class FilteredMeta extends AbstractMeta { private transient List> tables; private transient List> sequences; - private FilteredSchema(Schema delegate) { - super(delegate.getQualifiedName(), delegate.getCatalog(), DSL.comment(delegate.getComment())); + private FilteredSchema(FilteredCatalog catalog, Schema delegate) { + super(delegate.getQualifiedName(), catalog, DSL.comment(delegate.getComment())); this.delegate = delegate; } @@ -267,6 +271,7 @@ final class FilteredMeta extends AbstractMeta { for (Domain d : delegate.getDomains()) if (domainFilter == null || domainFilter.test(d)) + // TODO: Schema is wrong here domains.add(d); } @@ -280,8 +285,7 @@ final class FilteredMeta extends AbstractMeta { for (Table t : delegate.getTables()) if (tableFilter == null || tableFilter.test(t)) - // TODO create a FilteredTable and filter out primary key and indexes - tables.add(t); + tables.add(new FilteredTable<>(this, t)); } return Collections.unmodifiableList(tables); @@ -294,6 +298,7 @@ final class FilteredMeta extends AbstractMeta { for (Sequence t : delegate.getSequences()) if (sequenceFilter == null || sequenceFilter.test(t)) + // TODO: Schema is wrong here sequences.add(t); } @@ -302,7 +307,102 @@ final class FilteredMeta extends AbstractMeta { @Override public final List> getUDTs() { + // TODO: [#8475] Add Meta.getUDTs return delegate.getUDTs(); } } + + private class FilteredTable extends TableImpl { + private static final long serialVersionUID = -6070726881709997500L; + + private final Table delegate; + private transient List indexes; + private transient List> keys; + private transient UniqueKey primaryKey; + private transient List> references; + + private FilteredTable(FilteredSchema schema, Table delegate) { + super(delegate.getQualifiedName(), schema, null, null, DSL.comment(delegate.getComment())); + + this.delegate = delegate; + + for (Field field : delegate.fields()) + createField(field.getQualifiedName(), field.getDataType(), this, field.getComment()); + } + + @Override + public final List getIndexes() { + if (indexes == null) { + indexes = new ArrayList<>(); + + for (Index index : delegate.getIndexes()) + if (indexFilter == null || indexFilter.test(index)) + indexes.add(index); + } + + return Collections.unmodifiableList(indexes); + } + + @Override + public final List> getKeys() { + if (keys == null) { + keys = new ArrayList<>(); + + for (UniqueKey key : delegate.getKeys()) + keys.add(key); + + UniqueKey pk = delegate.getPrimaryKey(); + if (pk != null) + if (primaryKeyFilter == null || primaryKeyFilter.test(pk)) + primaryKey = pk; + } + + return Collections.unmodifiableList(keys); + } + + @Override + public final UniqueKey getPrimaryKey() { + getKeys(); + return primaryKey; + } + + @SuppressWarnings("unchecked") + @Override + public final List> getReferences() { + if (references == null) { + references = new ArrayList<>(); + + for (ForeignKey key : delegate.getReferences()) { + Table table = lookupTable(key.getKey().getTable()); + + // TODO: Support FKs referencing UKs + if (table != null && table.getPrimaryKey() != null) { + TableField[] fields1 = key.getFieldsArray(); + TableField[] fields2 = new TableField[fields1.length]; + + for (int i = 0; i < fields2.length; i++) + fields2[i] = (TableField) field(fields1[i]); + + references.add(Internal.createForeignKey(table.getPrimaryKey(), this, key.getName(), fields2)); + } + } + } + + return Collections.unmodifiableList(references); + } + + private final Table lookupTable(Table table) { + + // TODO: This is a re-occurring pattern in Meta implementations. Should we have a more generic way to look up objects in a Catalog/Schema? + Catalog catalog = getCatalog(); + if (catalog == null) + return null; + + Schema schema = catalog.getSchema(table.getSchema().getName()); + if (schema == null) + return null; + + return schema.getTable(table.getName()); + } + } }