[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.
This commit is contained in:
Lukas Eder 2024-02-26 19:29:46 +01:00
parent e9d3564ebd
commit 44fab52c36
7 changed files with 93 additions and 0 deletions

View File

@ -58,6 +58,7 @@ extends
AbstractField<T>
implements
AutoAlias<Field<T>>,
NamedCheckField<T>,
QOM.Coerce<T>
{
@ -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);

View File

@ -69,6 +69,7 @@ final class ConditionAsField
extends
AbstractField<Boolean>
implements
NamedCheckField<Boolean>,
QOM.ConditionAsField
{
@ -142,6 +143,11 @@ implements
@Override
public final boolean hasName(Context<?> ctx) {
return Tools.hasName(ctx, condition);
}
// -------------------------------------------------------------------------
// XXX: Query Object Model
// -------------------------------------------------------------------------

View File

@ -69,6 +69,7 @@ final class FieldCondition
extends
AbstractCondition
implements
NamedCheckField<Boolean>,
QOM.FieldCondition
{
@ -125,6 +126,11 @@ implements
@Override
public final boolean hasName(Context<?> ctx) {
return Tools.hasName(ctx, field);
}
// -------------------------------------------------------------------------
// XXX: Query Object Model
// -------------------------------------------------------------------------

View File

@ -60,6 +60,7 @@ extends
implements
TableField<Record, T>,
UProxy<Field<T>>,
NamedCheckField<T>,
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;
}

View File

@ -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.
* <p>
* 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<T> extends Field<T> {
/**
* 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;
}
}

View File

@ -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;

View File

@ -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();
}