From 855cbff9bf60e62d15784fb2f763b66487ec327e Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 30 Dec 2021 14:38:52 +0100 Subject: [PATCH] [jOOQ/jOOQ#12425] Seal the UnmodifiableCollection hierarchy --- jOOQ/src/main/java/org/jooq/impl/QOM.java | 17 ++++- .../jooq/impl/QualifiedSelectFieldList.java | 72 +++++++++++++++++++ .../jooq/impl/QueryPartCollectionView.java | 14 +++- .../java/org/jooq/impl/QueryPartList.java | 14 +++- .../java/org/jooq/impl/QueryPartListView.java | 9 ++- .../java/org/jooq/impl/SelectQueryImpl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Tools.java | 24 ------- 7 files changed, 122 insertions(+), 30 deletions(-) create mode 100644 jOOQ/src/main/java/org/jooq/impl/QualifiedSelectFieldList.java diff --git a/jOOQ/src/main/java/org/jooq/impl/QOM.java b/jOOQ/src/main/java/org/jooq/impl/QOM.java index dc9d1670fd..5f3f602f38 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QOM.java +++ b/jOOQ/src/main/java/org/jooq/impl/QOM.java @@ -214,12 +214,25 @@ public final class QOM { /** * An unmodifiable {@link Collection} of {@link QueryPart} elements. */ - public interface UnmodifiableCollection extends org.jooq.QueryPart, java.util.Collection {} + public /* sealed */ interface UnmodifiableCollection + extends + org.jooq.QueryPart, + java.util.Collection + /* permits + UnmodifiableList, + QueryPartCollectionView */ + {} /** * An unmodifiable {@link List} of {@link QueryPart} elements. */ - public interface UnmodifiableList extends UnmodifiableCollection, java.util.List {} + public /* sealed */ interface UnmodifiableList + extends + UnmodifiableCollection, + java.util.List + /* permits + QueryPartListView */ + {} public /*sealed*/ interface With extends diff --git a/jOOQ/src/main/java/org/jooq/impl/QualifiedSelectFieldList.java b/jOOQ/src/main/java/org/jooq/impl/QualifiedSelectFieldList.java new file mode 100644 index 0000000000..1ca52f8dd0 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/QualifiedSelectFieldList.java @@ -0,0 +1,72 @@ +/* + * 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 + * + * http://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: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.impl; + +import org.jooq.Context; +import org.jooq.SelectFieldOrAsterisk; +import org.jooq.Table; + +/** + * @author Lukas Eder + */ +final class QualifiedSelectFieldList extends QueryPartList { + + private final Table table; + + QualifiedSelectFieldList(Table table, Iterable fields) { + this.table = table; + + for (SelectFieldOrAsterisk field : fields) + add(Tools.qualify(table, field)); + } + + @Override + public final boolean rendersContent(Context ctx) { + return super.rendersContent(ctx); + } + + @Override + protected final void toSQLEmptyList(Context context) { + table.asterisk(); + } + + @Override + public final boolean declaresFields() { + return true; + } +} \ No newline at end of file diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java index e2b508ad71..6abd0812f9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartCollectionView.java @@ -69,7 +69,19 @@ import org.jooq.impl.QOM.UnmodifiableCollection; * * @author Lukas Eder */ -class QueryPartCollectionView extends AbstractQueryPart implements UnmodifiableCollection, SimpleQueryPart, SeparatedQueryPart { +/* sealed */ class QueryPartCollectionView +extends + AbstractQueryPart +implements + UnmodifiableCollection, + SimpleQueryPart, + SeparatedQueryPart +/* permits + + + + QueryPartListView */ +{ final Collection wrapped; Boolean qualify; diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java index efcd2b126a..85b528076a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartList.java @@ -49,7 +49,19 @@ import org.jooq.QueryPart; /** * @author Lukas Eder */ -class QueryPartList extends QueryPartListView { +/* sealed */ class QueryPartList +extends + QueryPartListView +/* permits + CommonTableExpressionList, + GroupFieldList, + SelectFieldList, + SortFieldList, + TableList, + TopLevelCte, + WindowList, + QualifiedSelectFieldList */ +{ QueryPartList() { this((Collection) null); diff --git a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java index f0b96b65fa..f031ecedff 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java +++ b/jOOQ/src/main/java/org/jooq/impl/QueryPartListView.java @@ -55,7 +55,14 @@ import org.jooq.impl.QOM.UnmodifiableList; * * @author Lukas Eder */ -class QueryPartListView extends QueryPartCollectionView implements UnmodifiableList { +/* sealed */ class QueryPartListView +extends + QueryPartCollectionView +implements + UnmodifiableList +/* permits + QueryPartList */ +{ @SafeVarargs static final QueryPartListView wrap(T... wrappedList) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 508a4305b3..2454257777 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -1238,7 +1238,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp copy.limit.clear(); SelectLimitStep s1 = - DSL.select(qualify(table(name("t")), select)) + DSL.select(new QualifiedSelectFieldList(table(name("t")), select)) .from(copy.asTable("t")) .where(rn.eq(one())) .orderBy(map(orderBy, o -> unqualified(o))); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 9555a503b6..cf3721b8b4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -5671,30 +5671,6 @@ final class Tools { return anyMatch(fields, f -> !names.add(f.getName())); } - static final QueryPartList qualify(final Table table, Iterable fields) { - QueryPartList result = new QueryPartList() { - @Override - public final boolean rendersContent(Context ctx) { - return super.rendersContent(ctx); - } - - @Override - protected final void toSQLEmptyList(Context context) { - table.asterisk(); - } - - @Override - public final boolean declaresFields() { - return true; - } - }; - - for (SelectFieldOrAsterisk field : fields) - result.add(qualify(table, field)); - - return result; - } - static final SelectFieldOrAsterisk qualify(Table table, SelectFieldOrAsterisk field) { if (field instanceof Field) return qualify(table, (Field) field);