From 89aee4ffebc1d2200e1056a6041521ce3578b0d5 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 6 Nov 2020 17:41:30 +0100 Subject: [PATCH] [jOOQ/jOOQ#10546] Added Meta.filterUniqueKeys(), filterForeignKeys() --- jOOQ/src/main/java/org/jooq/Meta.java | 12 +++ .../main/java/org/jooq/impl/AbstractMeta.java | 46 ++++++++++ .../main/java/org/jooq/impl/FilteredMeta.java | 83 ++++++++++++++++--- 3 files changed, 129 insertions(+), 12 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Meta.java b/jOOQ/src/main/java/org/jooq/Meta.java index 1720a40d9c..2fcb6d5a51 100644 --- a/jOOQ/src/main/java/org/jooq/Meta.java +++ b/jOOQ/src/main/java/org/jooq/Meta.java @@ -407,6 +407,18 @@ public interface Meta extends Scope { @NotNull Meta filterPrimaryKeys(Predicate> filter); + /** + * Create a wrapper {@link Meta} instance filtering out some unique keys. + */ + @NotNull + Meta filterUniqueKeys(Predicate> filter); + + /** + * Create a wrapper {@link Meta} instance filtering out some foreign keys. + */ + @NotNull + Meta filterForeignKeys(Predicate> filter); + /** * Create a wrapper {@link Meta} instance filtering out some indexes. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java index 79b1ad075b..d8a01240f2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractMeta.java @@ -516,6 +516,8 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable null, null, null, + null, + null, null ); } @@ -530,6 +532,8 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable null, null, null, + null, + null, null ); } @@ -544,6 +548,8 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable null, null, null, + null, + null, null ); } @@ -558,6 +564,8 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable filter, null, null, + null, + null, null ); } @@ -572,6 +580,8 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable null, filter, null, + null, + null, null ); } @@ -586,6 +596,40 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable null, null, filter, + null, + null, + null + ); + } + + @Override + public Meta filterUniqueKeys(Predicate> filter) { + return new FilteredMeta( + this, + null, + null, + null, + null, + null, + null, + filter, + null, + null + ); + } + + @Override + public Meta filterForeignKeys(Predicate> filter) { + return new FilteredMeta( + this, + null, + null, + null, + null, + null, + null, + null, + filter, null ); } @@ -600,6 +644,8 @@ abstract class AbstractMeta extends AbstractScope implements Meta, Serializable null, null, null, + null, + null, filter ); } diff --git a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java index 0b65a81798..037f4885cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java +++ b/jOOQ/src/main/java/org/jooq/impl/FilteredMeta.java @@ -68,16 +68,18 @@ final class FilteredMeta extends AbstractMeta { /** * Generated UID */ - private static final long serialVersionUID = 2589476339574534267L; + private static final long serialVersionUID = 2589476339574534267L; - private final AbstractMeta meta; - private final Predicate catalogFilter; - private final Predicate schemaFilter; - private final Predicate> tableFilter; - private final Predicate> domainFilter; - private final Predicate> sequenceFilter; - private final Predicate> primaryKeyFilter; - private final Predicate indexFilter; + private final AbstractMeta meta; + private final Predicate catalogFilter; + private final Predicate schemaFilter; + private final Predicate> tableFilter; + private final Predicate> domainFilter; + private final Predicate> sequenceFilter; + private final Predicate> primaryKeyFilter; + private final Predicate> uniqueKeyFilter; + private final Predicate> foreignKeyFilter; + private final Predicate indexFilter; FilteredMeta( AbstractMeta meta, @@ -87,6 +89,8 @@ final class FilteredMeta extends AbstractMeta { Predicate> domainFilter, Predicate> sequenceFilter, Predicate> primaryKeyFilter, + Predicate> uniqueKeyFilter, + Predicate> foreignKeyFilter, Predicate indexFilter ) { super(meta.configuration()); @@ -98,6 +102,8 @@ final class FilteredMeta extends AbstractMeta { this.domainFilter = domainFilter; this.sequenceFilter = sequenceFilter; this.primaryKeyFilter = primaryKeyFilter; + this.uniqueKeyFilter = uniqueKeyFilter; + this.foreignKeyFilter = foreignKeyFilter; this.indexFilter = indexFilter; } @@ -122,6 +128,8 @@ final class FilteredMeta extends AbstractMeta { domainFilter, sequenceFilter, primaryKeyFilter, + uniqueKeyFilter, + foreignKeyFilter, indexFilter ); } @@ -136,6 +144,8 @@ final class FilteredMeta extends AbstractMeta { domainFilter, sequenceFilter, primaryKeyFilter, + uniqueKeyFilter, + foreignKeyFilter, indexFilter ); } @@ -150,6 +160,8 @@ final class FilteredMeta extends AbstractMeta { domainFilter, sequenceFilter, primaryKeyFilter, + uniqueKeyFilter, + foreignKeyFilter, indexFilter ); } @@ -164,6 +176,8 @@ final class FilteredMeta extends AbstractMeta { domainFilter != null ? new And<>(domainFilter, filter) : filter, sequenceFilter, primaryKeyFilter, + uniqueKeyFilter, + foreignKeyFilter, indexFilter ); } @@ -178,6 +192,8 @@ final class FilteredMeta extends AbstractMeta { domainFilter, sequenceFilter != null ? new And<>(sequenceFilter, filter) : filter, primaryKeyFilter, + uniqueKeyFilter, + foreignKeyFilter, indexFilter ); } @@ -192,6 +208,40 @@ final class FilteredMeta extends AbstractMeta { domainFilter, sequenceFilter, primaryKeyFilter != null ? new And<>(primaryKeyFilter, filter) : filter, + uniqueKeyFilter, + foreignKeyFilter, + indexFilter + ); + } + + @Override + public final Meta filterUniqueKeys(Predicate> filter) { + return new FilteredMeta( + meta, + catalogFilter, + schemaFilter, + tableFilter, + domainFilter, + sequenceFilter, + primaryKeyFilter, + uniqueKeyFilter != null ? new And<>(uniqueKeyFilter, filter) : filter, + foreignKeyFilter, + indexFilter + ); + } + + @Override + public final Meta filterForeignKeys(Predicate> filter) { + return new FilteredMeta( + meta, + catalogFilter, + schemaFilter, + tableFilter, + domainFilter, + sequenceFilter, + primaryKeyFilter, + uniqueKeyFilter, + foreignKeyFilter != null ? new And<>(foreignKeyFilter, filter) : filter, indexFilter ); } @@ -206,6 +256,8 @@ final class FilteredMeta extends AbstractMeta { domainFilter, sequenceFilter, primaryKeyFilter, + uniqueKeyFilter, + foreignKeyFilter, indexFilter != null ? new And<>(indexFilter, filter) : filter ); } @@ -348,8 +400,9 @@ final class FilteredMeta extends AbstractMeta { if (uniqueKeys == null) { uniqueKeys = new ArrayList<>(); - for (UniqueKey key : delegate.getUniqueKeys()) - uniqueKeys.add(key(key)); + for (UniqueKey uk : delegate.getUniqueKeys()) + if (uniqueKeyFilter == null || uniqueKeyFilter.test(uk)) + uniqueKeys.add(key(uk)); UniqueKey pk = delegate.getPrimaryKey(); if (pk != null) @@ -389,10 +442,16 @@ final class FilteredMeta extends AbstractMeta { fkLoop: for (ForeignKey fk : delegate.getReferences()) { - UniqueKey uk = lookupUniqueKey(fk); + if (foreignKeyFilter != null && !foreignKeyFilter.test(fk)) + continue fkLoop; + UniqueKey uk = lookupUniqueKey(fk); if (uk == null) continue fkLoop; + else if (uk.isPrimary() && primaryKeyFilter != null && !primaryKeyFilter.test(uk)) + continue fkLoop; + else if (!uk.isPrimary() && uniqueKeyFilter != null && !uniqueKeyFilter.test(uk)) + continue fkLoop; TableField[] fields1 = fk.getFieldsArray(); TableField[] fields2 = new TableField[fields1.length];