From dc0fc32349824f1f7586cea150a31bdbc0e42ab0 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 25 Mar 2024 18:25:20 +0100 Subject: [PATCH] [jOOQ/jOOQ#16509] Avoid more internal COALESCE calls when unnecessary via AbstractField::isNullable --- jOOQ/src/main/java/org/jooq/impl/ArrayAllMatch.java | 2 +- jOOQ/src/main/java/org/jooq/impl/ArrayAnyMatch.java | 2 +- jOOQ/src/main/java/org/jooq/impl/ArrayFilter.java | 2 +- jOOQ/src/main/java/org/jooq/impl/ArrayMap.java | 2 +- jOOQ/src/main/java/org/jooq/impl/ArrayNoneMatch.java | 2 +- jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java | 3 ++- jOOQ/src/main/java/org/jooq/impl/Tools.java | 10 ++++++++++ 7 files changed, 17 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayAllMatch.java b/jOOQ/src/main/java/org/jooq/impl/ArrayAllMatch.java index 625468a442..d8ed5c42ca 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayAllMatch.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayAllMatch.java @@ -125,7 +125,7 @@ implements case HSQLDB: case POSTGRES: case YUGABYTEDB: - ctx.visit(when(array.isNotNull(), notExists( + ctx.visit(ifNotNull(array, notExists( selectOne() .from(unnest(array).as(N_T, predicate.$arg1().getUnqualifiedName())) .where(DSL.not(predicate.$result())) diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayAnyMatch.java b/jOOQ/src/main/java/org/jooq/impl/ArrayAnyMatch.java index c10fd78a65..50461df787 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayAnyMatch.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayAnyMatch.java @@ -125,7 +125,7 @@ implements case HSQLDB: case POSTGRES: case YUGABYTEDB: - ctx.visit(when(array.isNotNull(), exists( + ctx.visit(ifNotNull(array, exists( selectOne() .from(unnest(array).as(N_T, predicate.$arg1().getUnqualifiedName())) .where(predicate.$result()) diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayFilter.java b/jOOQ/src/main/java/org/jooq/impl/ArrayFilter.java index a070257f6a..a71137d8df 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayFilter.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayFilter.java @@ -128,7 +128,7 @@ implements case POSTGRES: case YUGABYTEDB: ctx.visit(DSL.field( - select(DSL.coalesce(arrayAgg(predicate.$arg1()), when(array.isNotNull(), DSL.cast(array(), getDataType())))) + select(DSL.coalesce(arrayAgg(predicate.$arg1()), ifNotNull(array, DSL.cast(array(), getDataType())))) .from(unnest(array).as(N_T, predicate.$arg1().getUnqualifiedName())) .where(predicate.$result()) )); diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java b/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java index e117921350..9fc4375557 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayMap.java @@ -131,7 +131,7 @@ implements case POSTGRES: case YUGABYTEDB: ctx.visit(DSL.field( - select(DSL.coalesce(arrayAgg(mapper.$result()), when(array.isNotNull(), DSL.cast(array(), getDataType())))) + select(DSL.coalesce(arrayAgg(mapper.$result()), ifNotNull(array, DSL.cast(array(), getDataType())))) .from(unnest(array).as(N_T, mapper.$arg1().getUnqualifiedName())) )); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayNoneMatch.java b/jOOQ/src/main/java/org/jooq/impl/ArrayNoneMatch.java index 9a631cc51e..353d3f6e75 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayNoneMatch.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayNoneMatch.java @@ -124,7 +124,7 @@ implements case HSQLDB: case POSTGRES: case YUGABYTEDB: - ctx.visit(when(array.isNotNull(), notExists( + ctx.visit(ifNotNull(array, notExists( selectOne() .from(unnest(array).as(N_T, predicate.$arg1().getUnqualifiedName())) .where(predicate.$result()) diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java b/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java index d185eaf73c..32fe5cf235 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONEntryImpl.java @@ -73,6 +73,7 @@ import static org.jooq.impl.SQLDataType.JSON; import static org.jooq.impl.SQLDataType.VARCHAR; import static org.jooq.impl.Tools.combine; import static org.jooq.impl.Tools.emulateMultiset; +import static org.jooq.impl.Tools.ifNotNull; import static org.jooq.impl.Tools.isScalarSubquery; import java.util.Set; @@ -241,7 +242,7 @@ final class JSONEntryImpl extends AbstractQueryPart implements JSONEntry, if (isType(type, Boolean.class)) return function(N_JSON, SQLDataType.JSON, booleanCase(field)); else if (type.isBinary()) - return when(field.isNotNull(), function(N_HEX, VARCHAR, field)); + return ifNotNull(field, function(N_HEX, VARCHAR, field)); else if (castJSONTypes && type.isJSON()) return function(N_JSON, SQLDataType.JSON, field); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index ec49744d23..ff48dd5592 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -132,6 +132,7 @@ import static org.jooq.impl.DSL.row; import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.unquotedName; import static org.jooq.impl.DSL.val; +import static org.jooq.impl.DSL.when; import static org.jooq.impl.DefaultExecuteContext.localConnection; import static org.jooq.impl.DefaultParseContext.SUPPORTS_HASH_COMMENT_SYNTAX; import static org.jooq.impl.DerivedTable.NO_SUPPORT_CORRELATED_DERIVED_TABLE; @@ -7959,6 +7960,15 @@ final class Tools { } } + static final Field ifNotNull(Field field, Field ifNotNull) { + if (field instanceof AbstractField af) { + if (!af.isNullable()) + return ifNotNull; + } + + return when(field.isNotNull(), ifNotNull); + } + static final boolean sortable(Field f) { return !f.getDataType().isBinary(); }