diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index c5e1c9e4a4..5a59eb0257 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -18575,7 +18575,7 @@ public class DSL { */ @Support({ H2, POSTGRES }) public static AggregateFunction mode(Field field) { - return new DefaultAggregateFunction<>(Term.MODE, nullSafeDataType(field), field); + return new Mode(nullSafe(field)); } /** @@ -18890,7 +18890,7 @@ public class DSL { */ @Support({ H2, POSTGRES }) public static OrderedAggregateFunctionOfDeferredType mode() { - return new Mode(); + return new ModeDeferred(); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/DefaultAggregateFunction.java index ded638be0c..995f0c72cf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultAggregateFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultAggregateFunction.java @@ -38,10 +38,6 @@ package org.jooq.impl; -// ... -import static org.jooq.SQLDialect.H2; -import static org.jooq.SQLDialect.POSTGRES; -import static org.jooq.impl.DSL.mode; import static org.jooq.impl.Keywords.K_DENSE_RANK; import static org.jooq.impl.Keywords.K_FIRST; import static org.jooq.impl.Keywords.K_KEEP; @@ -49,7 +45,6 @@ import static org.jooq.impl.Keywords.K_LAST; import static org.jooq.impl.Keywords.K_NULL; import static org.jooq.impl.Keywords.K_ORDER_BY; import static org.jooq.impl.Keywords.K_WITHIN_GROUP; -import static org.jooq.impl.Term.MODE; import org.jooq.Context; import org.jooq.DataType; @@ -107,16 +102,11 @@ class DefaultAggregateFunction extends AbstractAggregateFunction { @Override public /* final */ void accept(Context ctx) { - if (term == MODE && ( ctx.family() == H2 || ctx.family() == POSTGRES)) { - ctx.visit(mode().withinGroupOrderBy(DSL.field("{0}", arguments.get(0)))); - } - else { - toSQLArguments(ctx); - acceptKeepDenseRankOrderByClause(ctx); - acceptWithinGroupClause(ctx); - acceptFilterClause(ctx); - acceptOverClause(ctx); - } + toSQLArguments(ctx); + acceptKeepDenseRankOrderByClause(ctx); + acceptWithinGroupClause(ctx); + acceptFilterClause(ctx); + acceptOverClause(ctx); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Median.java b/jOOQ/src/main/java/org/jooq/impl/Median.java index 1fa1028e53..e8e0866490 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Median.java +++ b/jOOQ/src/main/java/org/jooq/impl/Median.java @@ -39,6 +39,7 @@ package org.jooq.impl; // ... import static org.jooq.SQLDialect.POSTGRES; +import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.percentileCont; import static org.jooq.impl.Names.N_MEDIAN; @@ -66,13 +67,8 @@ final class Median extends DefaultAggregateFunction { @Override public final void accept(Context ctx) { - if (EMULATE_WITH_PERCENTILES.contains(ctx.dialect())) { - Field[] fields = new Field[arguments.size()]; - for (int i = 0; i < fields.length; i++) - fields[i] = DSL.field("{0}", arguments.get(i)); - - ctx.visit(percentileCont(new BigDecimal("0.5")).withinGroupOrderBy(fields)); - } + if (EMULATE_WITH_PERCENTILES.contains(ctx.dialect())) + ctx.visit(percentileCont(inline(new BigDecimal("0.5"))).withinGroupOrderBy(arguments)); else super.accept(ctx); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Mode.java b/jOOQ/src/main/java/org/jooq/impl/Mode.java index ec537acfa7..e01daeb2e5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Mode.java +++ b/jOOQ/src/main/java/org/jooq/impl/Mode.java @@ -37,26 +37,38 @@ */ package org.jooq.impl; -import org.jooq.AggregateFilterStep; -import org.jooq.DataType; +// ... +import static org.jooq.SQLDialect.H2; +import static org.jooq.SQLDialect.POSTGRES; +import static org.jooq.impl.DSL.mode; +import static org.jooq.impl.Names.N_MODE; + +import java.util.Set; + +import org.jooq.Context; import org.jooq.Field; -import org.jooq.OrderField; -import org.jooq.OrderedAggregateFunctionOfDeferredType; +import org.jooq.SQLDialect; /** * @author Lukas Eder */ -final class Mode implements OrderedAggregateFunctionOfDeferredType { +final class Mode extends DefaultAggregateFunction { + + /** + * Generated UID + */ + private static final long serialVersionUID = 5204073215694477981L; + private static final Set EMULATE_AS_ORDERED_SET_AGG = SQLDialect.supportedBy(H2, POSTGRES); + + Mode(Field arg) { + super(false, N_MODE, arg.getDataType(), arg); + } - @SuppressWarnings("unchecked") @Override - public final AggregateFilterStep withinGroupOrderBy(OrderField field) { - DataType type = field instanceof SortFieldImpl - ? ((SortFieldImpl) field).getField().getDataType() - : field instanceof Field - ? ((AbstractField) field).getDataType() - : (DataType) SQLDataType.NUMERIC; - - return new DefaultAggregateFunction<>("mode", type).withinGroupOrderBy(field); + public void accept(Context ctx) { + if (EMULATE_AS_ORDERED_SET_AGG.contains(ctx.dialect())) + ctx.visit(mode().withinGroupOrderBy(arguments.get(0))); + else + super.accept(ctx); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ModeDeferred.java b/jOOQ/src/main/java/org/jooq/impl/ModeDeferred.java new file mode 100644 index 0000000000..f1a6a161da --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/ModeDeferred.java @@ -0,0 +1,62 @@ +/* + * 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.AggregateFilterStep; +import org.jooq.DataType; +import org.jooq.Field; +import org.jooq.OrderField; +import org.jooq.OrderedAggregateFunctionOfDeferredType; + +/** + * @author Lukas Eder + */ +final class ModeDeferred implements OrderedAggregateFunctionOfDeferredType { + + @SuppressWarnings("unchecked") + @Override + public final AggregateFilterStep withinGroupOrderBy(OrderField field) { + DataType type = field instanceof SortFieldImpl + ? ((SortFieldImpl) field).getField().getDataType() + : field instanceof Field + ? ((AbstractField) field).getDataType() + : (DataType) SQLDataType.NUMERIC; + + return new DefaultAggregateFunction<>("mode", type).withinGroupOrderBy(field); + } +} diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index 77d5ee8cca..0101e06147 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -95,6 +95,7 @@ final class Names { static final Name N_MD5 = DSL.unquotedName("md5"); static final Name N_MEDIAN = DSL.unquotedName("median"); static final Name N_MOD = DSL.unquotedName("mod"); + static final Name N_MODE = DSL.unquotedName("mode"); static final Name N_NEXTVAL = DSL.unquotedName("nextval"); static final Name N_NOT = DSL.unquotedName("not"); static final Name N_NTILE = DSL.unquotedName("ntile");