[jOOQ/jOOQ#12425] Add a new org.jooq.Replacer type

For better forward compatibility, let's introduce a wrapper type for replacement operations, rather than passing around its components individually (Predicate, Function)
This commit is contained in:
Lukas Eder 2021-12-31 16:05:28 +01:00
parent 7c3940985c
commit f55538ccd2
257 changed files with 570 additions and 1357 deletions

View File

@ -39,12 +39,11 @@ package org.jooq;
import java.io.Serializable;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import org.jooq.conf.Settings;
import org.jooq.impl.Internal;
import org.jooq.impl.QOM.NotYetImplementedException;
import org.jetbrains.annotations.NotNull;
@ -108,81 +107,89 @@ public interface QueryPart extends Serializable {
@Override
int hashCode();
// -------------------------------------------------------------------------
// XXX: Query Object Model
// -------------------------------------------------------------------------
/**
* Traverser this {@link QueryPart} expression tree using a composable
* {@link Traverser}, producing a result.
* <p>
* This offers a generic way to traverse expression trees to translate the
* tree to arbitrary other data structures. The simplest traversal would
* just count all the tree elements:
* <p>
* <code><pre>
* int count = CUSTOMER.NAME.eq(1).$traverse(0, (i, p) -> i + 1);
* </pre></code>
* <p>
* The same can be achieved by translating the JDK {@link Collector} API to
* the {@link Traverser} API using {@link Traversers#collecting(Collector)}.
* <p>
* <code><pre>
* CUSTOMER.NAME.eq(1).$traverse(Traversers.collecting(Collectors.counting()));
* </pre></code>
* <p>
* Unlike a {@link Collector}, a {@link Traverser} is optimised for tree
* traversal, not stream traversal:
* <ul>
* <li>Is not designed for parallelism</li>
* <li>It can {@link Traverser#abort()} traversal early when the result can
* be produced early (e.g. when running
* {@link Traversers#containing(QueryPart)}, and a result has been
* found).</li>
* <li>It can decide whether to {@link Traverser#recurse()} into a
* {@link QueryPart} subtree, or whether that is not necessary or even
* undesirable, e.g. to prevent entering new subquery scopes.</li>
* <li>Unlike a Collector, which can use its {@link Collector#accumulator()}
* to accumulate each element only once, in tree traversal, it's desirable
* to be able to distinguish between accumulating an item
* {@link Traverser#before()} or {@link Traverser#after()} recursing into
* it. This is useful e.g. to wrap each tree node in XML opening and closing
* tags.</li>
* </ul>
* <p>
* This is a commercial jOOQ edition only feature.
*/
default <R> R $traverse(Traverser<?, R> traverser) {
Internal.requireCommercial(() -> "Query object model traversal is available in the commercial jOOQ distribution only. Please consider upgrading to the jOOQ Professional Edition or jOOQ Enterprise Edition.");
throw new NotYetImplementedException();
}
/**
* Traverse a {@link QueryPart} hierarchy and recursively replace its
* elements by alternatives.
* <p>
* This is a commercial jOOQ edition only feature.
*
* @param recurse A predicate to decide whether to recurse into a
* {@link QueryPart} subtree.
* @param replacement The replacement function. Replacement continues
* recursively until the function returns null or its input for
* any given input.
*/
@NotNull
default QueryPart $replace(
Predicate<? super QueryPart> recurse,
Function1<? super QueryPart, ? extends QueryPart> replacement
) {
Internal.requireCommercial(() -> "Query object model traversal is available in the commercial jOOQ distribution only. Please consider upgrading to the jOOQ Professional Edition or jOOQ Enterprise Edition.");
throw new NotYetImplementedException();
}
/**
* Convenience method for {@link #$replace(Predicate, Function1)}.
*/
@NotNull
default QueryPart $replace(Function1<? super QueryPart, ? extends QueryPart> replacement) {
return $replace(p -> true, replacement);
}
}

View File

@ -0,0 +1,117 @@
/*
* 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;

View File

@ -37,164 +37,172 @@
*/
package org.jooq;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Stream;
/**
* An API for {@link QueryPart#$traverse(Traverser)} query part traversals.
* <p>
* Similar to a {@link Collector} for {@link Stream#collect(Collector)}, this
* type wraps:
* <p>
* <ul>
* <li>{@link #supplier()}</li>
* <li>{@link #abort()}</li>
* <li>{@link #recurse()}</li>
* <li>{@link #before()}</li>
* <li>{@link #after()}</li>
* <li>{@link #finisher()}</li>
* </ul>
*/
public interface Traverser<A, R> {
/**
* Convenience method to create a {@link Traverser} with a
* {@link #supplier()} and {@link #before()}.
*/
static <R> Traverser<R, R> of(
Supplier<R> supplier,
BiFunction<? super R, ? super QueryPart, ? extends R> before
) {
return of(supplier, a -> false, q -> true, before, (a, q) -> a, a -> a);
}
/**
* Convenience method to create a {@link Traverser} with a
* {@link #supplier()}, {@link #before()}, and {@link #after()}.
*/
static <R> Traverser<R, R> of(
Supplier<R> supplier,
BiFunction<? super R, ? super QueryPart, ? extends R> before,
BiFunction<? super R, ? super QueryPart, ? extends R> after
) {
return of(supplier, a -> false, q -> true, before, after, a -> a);
}
/**
* Convenience method to create a {@link Traverser} with a
* {@link #supplier()}, {@link #abort()}, {@link #recurse()}, and
* {@link #before()}.
*/
static <R> Traverser<R, R> of(
Supplier<R> supplier,
Predicate<? super R> abort,
Predicate<? super QueryPart> recurse,
BiFunction<? super R, ? super QueryPart, ? extends R> before
) {
return of(supplier, abort, recurse, before, (a, q) -> a, a -> a);
}
/**
* Convenience method to create a {@link Traverser} with a
* {@link #supplier()}, {@link #abort()}, {@link #recurse()},
* {@link #before()}, and {@link #after()}
*/
static <R> Traverser<R, R> of(
Supplier<R> supplier,
Predicate<? super R> abort,
Predicate<? super QueryPart> recurse,
BiFunction<? super R, ? super QueryPart, ? extends R> before,
BiFunction<? super R, ? super QueryPart, ? extends R> after
) {
return of(supplier, abort, recurse, before, after, a -> a);
}
/**
* Convenience method to create a {@link Traverser} with a
* {@link #supplier()}, {@link #abort()}, {@link #recurse()},
* {@link #before()}, {@link #after()}, and {@link #finisher()}.
*/
@SuppressWarnings("unchecked")
static <A, R> Traverser<A, R> of(
Supplier<A> supplier,
Predicate<? super A> abort,
Predicate<? super QueryPart> recurse,
BiFunction<? super A, ? super QueryPart, ? extends A> before,
BiFunction<? super A, ? super QueryPart, ? extends A> after,
Function<? super A, ? extends R> finisher
) {
// The below casts can be considered safe as they can be replaced by
// respective x::test or x::apply method references turning variant
// versions of the functions into invariant ones.
return new Traverser<A, R>() {
@Override
public Supplier<A> supplier() {
return supplier;
}
@Override
public Predicate<A> abort() {
return (Predicate<A>) abort;
}
@Override
public Predicate<QueryPart> recurse() {
return (Predicate<QueryPart>) recurse;
}
@Override
public BiFunction<A, QueryPart, A> before() {
return (BiFunction<A, QueryPart, A>) before;
}
@Override
public BiFunction<A, QueryPart, A> after() {
return (BiFunction<A, QueryPart, A>) after;
}
@Override
public Function<A, R> finisher() {
return (Function<A, R>) finisher;
}
};
}
/**
* A supplier for a temporary data structure to accumulate {@link QueryPart}
* objects into during traversal.
*/
Supplier<A> supplier();
/**
* An optional traversal abort condition to short circuit traversal e.g.
* when the searched object has been found.
*/
Predicate<A> abort();
/**
* An optional traversal abort condition to short circuit traversal e.g.
* when the searched object has been found.
*/
Predicate<QueryPart> recurse();
/**
* A callback that is invoked before recursing into a subtree.
*/
BiFunction<A, QueryPart, A> before();
/**
* A callback that is invoked after recursing into a subtree.
*/
BiFunction<A, QueryPart, A> after();
/**
* An optional transformation function to turn the temporary data structure
* supplied by {@link #supplier()} into the final data structure.
*/
Function<A, R> finisher();
}

View File

@ -37,93 +37,100 @@
*/
package org.jooq;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collector;
import org.jetbrains.annotations.NotNull;
/**
* A set of {@link Traverser} constructor methods.
*
* @author Lukas Eder
*/
public final class Traversers {
/**
* A traverser constructed from a {@link Collector}.
*/
public static <T, R> Traverser<?, R> collecting(Collector<QueryPart, T, R> collector) {
return Traverser.of(
collector.supplier(),
t -> false,
p -> true,
(t, p) -> {
collector.accumulator().accept(t, p);
return t;
},
(t, p) -> t,
collector.finisher()
);
}
/**
* A traverser that checks whether a {@link QueryPart} contains another
* {@link QueryPart}.
*
* @param part The part to find within the traversed {@link QueryPart} tree.
*/
@NotNull
public static Traverser<?, Boolean> containing(QueryPart part) {
return Traverser.of(
() -> false,
b -> b,
p -> true,
(b, p) -> b || p.equals(part)
);
}
/**
* A traverser that finds any {@link QueryPart} that satisfies a predicate
* within the traversed {@link QueryPart} tree.
*
* @param predicate The predicate to use to check the traversed tree for a
* {@link QueryPart} to find.
*/
@NotNull
public static Traverser<?, Optional<QueryPart>> findingAny(Predicate<? super QueryPart> predicate) {
return Traverser.<QueryPart, Optional<QueryPart>>of(
() -> null,
p -> p != null,
p -> true,
(r, p) -> predicate.test(p) ? p : r,
(r, p) -> r,
Optional::ofNullable
);
}
/**
* A traverser that finds all {@link QueryPart}s that satisfy a predicate
* within the traversed {@link QueryPart} tree.
*
* @param predicate The predicate to use to check the traversed tree for
* {@link QueryPart}s to find.
*/
@NotNull
public static Traverser<?, List<QueryPart>> findingAll(Predicate<? super QueryPart> predicate) {
return Traverser.of(
() -> new ArrayList<>(),
(l, p) -> {
if (predicate.test(p))
l.add(p);
return l;
},
(l, p) -> l
);
}
private Traversers() {}
}

View File

@ -149,10 +149,6 @@ implements

View File

@ -92,7 +92,7 @@ import org.jooq.OrderedAggregateFunction;
import org.jooq.QueryPart;
import org.jooq.SQL;
import org.jooq.SQLDialect;
import org.jooq.Traverser;
// ...
import org.jooq.WindowBeforeOverStep;
/**

View File

@ -50,7 +50,8 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
@ -192,10 +193,6 @@ abstract class AbstractLeadLag<T> extends AbstractWindowFunction<T> {

View File

@ -61,11 +61,12 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.Record;
// ...
import org.jooq.Row;
import org.jooq.Row1;
import org.jooq.Row2;
import org.jooq.SelectField;
import org.jooq.Traverser;
// ...
import org.jooq.impl.QOM.UnmodifiableList;
import org.jooq.QueryPart;
@ -442,7 +443,4 @@ abstract class AbstractRow<R extends Record> extends AbstractQueryPart implement
}

View File

@ -66,7 +66,7 @@ import org.jooq.OrderField;
// ...
import org.jooq.QueryPart;
import org.jooq.SQLDialect;
import org.jooq.Traverser;
// ...
import org.jooq.WindowDefinition;
import org.jooq.WindowExcludeStep;
import org.jooq.WindowFinalStep;

View File

@ -165,10 +165,6 @@ implements

View File

@ -226,10 +226,6 @@ implements

View File

@ -561,10 +561,6 @@ implements

View File

@ -317,10 +317,6 @@ implements

View File

@ -248,10 +248,6 @@ implements

View File

@ -646,10 +646,6 @@ implements

View File

@ -296,10 +296,6 @@ implements

View File

@ -334,10 +334,6 @@ implements

View File

@ -173,10 +173,6 @@ implements

View File

@ -57,8 +57,9 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.QueryPart;
import org.jooq.Record;
// ...
import org.jooq.SQLDialect;
import org.jooq.Traverser;
// ...
import org.jooq.impl.QOM.UnmodifiableList;
/**
@ -130,7 +131,4 @@ final class Array<T> extends AbstractField<T[]> implements QOM.Array<T> {
}

View File

@ -196,10 +196,6 @@ implements

View File

@ -51,9 +51,10 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.QueryPart;
import org.jooq.Record1;
// ...
import org.jooq.Select;
import org.jooq.Table;
import org.jooq.Traverser;
// ...
/**
* @author Lukas Eder
@ -118,7 +119,4 @@ final class ArrayQuery<T> extends AbstractField<T[]> implements QOM.ArrayQuery<T
}

View File

@ -159,10 +159,6 @@ implements

View File

@ -161,10 +161,6 @@ implements

View File

@ -172,8 +172,6 @@ package org.jooq.impl;

View File

@ -55,8 +55,9 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.QueryPart;
// ...
import org.jooq.SQLDialect;
import org.jooq.Traverser;
// ...
import org.jooq.impl.QOM.UnmodifiableList;
/**
@ -135,7 +136,4 @@ final class AsteriskImpl extends AbstractQueryPart implements Asterisk {
}

View File

@ -156,10 +156,6 @@ implements

View File

@ -175,10 +175,6 @@ implements

View File

@ -136,10 +136,6 @@ implements

View File

@ -91,6 +91,7 @@ import org.jooq.RowN;
import org.jooq.SQLDialect;
import org.jooq.impl.QOM.Between;
import org.jooq.QueryPart;
// ...
/**
* @author Lukas Eder
@ -228,10 +229,6 @@ final class BetweenCondition<T> extends AbstractCondition implements BetweenAndS

View File

@ -326,10 +326,6 @@ implements

View File

@ -496,10 +496,6 @@ implements

View File

@ -180,10 +180,6 @@ implements

View File

@ -326,10 +326,6 @@ implements

View File

@ -331,10 +331,6 @@ implements

View File

@ -99,9 +99,10 @@ import org.jooq.Name;
// ...
import org.jooq.Query;
import org.jooq.QueryPart;
// ...
import org.jooq.SQLDialect;
import org.jooq.Statement;
import org.jooq.Traverser;
// ...
// ...
import org.jooq.conf.ParamType;
import org.jooq.impl.QOM.UnmodifiableList;
@ -610,7 +611,4 @@ final class BlockImpl extends AbstractRowCountQuery implements Block {
}

View File

@ -164,10 +164,6 @@ implements

View File

@ -165,10 +165,6 @@ implements

View File

@ -202,10 +202,6 @@ package org.jooq.impl;

View File

@ -149,10 +149,6 @@ implements

View File

@ -61,6 +61,7 @@ import org.jooq.Context;
import org.jooq.Field;
// ...
import org.jooq.Record1;
// ...
import org.jooq.Select;
import org.jooq.impl.QOM.UNotYetImplemented;

View File

@ -69,7 +69,8 @@ import org.jooq.LanguageContext;
// ...
import org.jooq.QueryPart;
import org.jooq.RenderContext.CastMode;
import org.jooq.Traverser;
// ...
// ...
import org.jooq.impl.QOM.UTransient;
/**
@ -377,10 +378,6 @@ final class Cast<T> extends AbstractField<T> implements QOM.Cast<T> {

View File

@ -54,8 +54,9 @@ import org.jooq.Context;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.Schema;
import org.jooq.Traverser;
// ...
import org.jooq.QueryPart;
// ...
import org.jooq.tools.StringUtils;
/**
@ -138,9 +139,6 @@ public class CatalogImpl extends AbstractNamed implements Catalog {
// ------------------------------------------------------------------------

View File

@ -168,10 +168,6 @@ implements

View File

@ -169,10 +169,6 @@ implements

View File

@ -169,10 +169,6 @@ implements

View File

@ -37,17 +37,14 @@
*/
package org.jooq.impl;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import org.jooq.Clause;
import org.jooq.Context;
import org.jooq.DataType;
import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -149,10 +146,6 @@ final class Coerce<T> extends AbstractField<T> implements QOM.Coerce<T> {

View File

@ -49,7 +49,8 @@ import org.jooq.DataType;
import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -113,7 +114,4 @@ final class Collated extends AbstractField<String> implements QOM.Collated {
}

View File

@ -329,10 +329,6 @@ implements

View File

@ -59,11 +59,12 @@ import org.jooq.Function1;
// ...
import org.jooq.QueryPart;
import org.jooq.Record;
// ...
import org.jooq.ResultQuery;
import org.jooq.SQLDialect;
import org.jooq.Select;
import org.jooq.TableOptions;
import org.jooq.Traverser;
// ...
import org.jooq.impl.QOM.Materialized;
import org.jooq.impl.Tools.DataKey;
@ -205,7 +206,4 @@ final class CommonTableExpressionImpl<R extends Record> extends AbstractTable<R>
}

View File

@ -172,10 +172,6 @@ implements

View File

@ -155,10 +155,6 @@ package org.jooq.impl;

View File

@ -182,8 +182,6 @@ package org.jooq.impl;

View File

@ -226,9 +226,6 @@ package org.jooq.impl;

View File

@ -169,10 +169,6 @@ implements

View File

@ -150,10 +150,6 @@ implements

View File

@ -177,10 +177,6 @@ implements

View File

@ -161,10 +161,6 @@ implements

View File

@ -153,10 +153,6 @@ implements

View File

@ -134,10 +134,6 @@ implements

View File

@ -43,8 +43,9 @@ import java.util.function.Predicate;
import org.jooq.Context;
import org.jooq.Function1;
import org.jooq.QueryPart;
// ...
import org.jooq.Table;
import org.jooq.Traverser;
// ...
import org.jooq.UniqueKey;
/**
@ -114,10 +115,6 @@ final class CountTable extends AbstractAggregateFunction<Integer> implements QOM

View File

@ -169,10 +169,6 @@ implements

View File

@ -169,10 +169,6 @@ implements

View File

@ -162,10 +162,6 @@ implements

View File

@ -282,10 +282,6 @@ implements

View File

@ -441,10 +441,6 @@ package org.jooq.impl;

View File

@ -487,10 +487,6 @@ implements

View File

@ -384,10 +384,6 @@ package org.jooq.impl;

View File

@ -217,10 +217,6 @@ implements

View File

@ -455,10 +455,6 @@ implements

View File

@ -719,10 +719,6 @@ package org.jooq.impl;

View File

@ -60,7 +60,8 @@ import org.jooq.conf.ParamType;
import org.jooq.impl.QOM.CreateType;
import org.jooq.impl.QOM.UnmodifiableList;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -150,7 +151,4 @@ final class CreateTypeImpl extends AbstractDDLQuery implements
}

View File

@ -87,12 +87,13 @@ import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.QueryPart;
import org.jooq.Record;
// ...
import org.jooq.ResultQuery;
import org.jooq.SQL;
import org.jooq.SQLDialect;
import org.jooq.Select;
import org.jooq.Table;
import org.jooq.Traverser;
// ...
import org.jooq.impl.QOM.CreateView;
import org.jooq.impl.QOM.UnmodifiableList;
@ -326,8 +327,5 @@ final class CreateViewImpl<R extends Record> extends AbstractDDLQuery implements
}

View File

@ -53,8 +53,9 @@ import org.jooq.Context;
import org.jooq.Function1;
// ...
import org.jooq.QueryPart;
// ...
import org.jooq.SQLDialect;
import org.jooq.Traverser;
// ...
import org.jooq.WindowSpecification;
/**
@ -109,10 +110,6 @@ final class CumeDist extends AbstractWindowFunction<BigDecimal> implements QOM.C

View File

@ -66,10 +66,11 @@ import org.jooq.Merge;
import org.jooq.Name;
import org.jooq.QueryPart;
import org.jooq.Record;
// ...
import org.jooq.SQLDialect;
import org.jooq.Table;
import org.jooq.TableOptions;
import org.jooq.Traverser;
// ...
import org.jooq.Update;
import org.jooq.impl.QOM.ResultOption;
@ -218,7 +219,4 @@ implements
}

View File

@ -474,10 +474,6 @@ implements

View File

@ -223,8 +223,6 @@ package org.jooq.impl;

View File

@ -47,6 +47,7 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.QueryPart;
// ...
/**
* A field that handles built-in functions, aggregate functions, and window
@ -88,7 +89,4 @@ final class DefaultAggregateFunction<T> extends AbstractAggregateFunction<T> {
}

View File

@ -177,10 +177,6 @@ implements

View File

@ -46,7 +46,8 @@ import java.util.function.Predicate;
import org.jooq.Context;
import org.jooq.Function1;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -90,10 +91,6 @@ final class DenseRank extends AbstractWindowFunction<Integer> implements QOM.Den

View File

@ -72,9 +72,10 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.ResultQuery;
import org.jooq.Traverser;
// ...
import org.jooq.impl.QOM.UnmodifiableList;
import org.jooq.QueryPart;
// ...
import org.jooq.impl.QOM.Materialized;
/**
@ -205,7 +206,4 @@ implements
}

View File

@ -166,10 +166,6 @@ implements

View File

@ -162,10 +162,6 @@ implements

View File

@ -217,10 +217,6 @@ implements

View File

@ -163,10 +163,6 @@ package org.jooq.impl;

View File

@ -259,10 +259,6 @@ implements

View File

@ -163,10 +163,6 @@ package org.jooq.impl;

View File

@ -252,10 +252,6 @@ implements

View File

@ -189,10 +189,6 @@ implements

View File

@ -241,10 +241,6 @@ implements

View File

@ -164,10 +164,6 @@ package org.jooq.impl;

View File

@ -58,7 +58,8 @@ import org.jooq.impl.QOM.Cascade;
import org.jooq.impl.QOM.DropType;
import org.jooq.impl.QOM.UnmodifiableList;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -151,8 +152,5 @@ implements
}

View File

@ -176,10 +176,6 @@ implements

View File

@ -182,10 +182,6 @@ package org.jooq.impl;

View File

@ -162,10 +162,6 @@ implements

View File

@ -184,8 +184,6 @@ package org.jooq.impl;

View File

@ -161,10 +161,6 @@ implements

View File

@ -82,7 +82,8 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Keyword;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -519,7 +520,4 @@ final class Extract extends AbstractField<Integer> implements QOM.Extract {
}

View File

@ -47,7 +47,8 @@ import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.Name;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -124,7 +125,4 @@ final class FieldAlias<T> extends AbstractField<T> implements QOM.FieldAlias<T>
}

View File

@ -159,10 +159,6 @@ implements

View File

@ -46,7 +46,8 @@ import org.jooq.Context;
import org.jooq.Field;
import org.jooq.Function1;
import org.jooq.QueryPart;
import org.jooq.Traverser;
// ...
// ...
/**
* @author Lukas Eder
@ -111,10 +112,6 @@ final class FirstValue<T> extends AbstractWindowFunction<T> implements QOM.First

Some files were not shown because too many files have changed in this diff Show More