diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingTable.java new file mode 100644 index 0000000000..c722641dac --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDelegatingTable.java @@ -0,0 +1,106 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: https://www.jooq.org/legal/licensing + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.impl; + +import java.util.List; + +import org.jooq.ForeignKey; +import org.jooq.Name; +import org.jooq.Record; +import org.jooq.Table; +import org.jooq.impl.QOM.Aliasable; + +/** + * @author Lukas Eder + */ +abstract class AbstractDelegatingTable extends AbstractTable { + + final AbstractTable delegate; + + AbstractDelegatingTable(AbstractTable delegate) { + super(delegate.getOptions(), delegate.getQualifiedName(), delegate.getSchema()); + + this.delegate = delegate; + } + + abstract AbstractDelegatingTable construct(AbstractTable newDelegate); + + @Override + public final boolean declaresTables() { + return true; + } + + @Override + public final Class getRecordType() { + return delegate.getRecordType(); + } + + @Override + public final Table as(Name alias) { + return construct(new TableAlias<>(delegate, alias)); + } + + @Override + public final Table as(Name alias, Name... fieldAliases) { + return construct(new TableAlias<>(delegate, alias, fieldAliases)); + } + + @Override + public final List> getReferences() { + return delegate.getReferences(); + } + + @Override + final FieldsImpl fields0() { + return delegate.fields0(); + } + + // ------------------------------------------------------------------------- + // XXX: Query Object Model + // ------------------------------------------------------------------------- + + @Override + public final Table $aliased() { + return construct((AbstractTable) ((Aliasable>) delegate).$aliased()); + } + + @Override + public final Name $alias() { + return ((Aliasable>) delegate).$alias(); + } +} diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java index 3f0c8db76c..d799472670 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractTable.java @@ -64,6 +64,7 @@ import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.EMPTY_NAME; import static org.jooq.impl.Tools.map; import static org.jooq.impl.Tools.traverseJoins; +import static org.jooq.impl.Tools.unwrap; import java.sql.Timestamp; import java.util.ArrayList; @@ -598,17 +599,10 @@ implements for (ForeignKey reference : getReferences()) { traverseJoins(other, o -> { - if (o.equals(reference.getKey().getTable())) { + + // [#1460] [#6304] [#14387] In case the other table was aliased or otherwise wrapped + if (unwrap(o).equals(reference.getKey().getTable())) result.add((ForeignKey) reference); - } - - // [#1460] [#6304] In case the other table was aliased - else { - Table aliased = Tools.aliased(o); - - if (aliased != null && aliased.equals(reference.getKey().getTable())) - result.add((ForeignKey) reference); - } }); } diff --git a/jOOQ/src/main/java/org/jooq/impl/HintedTable.java b/jOOQ/src/main/java/org/jooq/impl/HintedTable.java index 35a738aaa5..10e87f48bd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/HintedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/HintedTable.java @@ -41,16 +41,13 @@ import org.jooq.Context; import org.jooq.Keyword; import org.jooq.Name; import org.jooq.Record; -import org.jooq.Table; -import org.jooq.impl.QOM.Aliasable; import org.jooq.impl.QOM.UNotYetImplemented; /** * @author Lukas Eder */ -final class HintedTable extends AbstractTable implements UNotYetImplemented { +final class HintedTable extends AbstractDelegatingTable implements UNotYetImplemented { - private final AbstractTable delegate; private final Keyword keywords; private final QueryPartList arguments; @@ -67,16 +64,15 @@ final class HintedTable extends AbstractTable implements UN } HintedTable(AbstractTable delegate, Keyword keywords, QueryPartList arguments) { - super(delegate.getOptions(), delegate.getQualifiedName(), delegate.getSchema()); + super(delegate); - this.delegate = delegate; this.keywords = keywords; this.arguments = arguments; } @Override - public final boolean declaresTables() { - return true; + final AbstractDelegatingTable construct(AbstractTable newDelegate) { + return new HintedTable(newDelegate, keywords, arguments); } @Override @@ -86,38 +82,4 @@ final class HintedTable extends AbstractTable implements UN .sql(" (").visit(arguments) .sql(')'); } - - @Override - public final Class getRecordType() { - return delegate.getRecordType(); - } - - @Override - public final Table as(Name alias) { - return new HintedTable<>(new TableAlias<>(delegate, alias), keywords, arguments); - } - - @Override - public final Table as(Name alias, Name... fieldAliases) { - return new HintedTable<>(new TableAlias<>(delegate, alias, fieldAliases), keywords, arguments); - } - - @Override - final FieldsImpl fields0() { - return delegate.fields0(); - } - - // ------------------------------------------------------------------------- - // XXX: Query Object Model - // ------------------------------------------------------------------------- - - @Override - public final Table $aliased() { - return new HintedTable((AbstractTable) ((Aliasable>) delegate).$aliased(), keywords, arguments); - } - - @Override - public final Name $alias() { - return ((Aliasable>) delegate).$alias(); - } } diff --git a/jOOQ/src/main/java/org/jooq/impl/LinkedTable.java b/jOOQ/src/main/java/org/jooq/impl/LinkedTable.java index f9008feabb..7c76441841 100644 --- a/jOOQ/src/main/java/org/jooq/impl/LinkedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/LinkedTable.java @@ -109,10 +109,6 @@ package org.jooq.impl; - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/PeriodTable.java b/jOOQ/src/main/java/org/jooq/impl/PeriodTable.java index 86f47d463c..da143244c4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/PeriodTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/PeriodTable.java @@ -40,32 +40,6 @@ package org.jooq.impl; -import static org.jooq.SQLDialect.HSQLDB; -// ... - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 11edcfa97c..30c869a982 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -6106,6 +6106,17 @@ final class Tools { return field instanceof Coerce f ? f.field : field; } + static final Table unwrap(Table table) { + Table r; + + if (table instanceof AbstractDelegatingTable t) + return unwrap(t.delegate); + else if ((r = unalias(table)) != table) + return unwrap(r); + else + return r; + } + static final Table aliased(Table table) { if (table instanceof TableImpl t) return t.getAliasedTable(); diff --git a/jOOQ/src/main/java/org/jooq/impl/WithTable.java b/jOOQ/src/main/java/org/jooq/impl/WithTable.java index 34a68da50c..182aa9eec9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WithTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/WithTable.java @@ -63,42 +63,6 @@ package org.jooq.impl; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -