[jOOQ/jOOQ#16509] Avoid more internal COALESCE calls when unnecessary via AbstractField::isNullable

This commit is contained in:
Lukas Eder 2024-03-25 18:25:20 +01:00
parent c379441d47
commit dc0fc32349
7 changed files with 17 additions and 6 deletions

View File

@ -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()))

View File

@ -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())

View File

@ -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())
));

View File

@ -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;

View File

@ -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())

View File

@ -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<T> extends AbstractQueryPart implements JSONEntry<T>,
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);

View File

@ -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 <T> Field<T> ifNotNull(Field<?> field, Field<T> 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();
}