From 7606c434d493b64db8cb0c99a637a5d66094ea69 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 19 Jan 2021 19:33:11 +0100 Subject: [PATCH] [jOOQ/jOOQ#11254] Add lambda constructor in CustomField, CustomCondition, CustomQueryPart --- jOOQ/src/main/java/org/jooq/impl/BoolAnd.java | 12 ++-- jOOQ/src/main/java/org/jooq/impl/BoolOr.java | 12 ++-- .../java/org/jooq/impl/CustomCondition.java | 15 +++++ .../main/java/org/jooq/impl/CustomField.java | 22 +++++++ .../java/org/jooq/impl/CustomQueryPart.java | 15 +++++ .../java/org/jooq/impl/JSONObjectAgg.java | 21 +++--- jOOQ/src/main/java/org/jooq/impl/Product.java | 56 +++++++--------- .../java/org/jooq/impl/SelectQueryImpl.java | 64 +++++++++---------- jOOQ/src/main/java/org/jooq/impl/Tools.java | 9 +-- 9 files changed, 123 insertions(+), 103 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java b/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java index ec45d2e745..6bca03dadc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java +++ b/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java @@ -78,7 +78,6 @@ final class BoolAnd extends DefaultAggregateFunction { } } - @SuppressWarnings("serial") @Override public final void accept(Context ctx) { switch (ctx.family()) { @@ -93,13 +92,10 @@ final class BoolAnd extends DefaultAggregateFunction { break; default: - final Field max = DSL.field("{0}", Integer.class, new CustomQueryPart() { - @Override - public void accept(Context c) { - c.visit(DSL.min(DSL.when(condition, one()).otherwise(zero()))); - acceptOverClause(c); - } - }); + final Field max = DSL.field("{0}", Integer.class, CustomQueryPart.of(c -> { + c.visit(DSL.min(DSL.when(condition, one()).otherwise(zero()))); + acceptOverClause(c); + })); ctx.visit(DSL.field(max.eq(one()))); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/BoolOr.java b/jOOQ/src/main/java/org/jooq/impl/BoolOr.java index 4b83c3040d..ff9a9a00c9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BoolOr.java +++ b/jOOQ/src/main/java/org/jooq/impl/BoolOr.java @@ -78,7 +78,6 @@ final class BoolOr extends DefaultAggregateFunction { } } - @SuppressWarnings("serial") @Override public final void accept(Context ctx) { switch (ctx.family()) { @@ -93,13 +92,10 @@ final class BoolOr extends DefaultAggregateFunction { break; default: - final Field max = DSL.field("{0}", Integer.class, new CustomQueryPart() { - @Override - public void accept(Context c) { - c.visit(DSL.max(DSL.when(condition, one()).otherwise(zero()))); - acceptOverClause(c); - } - }); + final Field max = DSL.field("{0}", Integer.class, CustomQueryPart.of(c -> { + c.visit(DSL.max(DSL.when(condition, one()).otherwise(zero()))); + acceptOverClause(c); + })); ctx.visit(DSL.field(max.eq(one()))); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java b/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java index fd2c8cceef..e5e89bc7c0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/CustomCondition.java @@ -39,6 +39,8 @@ package org.jooq.impl; import static org.jooq.Clause.CUSTOM; +import java.util.function.Consumer; + import org.jooq.Clause; import org.jooq.Condition; import org.jooq.Context; @@ -66,6 +68,19 @@ public abstract class CustomCondition extends AbstractCondition { protected CustomCondition() {} + /** + * Create a {@link CustomCondition} from a lambda expression. + */ + @SuppressWarnings("serial") + public static final CustomCondition of(Consumer> consumer) { + return new CustomCondition() { + @Override + public void accept(Context ctx) { + consumer.accept(ctx); + } + }; + } + // ------------------------------------------------------------------------- // Implementation required // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/CustomField.java b/jOOQ/src/main/java/org/jooq/impl/CustomField.java index ad4acc68a8..7fa2113d55 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CustomField.java +++ b/jOOQ/src/main/java/org/jooq/impl/CustomField.java @@ -39,6 +39,8 @@ package org.jooq.impl; import static org.jooq.Clause.CUSTOM; +import java.util.function.Consumer; + import org.jooq.Clause; import org.jooq.Condition; import org.jooq.Context; @@ -75,6 +77,26 @@ public abstract class CustomField extends AbstractField { super(name, type); } + /** + * Create a {@link CustomField} from a lambda expression. + */ + public static final CustomField of(String name, DataType type, Consumer> consumer) { + return of(DSL.name(name), type, consumer); + } + + /** + * Create a {@link CustomField} from a lambda expression. + */ + @SuppressWarnings("serial") + public static final CustomField of(Name name, DataType type, Consumer> consumer) { + return new CustomField(name, type) { + @Override + public void accept(Context ctx) { + consumer.accept(ctx); + } + }; + } + // ------------------------------------------------------------------------- // Implementation required // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java b/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java index c497449891..d695e4517c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java +++ b/jOOQ/src/main/java/org/jooq/impl/CustomQueryPart.java @@ -39,6 +39,8 @@ package org.jooq.impl; import static org.jooq.Clause.CUSTOM; +import java.util.function.Consumer; + import org.jooq.Clause; import org.jooq.Condition; import org.jooq.Context; @@ -79,6 +81,19 @@ public abstract class CustomQueryPart extends AbstractQueryPart { protected CustomQueryPart() { } + /** + * Create a {@link CustomQueryPart} from a lambda expression. + */ + @SuppressWarnings("serial") + public static final CustomQueryPart of(Consumer> consumer) { + return new CustomQueryPart() { + @Override + public void accept(Context ctx) { + consumer.accept(ctx); + } + }; + } + // ------------------------------------------------------------------------- // Implementation required // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java b/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java index be415e561d..4434cc33de 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObjectAgg.java @@ -157,18 +157,15 @@ implements JSONObjectAggNullStep { } final Field value1 = value; - final Field listagg = DSL.field("{0}", String.class, new CustomQueryPart() { - @Override - public void accept(Context c) { - c.visit(groupConcat(DSL.concat( - inline('"'), - DSL.replace(entry.key(), inline('"'), inline("\\\"")), - inline("\":"), - nullType == ABSENT_ON_NULL ? value1 : DSL.coalesce(value1, inline("null")) - ))); - acceptOverClause(c); - } - }); + final Field listagg = DSL.field("{0}", String.class, CustomQueryPart.of(c -> { + c.visit(groupConcat(DSL.concat( + inline('"'), + DSL.replace(entry.key(), inline('"'), inline("\\\"")), + inline("\":"), + nullType == ABSENT_ON_NULL ? value1 : DSL.coalesce(value1, inline("null")) + ))); + acceptOverClause(c); + })); ctx.sql('(').visit(DSL.concat(inline('{'), listagg, inline('}'))).sql(')'); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Product.java b/jOOQ/src/main/java/org/jooq/impl/Product.java index bb6f5a5458..1b6836eccd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Product.java +++ b/jOOQ/src/main/java/org/jooq/impl/Product.java @@ -73,51 +73,39 @@ final class Product extends AbstractAggregateFunction { final Field f = (Field) DSL.field("{0}", arguments.get(0).getDataType(), arguments.get(0)); final Field negatives = DSL.when(f.lt(zero()), inline(-1)); - @SuppressWarnings("serial") - Field negativesSum = new CustomField("sum", NUMERIC) { - @Override - public void accept(Context c) { - c.visit(distinct - ? DSL.sumDistinct(negatives) - : DSL.sum(negatives)); + Field negativesSum = CustomField.of("sum", NUMERIC, c -> { + c.visit(distinct + ? DSL.sumDistinct(negatives) + : DSL.sum(negatives)); - acceptFilterClause(c); - acceptOverClause(c); - } - }; + acceptFilterClause(c); + acceptOverClause(c); + }); - @SuppressWarnings("serial") - Field zerosSum = new CustomField("sum", NUMERIC) { - @Override - public void accept(Context c) { - c.visit(DSL.sum(choose(f).when(zero(), one()))); + Field zerosSum = CustomField.of("sum", NUMERIC, c -> { + c.visit(DSL.sum(choose(f).when(zero(), one()))); - acceptFilterClause(c); - acceptOverClause(c); - } - }; + acceptFilterClause(c); + acceptOverClause(c); + }); - @SuppressWarnings("serial") - Field logarithmsSum = new CustomField("sum", NUMERIC) { - @Override - public void accept(Context c) { - Field abs = DSL.abs(DSL.nullif(f, zero())); - Field ln = + Field logarithmsSum = CustomField.of("sum", NUMERIC, c -> { + Field abs = DSL.abs(DSL.nullif(f, zero())); + Field ln = - DSL.ln(abs); + DSL.ln(abs); - c.visit(distinct - ? DSL.sumDistinct(ln) - : DSL.sum(ln)); + c.visit(distinct + ? DSL.sumDistinct(ln) + : DSL.sum(ln)); - acceptFilterClause(c); - acceptOverClause(c); - } - }; + acceptFilterClause(c); + acceptOverClause(c); + }); ctx.visit(imul( when(zerosSum.gt(inline(BigDecimal.ZERO)), zero()) diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 930430055e..8f1d39540e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -1595,46 +1595,42 @@ final class SelectQueryImpl extends AbstractResultQuery imp (Field) null ); - alternativeFields[alternativeFields.length - 1] = - new CustomField("rn", SQLDataType.INTEGER) { - @Override - public void accept(Context c) { - boolean wrapQueryExpressionBodyInDerivedTable = wrapQueryExpressionBodyInDerivedTable(c); + alternativeFields[alternativeFields.length - 1] = CustomField.of("rn", SQLDataType.INTEGER, c -> { + boolean wrapQueryExpressionBodyInDerivedTable = wrapQueryExpressionBodyInDerivedTable(c); - // [#3575] Ensure that no column aliases from the surrounding SELECT clause - // are referenced from the below ranking functions' ORDER BY clause. - c.data(DATA_UNALIAS_ALIASED_EXPRESSIONS, !wrapQueryExpressionBodyInDerivedTable); + // [#3575] Ensure that no column aliases from the surrounding SELECT clause + // are referenced from the below ranking functions' ORDER BY clause. + c.data(DATA_UNALIAS_ALIASED_EXPRESSIONS, !wrapQueryExpressionBodyInDerivedTable); - boolean q = c.qualify(); + boolean q = c.qualify(); - c.data(DATA_OVERRIDE_ALIASES_IN_ORDER_BY, new Object[] { originalFields, alternativeFields }); - if (wrapQueryExpressionBodyInDerivedTable) - c.qualify(false); + c.data(DATA_OVERRIDE_ALIASES_IN_ORDER_BY, new Object[] { originalFields, alternativeFields }); + if (wrapQueryExpressionBodyInDerivedTable) + c.qualify(false); - // [#2580] FETCH NEXT n ROWS ONLY emulation: - // ----------------------------------------- - // When DISTINCT is applied, we mustn't use ROW_NUMBER() OVER(), - // which changes the DISTINCT semantics. Instead, use DENSE_RANK() OVER(), - // ordering by the SELECT's ORDER BY clause AND all the expressions from - // the projection - // - // [#6197] FETCH NEXT n ROWS WITH TIES emulation: - // ---------------------------------------------- - // DISTINCT seems irrelevant here (to be proven) + // [#2580] FETCH NEXT n ROWS ONLY emulation: + // ----------------------------------------- + // When DISTINCT is applied, we mustn't use ROW_NUMBER() OVER(), + // which changes the DISTINCT semantics. Instead, use DENSE_RANK() OVER(), + // ordering by the SELECT's ORDER BY clause AND all the expressions from + // the projection + // + // [#6197] FETCH NEXT n ROWS WITH TIES emulation: + // ---------------------------------------------- + // DISTINCT seems irrelevant here (to be proven) - c.visit(getLimit().withTies() - ? DSL.rank().over(orderBy(getNonEmptyOrderBy(c.configuration()))) - : distinct - ? DSL.denseRank().over(orderBy(getNonEmptyOrderByForDistinct(c.configuration()))) - : DSL.rowNumber().over(orderBy(getNonEmptyOrderBy(c.configuration()))) - ); + c.visit(getLimit().withTies() + ? DSL.rank().over(orderBy(getNonEmptyOrderBy(c.configuration()))) + : distinct + ? DSL.denseRank().over(orderBy(getNonEmptyOrderByForDistinct(c.configuration()))) + : DSL.rowNumber().over(orderBy(getNonEmptyOrderBy(c.configuration()))) + ); - c.data().remove(DATA_UNALIAS_ALIASED_EXPRESSIONS); - c.data().remove(DATA_OVERRIDE_ALIASES_IN_ORDER_BY); - if (wrapQueryExpressionBodyInDerivedTable) - c.qualify(q); - } - }.as("rn"); + c.data().remove(DATA_UNALIAS_ALIASED_EXPRESSIONS); + c.data().remove(DATA_OVERRIDE_ALIASES_IN_ORDER_BY); + if (wrapQueryExpressionBodyInDerivedTable) + c.qualify(q); + }).as("rn"); // v1 as ID, v2 as ID, v3 as TITLE final Field[] unaliasedFields = Tools.unaliasedFields(originalFields); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 19aa851a3d..5dcd116d64 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -1892,13 +1892,8 @@ final class Tools { return result; } - static final Field inlined(final Field field) { - return new CustomField(field.getQualifiedName(), field.getDataType()) { - @Override - public void accept(Context ctx) { - ctx.visit(field, INLINED); - } - }; + static final Field inlined(Field field) { + return CustomField.of(field.getQualifiedName(), field.getDataType(), c -> c.visit(field, INLINED)); } static final IllegalArgumentException indexFail(Row row, Field field) {