From 44fab52c36fb5d6021ee5179f898061cafc920b5 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 26 Feb 2024 19:29:46 +0100 Subject: [PATCH] [jOOQ/jOOQ#579] Add NamedCheckField Like SimpleCheckQueryPart for SimpleQueryPart, a new NamedCheckField for NamedField contents has been added for cases like Coerce, which are wrappers for something that could be a NamedField. --- jOOQ/src/main/java/org/jooq/impl/Coerce.java | 6 ++ .../java/org/jooq/impl/ConditionAsField.java | 6 ++ .../java/org/jooq/impl/FieldCondition.java | 6 ++ .../main/java/org/jooq/impl/FieldProxy.java | 6 ++ .../java/org/jooq/impl/NamedCheckField.java | 63 +++++++++++++++++++ .../java/org/jooq/impl/SelectQueryImpl.java | 1 + jOOQ/src/main/java/org/jooq/impl/Tools.java | 5 ++ 7 files changed, 93 insertions(+) create mode 100644 jOOQ/src/main/java/org/jooq/impl/NamedCheckField.java diff --git a/jOOQ/src/main/java/org/jooq/impl/Coerce.java b/jOOQ/src/main/java/org/jooq/impl/Coerce.java index 2c46bb2dbd..0c922db7b2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Coerce.java +++ b/jOOQ/src/main/java/org/jooq/impl/Coerce.java @@ -58,6 +58,7 @@ extends AbstractField implements AutoAlias>, + NamedCheckField, QOM.Coerce { @@ -69,6 +70,11 @@ implements this.field = (AbstractField) Tools.uncoerce(field); } + @Override + public final boolean hasName(Context ctx) { + return Tools.hasName(ctx, field); + } + @Override public final void accept(Context ctx) { ctx.visit(field); diff --git a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java index 0e737a0fef..35b67e02f1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java @@ -69,6 +69,7 @@ final class ConditionAsField extends AbstractField implements + NamedCheckField, QOM.ConditionAsField { @@ -142,6 +143,11 @@ implements + @Override + public final boolean hasName(Context ctx) { + return Tools.hasName(ctx, condition); + } + // ------------------------------------------------------------------------- // XXX: Query Object Model // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java b/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java index 6d78a7d2d0..74b23364b7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldCondition.java @@ -69,6 +69,7 @@ final class FieldCondition extends AbstractCondition implements + NamedCheckField, QOM.FieldCondition { @@ -125,6 +126,11 @@ implements + @Override + public final boolean hasName(Context ctx) { + return Tools.hasName(ctx, field); + } + // ------------------------------------------------------------------------- // XXX: Query Object Model // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldProxy.java b/jOOQ/src/main/java/org/jooq/impl/FieldProxy.java index a0186e10a0..9c8745f3e2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldProxy.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldProxy.java @@ -60,6 +60,7 @@ extends implements TableField, UProxy>, + NamedCheckField, ScopeMappable { @@ -96,6 +97,11 @@ implements this.position = position; } + @Override + public final boolean hasName(Context ctx) { + return Tools.hasName(ctx, delegate); + } + final int position() { return position; } diff --git a/jOOQ/src/main/java/org/jooq/impl/NamedCheckField.java b/jOOQ/src/main/java/org/jooq/impl/NamedCheckField.java new file mode 100644 index 0000000000..4d6a99402d --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/NamedCheckField.java @@ -0,0 +1,63 @@ +/* + * 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 org.jooq.Context; +import org.jooq.DataType; +import org.jooq.Field; +import org.jooq.TableField; + +/** + * A marker interface for fields that are capable of generating fields whose + * name is defined. + *

+ * Unlike {@link NamedField}, which marks fields that have a name defined, + * unconditionally, this allows for checking whether a {@link Field} has {@link #hasName()}. + * + * @author Lukas Eder + */ +interface NamedCheckField extends Field { + + /** + * Whether the field really has a name defined, e.g. a + * {@link Field#coerce(DataType)} expression on a {@link TableField}. + */ + default boolean hasName(Context ctx) { + return false; + } +} diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index f203bc30c5..e2d3cc3cf3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -210,6 +210,7 @@ import static org.jooq.impl.Tools.containsUnaliasedTable; import static org.jooq.impl.Tools.fieldArray; import static org.jooq.impl.Tools.hasAmbiguousNames; import static org.jooq.impl.Tools.hasAmbiguousNamesInTables; +import static org.jooq.impl.Tools.hasName; import static org.jooq.impl.Tools.isEmpty; import static org.jooq.impl.Tools.isNotEmpty; import static org.jooq.impl.Tools.isWindow; diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 37834368b1..6022fb2f95 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3995,6 +3995,11 @@ final class Tools { return true; } + static final boolean hasName(Context ctx, Field field) { + return field instanceof NamedField + || field instanceof NamedCheckField && ((NamedCheckField) field).hasName(ctx); + } + static final boolean isRendersSeparator(QueryPart part) { return part instanceof SeparatedQueryPart && ((SeparatedQueryPart) part).rendersSeparator(); }