diff --git a/jOOQ/src/main/java/org/jooq/JSONArrayAggNullStep.java b/jOOQ/src/main/java/org/jooq/JSONArrayAggNullStep.java index 15fa6944cc..494d17e215 100644 --- a/jOOQ/src/main/java/org/jooq/JSONArrayAggNullStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONArrayAggNullStep.java @@ -46,9 +46,9 @@ import static org.jooq.SQLDialect.POSTGRES; import org.jooq.impl.DSL; /** - * A step in the construction of {@link DSL#jsonObject(JSONEntry...)} or - * {@link DSL#jsonbObject(JSONEntry...)} functions where the NULL - * clause can be defined. + * A step in the construction of {@link DSL#jsonArrayAgg(Field)} or + * {@link DSL#jsonbArrayAgg(Field)} functions where the NULL clause + * can be defined. * * @author Lukas Eder */ diff --git a/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java b/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java index 05c1dd2320..cbe07efd19 100644 --- a/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONArrayAggOrderByStep.java @@ -48,10 +48,11 @@ import java.util.Collection; import org.jooq.impl.DSL; /** - * The SQL standard ARRAY_AGG() function. + * A step in the construction of {@link DSL#jsonArrayAgg(Field)} or + * {@link DSL#jsonbArrayAgg(Field)} functions where the ORDER BY + * clause can be defined. * * @author Lukas Eder - * @see DSL#arrayAgg(Field) */ public interface JSONArrayAggOrderByStep extends JSONArrayAggNullStep { diff --git a/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java b/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java index 8efe492bac..b10fd00774 100644 --- a/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java +++ b/jOOQ/src/main/java/org/jooq/JSONObjectAggNullStep.java @@ -46,8 +46,8 @@ import static org.jooq.SQLDialect.POSTGRES; import org.jooq.impl.DSL; /** - * A step in the construction of {@link DSL#jsonObject(JSONEntry...)} or - * {@link DSL#jsonbObject(JSONEntry...)} functions where the NULL + * A step in the construction of {@link DSL#jsonObjectAgg(JSONEntry)} or + * {@link DSL#jsonbObjectAgg(JSONEntry)} functions where the NULL * clause can be defined. * * @author Lukas Eder diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index fba9245862..3830c60259 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -233,6 +233,7 @@ import org.jooq.InsertValuesStep9; import org.jooq.InsertValuesStepN; import org.jooq.JSON; import org.jooq.JSONArrayAggOrderByStep; +import org.jooq.JSONArrayNullStep; import org.jooq.JSONB; import org.jooq.JSONEntry; import org.jooq.JSONObjectAggNullStep; @@ -18102,7 +18103,7 @@ public class DSL { * The JSON array constructor. */ @Support({ H2, MARIADB, MYSQL, POSTGRES }) - public static Field jsonArray(Field... fields) { + public static JSONArrayNullStep jsonArray(Field... fields) { return jsonArray(Arrays.asList(fields)); } @@ -18110,7 +18111,7 @@ public class DSL { * The JSON array constructor. */ @Support({ H2, MARIADB, MYSQL, POSTGRES }) - public static Field jsonArray(Collection> fields) { + public static JSONArrayNullStep jsonArray(Collection> fields) { return new JSONArray<>(JSON, fields); } @@ -18118,7 +18119,7 @@ public class DSL { * The JSONB array constructor. */ @Support({ H2, MARIADB, MYSQL, POSTGRES }) - public static Field jsonbArray(Field... fields) { + public static JSONArrayNullStep jsonbArray(Field... fields) { return jsonbArray(Arrays.asList(fields)); } @@ -18126,7 +18127,7 @@ public class DSL { * The JSONB array constructor. */ @Support({ H2, MARIADB, MYSQL, POSTGRES }) - public static Field jsonbArray(Collection> fields) { + public static JSONArrayNullStep jsonbArray(Collection> fields) { return new JSONArray<>(JSONB, fields); } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONArray.java b/jOOQ/src/main/java/org/jooq/impl/JSONArray.java index c5b7d8c9e8..1c7aeefe26 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONArray.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONArray.java @@ -39,6 +39,9 @@ package org.jooq.impl; import static org.jooq.SQLDialect.H2; import static org.jooq.impl.DSL.unquotedName; +import static org.jooq.impl.JSONNullClause.ABSENT_ON_NULL; +import static org.jooq.impl.JSONNullClause.NULL_ON_NULL; +import static org.jooq.impl.JSONObject.acceptJSONNullClause; import static org.jooq.impl.Keywords.K_JSON_ARRAY; import static org.jooq.impl.Keywords.K_NULL; import static org.jooq.impl.Keywords.K_ON; @@ -49,6 +52,7 @@ import java.util.Collection; import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; +import org.jooq.JSONArrayNullStep; /** @@ -56,20 +60,44 @@ import org.jooq.Field; * * @author Lukas Eder */ -final class JSONArray extends AbstractField { +final class JSONArray extends AbstractField implements JSONArrayNullStep { /** * Generated UID */ private static final long serialVersionUID = 1772007627336725780L; private final QueryPartList> args; + private final JSONNullClause nullClause; JSONArray(DataType type, Collection> args) { + this(type, args, null); + } + + JSONArray(DataType type, Collection> args, JSONNullClause nullClause) { super(N_JSON_ARRAY, type); this.args = new QueryPartList<>(args); + this.nullClause = nullClause; } + // ------------------------------------------------------------------------- + // XXX: DSL API + // ------------------------------------------------------------------------- + + @Override + public final JSONArray nullOnNull() { + return new JSONArray<>(getDataType(), args, NULL_ON_NULL); + } + + @Override + public final JSONArray absentOnNull() { + return new JSONArray<>(getDataType(), args, ABSENT_ON_NULL); + } + + // ------------------------------------------------------------------------- + // XXX: QueryPart API + // ------------------------------------------------------------------------- + @Override public void accept(Context ctx) { switch (ctx.family()) { @@ -88,6 +116,8 @@ final class JSONArray extends AbstractField { // Workaround for https://github.com/h2database/h2database/issues/2496 if (ctx.family() == H2 && args.isEmpty()) ctx.visit(K_NULL).sql(' ').visit(K_ON).sql(' ').visit(K_NULL); + else + acceptJSONNullClause(ctx, nullClause); ctx.sql(')'); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java index f5ef0d7885..d735d15b57 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONObject.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONObject.java @@ -176,18 +176,16 @@ final class JSONObject extends AbstractField implements JSONObjectNullStep default: ctx.visit(K_JSON_OBJECT).sql('(').visit(args); - if (!NO_SUPPORT_ABSENT_ON_NULL.contains(ctx.dialect())) - - // Workaround for https://github.com/h2database/h2database/issues/2496 - if (args.isEmpty() && ctx.family() == H2) - ctx.visit(K_NULL).sql(' ').visit(K_ON).sql(' ').visit(K_NULL); + // Workaround for https://github.com/h2database/h2database/issues/2496 + if (args.isEmpty() && ctx.family() == H2) + ctx.visit(K_NULL).sql(' ').visit(K_ON).sql(' ').visit(K_NULL); - else - acceptJSONNullClause(ctx, nullClause); + else + acceptJSONNullClause(ctx, nullClause); ctx.sql(')'); break; @@ -195,9 +193,10 @@ final class JSONObject extends AbstractField implements JSONObjectNullStep } static final void acceptJSONNullClause(Context ctx, JSONNullClause nullClause) { - if (nullClause == NULL_ON_NULL) - ctx.sql(' ').visit(K_NULL).sql(' ').visit(K_ON).sql(' ').visit(K_NULL); - else if (nullClause == ABSENT_ON_NULL) - ctx.sql(' ').visit(K_ABSENT).sql(' ').visit(K_ON).sql(' ').visit(K_NULL); + if (!NO_SUPPORT_ABSENT_ON_NULL.contains(ctx.dialect())) + if (nullClause == NULL_ON_NULL) + ctx.sql(' ').visit(K_NULL).sql(' ').visit(K_ON).sql(' ').visit(K_NULL); + else if (nullClause == ABSENT_ON_NULL) + ctx.sql(' ').visit(K_ABSENT).sql(' ').visit(K_ON).sql(' ').visit(K_NULL); } }