diff --git a/jOOQ/src/main/java/org/jooq/Select.java b/jOOQ/src/main/java/org/jooq/Select.java index ef4f806d1f..b7eb0368a3 100644 --- a/jOOQ/src/main/java/org/jooq/Select.java +++ b/jOOQ/src/main/java/org/jooq/Select.java @@ -233,7 +233,7 @@ extends * Subject to change in future jOOQ versions, use at your own risk. */ @Experimental - UnmodifiableList $distinctOn(); + @NotNull UnmodifiableList $distinctOn(); /** * Experimental query object model accessor method, see also {@link QOM}. diff --git a/jOOQ/src/main/java/org/jooq/conf/Settings.java b/jOOQ/src/main/java/org/jooq/conf/Settings.java index 5e12c165da..2d48c537db 100644 --- a/jOOQ/src/main/java/org/jooq/conf/Settings.java +++ b/jOOQ/src/main/java/org/jooq/conf/Settings.java @@ -177,6 +177,8 @@ public class Settings @XmlElement(defaultValue = "true") protected Boolean transformPatternsCaseElseNull = true; @XmlElement(defaultValue = "true") + protected Boolean transformPatternsCaseElseCase = true; + @XmlElement(defaultValue = "true") protected Boolean transformPatternsTrivialCaseAbbreviation = true; @XmlElement(defaultValue = "true") protected Boolean transformPatternsTrivialPredicates = true; @@ -2139,6 +2141,34 @@ public class Settings this.transformPatternsCaseElseNull = value; } + /** + * Transform CASE … ELSE CASE … by flattening the nested CASE. + *

+ * CASE WHEN a THEN b ELSE CASE WHEN c THEN d END END is equivalent to CASE WHEN a THEN b WHEN c THEN d END. + *

+ * This feature is available in the commercial distribution only. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isTransformPatternsCaseElseCase() { + return transformPatternsCaseElseCase; + } + + /** + * Sets the value of the transformPatternsCaseElseCase property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setTransformPatternsCaseElseCase(Boolean value) { + this.transformPatternsCaseElseCase = value; + } + /** * Transform trivial case abbreviations like NVL(NULL, a) to a. *

@@ -5161,6 +5191,11 @@ public class Settings return this; } + public Settings withTransformPatternsCaseElseCase(Boolean value) { + setTransformPatternsCaseElseCase(value); + return this; + } + public Settings withTransformPatternsTrivialCaseAbbreviation(Boolean value) { setTransformPatternsTrivialCaseAbbreviation(value); return this; @@ -6140,6 +6175,7 @@ public class Settings builder.append("transformPatternsMergeRangePredicates", transformPatternsMergeRangePredicates); builder.append("transformPatternsMergeBetweenSymmetricPredicates", transformPatternsMergeBetweenSymmetricPredicates); builder.append("transformPatternsCaseElseNull", transformPatternsCaseElseNull); + builder.append("transformPatternsCaseElseCase", transformPatternsCaseElseCase); builder.append("transformPatternsTrivialCaseAbbreviation", transformPatternsTrivialCaseAbbreviation); builder.append("transformPatternsTrivialPredicates", transformPatternsTrivialPredicates); builder.append("transformPatternsScalarSubqueryCountAsteriskGtZero", transformPatternsScalarSubqueryCountAsteriskGtZero); @@ -6844,6 +6880,15 @@ public class Settings return false; } } + if (transformPatternsCaseElseCase == null) { + if (other.transformPatternsCaseElseCase!= null) { + return false; + } + } else { + if (!transformPatternsCaseElseCase.equals(other.transformPatternsCaseElseCase)) { + return false; + } + } if (transformPatternsTrivialCaseAbbreviation == null) { if (other.transformPatternsTrivialCaseAbbreviation!= null) { return false; @@ -7958,6 +8003,7 @@ public class Settings result = ((prime*result)+((transformPatternsMergeRangePredicates == null)? 0 :transformPatternsMergeRangePredicates.hashCode())); result = ((prime*result)+((transformPatternsMergeBetweenSymmetricPredicates == null)? 0 :transformPatternsMergeBetweenSymmetricPredicates.hashCode())); result = ((prime*result)+((transformPatternsCaseElseNull == null)? 0 :transformPatternsCaseElseNull.hashCode())); + result = ((prime*result)+((transformPatternsCaseElseCase == null)? 0 :transformPatternsCaseElseCase.hashCode())); result = ((prime*result)+((transformPatternsTrivialCaseAbbreviation == null)? 0 :transformPatternsTrivialCaseAbbreviation.hashCode())); result = ((prime*result)+((transformPatternsTrivialPredicates == null)? 0 :transformPatternsTrivialPredicates.hashCode())); result = ((prime*result)+((transformPatternsScalarSubqueryCountAsteriskGtZero == null)? 0 :transformPatternsScalarSubqueryCountAsteriskGtZero.hashCode())); diff --git a/jOOQ/src/main/java/org/jooq/impl/Patterns.java b/jOOQ/src/main/java/org/jooq/impl/Patterns.java index 5e88619685..5110b2274f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Patterns.java +++ b/jOOQ/src/main/java/org/jooq/impl/Patterns.java @@ -1722,6 +1722,13 @@ package org.jooq.impl; + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/QOM.java b/jOOQ/src/main/java/org/jooq/impl/QOM.java index eee1a79ec8..543fb3dc4d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QOM.java +++ b/jOOQ/src/main/java/org/jooq/impl/QOM.java @@ -251,7 +251,13 @@ public final class QOM { java.util.List permits QueryPartListView - {} + { + @NotNull default UnmodifiableList $concat(UnmodifiableList other) { + QueryPartList r = new QueryPartList<>(this); + r.addAll(other); + return r; + } + } public /*sealed*/ interface With extends diff --git a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd index db0fb86afe..c32981d557 100644 --- a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd +++ b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.18.0.xsd @@ -560,6 +560,14 @@ This feature is available in the commercial distribution only.]]>< This feature is available in the commercial distribution only.]]> + + CASE .. ELSE CASE .. by flattening the nested CASE. +

+CASE WHEN a THEN b ELSE CASE WHEN c THEN d END END is equivalent to CASE WHEN a THEN b WHEN c THEN d END. +

+This feature is available in the commercial distribution only.]]> + + NVL(NULL, a) to a.