diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java index a28040a4d6..61a541adc5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java @@ -282,4 +282,35 @@ implements return this; } + + /** + * Apply this aggregate function's FILTER and OVER + * clauses to an argument aggregate function. + */ + final Field fo(AggregateFunction function) { + WindowBeforeOverStep s1 = filter != null ? function.filterWhere(filter) : function; + + if (windowSpecification != null) + return s1.over(windowSpecification); + else if (windowDefinition != null) + return s1.over(windowDefinition); + else if (windowName != null) + return s1.over(windowName); + else + return s1; + } + + /** + * Type safe NVL2(y, x, null) for REGR emulations. + */ + final Field x(Field x, Field y) { + return DSL.nvl2(y, x, DSL.NULL(x.getDataType())); + } + + /** + * Type safe NVL2(x, y, null) for REGR emulations. + */ + final Field y(Field x, Field y) { + return DSL.nvl2(x, y, DSL.NULL(y.getDataType())); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java index c4f37ea199..a6dfa392b5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java +++ b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @Override + @SuppressWarnings("unchecked") + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java index f95d75637c..88d0e4e14c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java +++ b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @Override + @SuppressWarnings("unchecked") + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC))).div(fo(DSL.count(x.plus(y))).cast(NUMERIC).minus(DSL.inline(1)))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index 1b509cff02..e2612e3c10 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -18718,11 +18718,20 @@ public class DSL { // Aggregate functions // ------------------------------------------------------------------------- + /** + * The CORR function. + */ + @NotNull + @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) + public static AggregateFunction corr(Field y, Field x) { + return new Corr(y, x); + } + /** * The COVAR_SAMP function. */ @NotNull - @Support({ FIREBIRD, POSTGRES }) + @Support public static AggregateFunction covarSamp(Field y, Field x) { return new CovarSamp(y, x); } @@ -18731,7 +18740,7 @@ public class DSL { * The COVAR_POP function. */ @NotNull - @Support({ FIREBIRD, POSTGRES }) + @Support public static AggregateFunction covarPop(Field y, Field x) { return new CovarPop(y, x); } @@ -18749,7 +18758,7 @@ public class DSL { * The REGR_AVG_X function. */ @NotNull - @Support({ POSTGRES }) + @Support public static AggregateFunction regrAvgX(Field y, Field x) { return new RegrAvgx(y, x); } @@ -18758,7 +18767,7 @@ public class DSL { * The REGR_AVG_Y function. */ @NotNull - @Support({ POSTGRES }) + @Support public static AggregateFunction regrAvgY(Field y, Field x) { return new RegrAvgy(y, x); } @@ -18767,7 +18776,7 @@ public class DSL { * The REGR_COUNT function. */ @NotNull - @Support({ POSTGRES }) + @Support public static AggregateFunction regrCount(Field y, Field x) { return new RegrCount(y, x); } @@ -18776,7 +18785,7 @@ public class DSL { * The REGR_INTERCEPT function. */ @NotNull - @Support({ POSTGRES }) + @Support public static AggregateFunction regrIntercept(Field y, Field x) { return new RegrIntercept(y, x); } @@ -18785,7 +18794,7 @@ public class DSL { * The REGR_R2 function. */ @NotNull - @Support({ POSTGRES }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static AggregateFunction regrR2(Field y, Field x) { return new RegrR2(y, x); } @@ -18794,7 +18803,7 @@ public class DSL { * The REGR_SLOPE function. */ @NotNull - @Support({ POSTGRES }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static AggregateFunction regrSlope(Field y, Field x) { return new RegrSlope(y, x); } @@ -18803,7 +18812,7 @@ public class DSL { * The REGR_SXX function. */ @NotNull - @Support({ POSTGRES }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static AggregateFunction regrSXX(Field y, Field x) { return new RegrSxx(y, x); } @@ -18812,7 +18821,7 @@ public class DSL { * The REGR_SXY function. */ @NotNull - @Support({ POSTGRES }) + @Support public static AggregateFunction regrSXY(Field y, Field x) { return new RegrSxy(y, x); } @@ -18821,7 +18830,7 @@ public class DSL { * The REGR_SYY function. */ @NotNull - @Support({ POSTGRES }) + @Support({ CUBRID, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) public static AggregateFunction regrSYY(Field y, Field x) { return new RegrSyy(y, x); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Names.java b/jOOQ/src/main/java/org/jooq/impl/Names.java index f4999128fe..bb557a1175 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Names.java +++ b/jOOQ/src/main/java/org/jooq/impl/Names.java @@ -97,6 +97,7 @@ final class Names { static final Name N_CONNECT_BY_IS_LEAF = unquotedName("connect_by_isleaf"); static final Name N_CONNECT_BY_ROOT = unquotedName("connect_by_root"); static final Name N_CONVERT = unquotedName("convert"); + static final Name N_CORR = unquotedName("corr"); static final Name N_COS = unquotedName("cos"); static final Name N_COSH = unquotedName("cosh"); static final Name N_COT = unquotedName("cot"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index b6bb8b7541..4c04b2fad5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -107,6 +107,7 @@ import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.constraint; // ... // ... +import static org.jooq.impl.DSL.corr; import static org.jooq.impl.DSL.cos; import static org.jooq.impl.DSL.cosh; import static org.jooq.impl.DSL.cot; @@ -346,12 +347,6 @@ import static org.jooq.impl.DSL.xmlquery; import static org.jooq.impl.DSL.xmltable; import static org.jooq.impl.DSL.year; import static org.jooq.impl.DSL.zero; -import static org.jooq.impl.JSONOnNull.ABSENT_ON_NULL; -import static org.jooq.impl.JSONOnNull.NULL_ON_NULL; -import static org.jooq.impl.Keywords.K_DELETE; -import static org.jooq.impl.Keywords.K_INSERT; -import static org.jooq.impl.Keywords.K_SELECT; -import static org.jooq.impl.Keywords.K_UPDATE; import static org.jooq.impl.DefaultParseContext.Type.A; import static org.jooq.impl.DefaultParseContext.Type.B; import static org.jooq.impl.DefaultParseContext.Type.D; @@ -360,6 +355,12 @@ import static org.jooq.impl.DefaultParseContext.Type.N; import static org.jooq.impl.DefaultParseContext.Type.S; import static org.jooq.impl.DefaultParseContext.Type.X; import static org.jooq.impl.DefaultParseContext.Type.Y; +import static org.jooq.impl.JSONOnNull.ABSENT_ON_NULL; +import static org.jooq.impl.JSONOnNull.NULL_ON_NULL; +import static org.jooq.impl.Keywords.K_DELETE; +import static org.jooq.impl.Keywords.K_INSERT; +import static org.jooq.impl.Keywords.K_SELECT; +import static org.jooq.impl.Keywords.K_UPDATE; import static org.jooq.impl.SQLDataType.BIGINT; import static org.jooq.impl.SQLDataType.INTEGER; import static org.jooq.impl.SQLDataType.NVARCHAR; @@ -401,7 +402,6 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; -import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -430,7 +430,6 @@ import org.jooq.Catalog; import org.jooq.CharacterSet; import org.jooq.Collation; import org.jooq.Comment; -import org.jooq.CommentOnFinalStep; import org.jooq.CommentOnIsStep; import org.jooq.CommonTableExpression; import org.jooq.Comparator; @@ -508,7 +507,6 @@ import org.jooq.InsertOnDuplicateStep; import org.jooq.InsertReturningStep; import org.jooq.InsertSetStep; import org.jooq.InsertValuesStepN; -import org.jooq.JSON; import org.jooq.JSONArrayAggNullStep; import org.jooq.JSONArrayAggOrderByStep; import org.jooq.JSONArrayAggReturningStep; @@ -589,8 +587,6 @@ import org.jooq.UpdateWhereStep; import org.jooq.User; // ... // ... -import org.jooq.VisitContext; -import org.jooq.VisitListener; import org.jooq.WindowBeforeOverStep; import org.jooq.WindowDefinition; import org.jooq.WindowFromFirstLastStep; @@ -614,7 +610,6 @@ import org.jooq.conf.ParseWithMetaLookups; import org.jooq.conf.RenderKeywordCase; import org.jooq.conf.RenderNameCase; import org.jooq.conf.RenderQuotedNames; -import org.jooq.conf.Settings; import org.jooq.conf.SettingsTools; import org.jooq.impl.ScopeStack.Value; import org.jooq.impl.XMLParse.DocumentOrContent; @@ -625,8 +620,6 @@ import org.jooq.types.Interval; import org.jooq.types.YearToMonth; import org.jooq.types.YearToSecond; -import org.jetbrains.annotations.NotNull; - /** * @author Lukas Eder */ @@ -10717,6 +10710,8 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { parse(')'); switch (type) { + case CORR: + return corr(arg1, arg2); case COVAR_POP: return covarPop(arg1, arg2); case COVAR_SAMP: @@ -13020,9 +13015,9 @@ final class DefaultParseContext extends AbstractScope implements ParseContext { } private static enum BinarySetFunctionType { + CORR, COVAR_POP, COVAR_SAMP, -// CORR, REGR_SLOPE, REGR_INTERCEPT, REGR_COUNT, diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java index 1df4337327..0cfb5de3a2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgx.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.avg(DSL.nvl2(x, y, DSL.NULL(NUMERIC)).cast(NUMERIC)))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java b/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java index a892490a90..b09b38befe 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrAvgy.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.avg(DSL.nvl2(y, x, DSL.NULL(NUMERIC)).cast(NUMERIC)))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java index 7fcdd79196..772419949a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrCount.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrCount.java @@ -87,4 +87,15 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) + ctx.visit(fo(DSL.count(getArguments().get(0).plus(getArguments().get(1))))); + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java index 88cf26014e..47f95da4d4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrIntercept.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.avg(x(x, y).cast(NUMERIC))).minus(fo(DSL.regrSlope(x, y)).times(fo(DSL.avg(y(x, y).cast(NUMERIC)))))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java index 0431b28651..9010514add 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrR2.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrR2.java @@ -87,4 +87,24 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(DSL + .when(fo(DSL.varPop(y(x, y))).eq(inline(BigDecimal.ZERO)), DSL.NULL(NUMERIC)) + .when(fo(DSL.varPop(x(x, y))).eq(inline(BigDecimal.ZERO)), inline(BigDecimal.ONE)) + .else_(DSL.square(fo(DSL.corr(x, y)))) + ); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java index ec3a6ccbc0..da0af181ad 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.covarPop(x, y)).div(fo(DSL.varPop(y(x, y))))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java index 0918bf2a46..1320eb3bbe 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxx.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.regrCount(x, y)).times(fo(DSL.varPop(y(x, y))))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java index 3280b82fbc..107db4ae50 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSxy.java @@ -87,4 +87,20 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.regrCount(x, y)).times(fo(DSL.covarPop(x, y)))); + } + else + super.accept(ctx); + } + + } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java index 5aa34b12c0..5cec8d9468 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSyy.java @@ -87,4 +87,19 @@ extends + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedBy(CUBRID, DERBY, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + @SuppressWarnings("unchecked") + @Override + public void accept(Context ctx) { + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(DSL.regrCount(x, y)).times(fo(DSL.varPop(x(x, y))))); + } + else + super.accept(ctx); + } + }