[jOOQ/jOOQ#13249] Emulate JSON_OBJECT's ABSENT ON NULL clause in MySQL

This commit is contained in:
Lukas Eder 2022-09-30 15:21:06 +02:00
parent 05508c32c7
commit 239cfb8d28
4 changed files with 28 additions and 2 deletions

View File

@ -84,7 +84,7 @@ public interface JSONObjectNullStep<T> extends JSONObjectReturningStep<T> {
* <p>
* Exclude <code>NULL</code> values in output JSON.
*/
@Support({ H2, POSTGRES, YUGABYTEDB })
@Support({ H2, MYSQL, POSTGRES, YUGABYTEDB })
@NotNull @CheckReturnValue
JSONObjectReturningStep<T> absentOnNull();
}

View File

@ -207,6 +207,31 @@ implements
break;
}
case MYSQL: {
// [#13249] ABSENT ON NULL emulation using JSON_TABLE
if (onNull == JSONOnNull.ABSENT_ON_NULL) {
Field<String> k = DSL.field(name("jt", "k"), VARCHAR);
Field<JSON> o = DSL.field(name("j", "o"), JSON);
ctx.visit(DSL.field(
select(DSL.coalesce(
DSL.jsonObjectAgg(k, DSL.function(N_JSON_EXTRACT, JSON, o, DSL.concat(inline("$.\""), k, inline("\"")))),
DSL.jsonObject()))
.from(
select(CustomField.of("o", JSON, c -> acceptStandard(c)).as(o)).asTable("j"),
jsonTable(function(N_JSON_KEYS, JSON, o), inline("$[*]"))
.column("k", VARCHAR).path("$")
.asTable("jt"))
.where(DSL.function(N_JSON_EXTRACT, JSON, o, DSL.concat(inline("$.\""), k, inline("\""))).ne(DSL.inline("null").cast(JSON)))
));
}
else
acceptStandard(ctx);
break;
}
default:
acceptStandard(ctx);
break;

View File

@ -183,6 +183,7 @@ final class Names {
static final Name N_JSON_EXTRACT = systemName("json_extract");
static final Name N_JSON_GROUP_ARRAY = systemName("json_group_array");
static final Name N_JSON_GROUP_OBJECT = systemName("json_group_object");
static final Name N_JSON_KEYS = systemName("json_keys");
static final Name N_JSON_MERGE = systemName("json_merge");
static final Name N_JSON_MERGE_PRESERVE = systemName("json_merge_preserve");
static final Name N_JSON_MODIFY = systemName("json_modify");

View File

@ -29,7 +29,7 @@
<!-- JDBC drivers for jOOQ-xyz-extensions modules and vendor-specific API access -->
<postgres.version>42.4.1</postgres.version>
<sqlserver.version>10.2.0.jre11</sqlserver.version>
<oracle.version>21.5.0.0</oracle.version>
<oracle.version>21.7.0.0</oracle.version>
<!-- R2DBC SPI version and some matching driver versions -->
<io.r2dbc.version>0.9.1.RELEASE</io.r2dbc.version>