From b0c07733b5abd8cff964e2d33aaedf90035f94d6 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 18 Oct 2021 16:53:50 +0200 Subject: [PATCH] [jOOQ/jOOQ#11401] Improve JSON_VALUE formatting --- .../main/java/org/jooq/impl/JSONValue.java | 44 ++++++++++++++++--- jOOQ/src/main/java/org/jooq/impl/Tools.java | 8 ++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONValue.java b/jOOQ/src/main/java/org/jooq/impl/JSONValue.java index b7ea2eb488..8c2b9f9559 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONValue.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONValue.java @@ -39,6 +39,7 @@ package org.jooq.impl; // ... import static org.jooq.conf.ParamType.INLINED; +import static org.jooq.impl.DSL.function; import static org.jooq.impl.DSL.inlined; import static org.jooq.impl.JSONValue.Behaviour.DEFAULT; import static org.jooq.impl.JSONValue.Behaviour.ERROR; @@ -51,6 +52,7 @@ import static org.jooq.impl.Names.N_JSON_EXTRACT; import static org.jooq.impl.Names.N_JSON_VALUE; import static org.jooq.impl.SQLDataType.JSONB; import static org.jooq.impl.Tools.castIfNeeded; +import static org.jooq.impl.Tools.isSimple; import java.util.Set; @@ -176,17 +178,29 @@ implements case MYSQL: case SQLITE: - ctx.visit(N_JSON_EXTRACT).sql('(').visit(json).sql(", ").visit(path).sql(')'); + ctx.visit(function(N_JSON_EXTRACT, json.getDataType(), json, path)); break; case POSTGRES: case YUGABYTE: - ctx.visit(N_JSONB_PATH_QUERY_FIRST).sql('(').visit(castIfNeeded(json, JSONB)).sql(", ").visit(path).sql("::jsonpath)"); + ctx.visit(function(N_JSONB_PATH_QUERY_FIRST, json.getDataType(), castIfNeeded(json, JSONB), DSL.field("{0}::jsonpath", path))); break; - default: - ctx.visit(N_JSON_VALUE).sql('(').visit(json).sql(", "); + default: { + boolean format = !isSimple(json, path); + + ctx.visit(N_JSON_VALUE).sql('('); + + if (format) + ctx.sqlIndentStart(); + + ctx.visit(json).sql(","); + + if (format) + ctx.formatSeparator(); + else + ctx.sql(' '); @@ -205,11 +219,23 @@ implements - if (returning != null) - ctx.separatorRequired(true).visit(new JSONReturning(returning)); + if (returning != null) { + JSONReturning r = new JSONReturning(returning); + + if (r.rendersContent(ctx)) { + if (format) + ctx.formatNewLine(); + + ctx.separatorRequired(true).visit(r); + } + } + + if (format) + ctx.sqlIndentEnd(); ctx.sql(')'); break; + } } } @@ -229,6 +255,12 @@ implements + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index dba73df628..c4cc42a2fd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3434,6 +3434,14 @@ final class Tools { return part instanceof SimpleQueryPart && ((SimpleQueryPart) part).isSimple(); } + static final boolean isSimple(QueryPart... parts) { + for (QueryPart part : parts) + if (!isSimple(part)) + return false; + + return true; + } + static final boolean isRendersSeparator(QueryPart part) { return part instanceof SeparatedQueryPart && ((SeparatedQueryPart) part).rendersSeparator(); }