From 06c2c31907a7dbf13ac93d0905cc71f3446827d2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 6 May 2022 15:32:11 +0200 Subject: [PATCH] [jOOQ/jOQO#7284] Replace common patterns in query object model - transformPatternsScalarSubqueryCountAsteriskGtZero - transformPatternsScalarSubqueryCountExpressionGtZero --- .../src/main/java/org/jooq/conf/Settings.java | 92 +++++++++++++++++++ .../src/main/java/org/jooq/impl/Patterns.java | 58 ++++++++++++ .../org/jooq/xsd/jooq-runtime-3.17.0.xsd | 16 ++++ 3 files changed, 166 insertions(+) diff --git a/jOOQ/src/main/java/org/jooq/conf/Settings.java b/jOOQ/src/main/java/org/jooq/conf/Settings.java index b78c958973..445f273f95 100644 --- a/jOOQ/src/main/java/org/jooq/conf/Settings.java +++ b/jOOQ/src/main/java/org/jooq/conf/Settings.java @@ -151,6 +151,10 @@ public class Settings @XmlElement(defaultValue = "true") protected Boolean transformPatternsTrivialPredicates = true; @XmlElement(defaultValue = "true") + protected Boolean transformPatternsScalarSubqueryCountAsteriskGtZero = true; + @XmlElement(defaultValue = "true") + protected Boolean transformPatternsScalarSubqueryCountExpressionGtZero = true; + @XmlElement(defaultValue = "true") protected Boolean transformPatternsEmptyScalarSubquery = true; @XmlElement(defaultValue = "true") protected Boolean transformPatternsNegNeg = true; @@ -1715,6 +1719,62 @@ public class Settings this.transformPatternsTrivialPredicates = value; } + /** + * Transform predicates comparing scalar subqueries with a count (SELECT COUNT(*) ..) > 0 to equivalent EXISTS (SELECT 1 ..). + *

+ * Scalar subqueries that count rows and whose count is compared to 0 can be transformed into equivalent, but likely cheaper to execute EXISTS queries. + *

+ * This feature is available in the commercial distribution only. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isTransformPatternsScalarSubqueryCountAsteriskGtZero() { + return transformPatternsScalarSubqueryCountAsteriskGtZero; + } + + /** + * Sets the value of the transformPatternsScalarSubqueryCountAsteriskGtZero property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setTransformPatternsScalarSubqueryCountAsteriskGtZero(Boolean value) { + this.transformPatternsScalarSubqueryCountAsteriskGtZero = value; + } + + /** + * Transform predicates comparing scalar subqueries with a count (SELECT COUNT(expr) ..) > 0 to equivalent EXISTS (SELECT 1 .. WHERE expr IS NOT NULL). + *

+ * Scalar subqueries that count non-null expressions and whose count is compared to 0 can be transformed into equivalent, but likely cheaper to execute EXISTS queries. + *

+ * This feature is available in the commercial distribution only. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isTransformPatternsScalarSubqueryCountExpressionGtZero() { + return transformPatternsScalarSubqueryCountExpressionGtZero; + } + + /** + * Sets the value of the transformPatternsScalarSubqueryCountExpressionGtZero property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setTransformPatternsScalarSubqueryCountExpressionGtZero(Boolean value) { + this.transformPatternsScalarSubqueryCountExpressionGtZero = value; + } + /** * Transform empty scalar subqueries like (SELECT 1 WHERE FALSE) to NULL. *

@@ -4352,6 +4412,16 @@ public class Settings return this; } + public Settings withTransformPatternsScalarSubqueryCountAsteriskGtZero(Boolean value) { + setTransformPatternsScalarSubqueryCountAsteriskGtZero(value); + return this; + } + + public Settings withTransformPatternsScalarSubqueryCountExpressionGtZero(Boolean value) { + setTransformPatternsScalarSubqueryCountExpressionGtZero(value); + return this; + } + public Settings withTransformPatternsEmptyScalarSubquery(Boolean value) { setTransformPatternsEmptyScalarSubquery(value); return this; @@ -5244,6 +5314,8 @@ public class Settings builder.append("transformPatternsMergeBetweenSymmetricPredicates", transformPatternsMergeBetweenSymmetricPredicates); builder.append("transformPatternsTrivialCaseAbbreviation", transformPatternsTrivialCaseAbbreviation); builder.append("transformPatternsTrivialPredicates", transformPatternsTrivialPredicates); + builder.append("transformPatternsScalarSubqueryCountAsteriskGtZero", transformPatternsScalarSubqueryCountAsteriskGtZero); + builder.append("transformPatternsScalarSubqueryCountExpressionGtZero", transformPatternsScalarSubqueryCountExpressionGtZero); builder.append("transformPatternsEmptyScalarSubquery", transformPatternsEmptyScalarSubquery); builder.append("transformPatternsNegNeg", transformPatternsNegNeg); builder.append("transformPatternsBitNotBitNot", transformPatternsBitNotBitNot); @@ -5820,6 +5892,24 @@ public class Settings return false; } } + if (transformPatternsScalarSubqueryCountAsteriskGtZero == null) { + if (other.transformPatternsScalarSubqueryCountAsteriskGtZero!= null) { + return false; + } + } else { + if (!transformPatternsScalarSubqueryCountAsteriskGtZero.equals(other.transformPatternsScalarSubqueryCountAsteriskGtZero)) { + return false; + } + } + if (transformPatternsScalarSubqueryCountExpressionGtZero == null) { + if (other.transformPatternsScalarSubqueryCountExpressionGtZero!= null) { + return false; + } + } else { + if (!transformPatternsScalarSubqueryCountExpressionGtZero.equals(other.transformPatternsScalarSubqueryCountExpressionGtZero)) { + return false; + } + } if (transformPatternsEmptyScalarSubquery == null) { if (other.transformPatternsEmptyScalarSubquery!= null) { return false; @@ -6822,6 +6912,8 @@ public class Settings result = ((prime*result)+((transformPatternsMergeBetweenSymmetricPredicates == null)? 0 :transformPatternsMergeBetweenSymmetricPredicates.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())); + result = ((prime*result)+((transformPatternsScalarSubqueryCountExpressionGtZero == null)? 0 :transformPatternsScalarSubqueryCountExpressionGtZero.hashCode())); result = ((prime*result)+((transformPatternsEmptyScalarSubquery == null)? 0 :transformPatternsEmptyScalarSubquery.hashCode())); result = ((prime*result)+((transformPatternsNegNeg == null)? 0 :transformPatternsNegNeg.hashCode())); result = ((prime*result)+((transformPatternsBitNotBitNot == null)? 0 :transformPatternsBitNotBitNot.hashCode())); diff --git a/jOOQ/src/main/java/org/jooq/impl/Patterns.java b/jOOQ/src/main/java/org/jooq/impl/Patterns.java index ab18bbd573..58db44ea87 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Patterns.java +++ b/jOOQ/src/main/java/org/jooq/impl/Patterns.java @@ -1566,6 +1566,64 @@ package org.jooq.impl; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.17.0.xsd b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.17.0.xsd index 327a3f3182..dc344f3bed 100644 --- a/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.17.0.xsd +++ b/jOOQ/src/main/resources/org/jooq/xsd/jooq-runtime-3.17.0.xsd @@ -446,6 +446,22 @@ This transformation removes any trivial predicates. This feature is available in the commercial distribution only.]]> + + (SELECT COUNT(*) ..) > 0 to equivalent EXISTS (SELECT 1 ..). +

+Scalar subqueries that count rows and whose count is compared to 0 can be transformed into equivalent, but likely cheaper to execute EXISTS queries. +

+This feature is available in the commercial distribution only.]]> + + + + (SELECT COUNT(expr) ..) > 0 to equivalent EXISTS (SELECT 1 .. WHERE expr IS NOT NULL). +

+Scalar subqueries that count non-null expressions and whose count is compared to 0 can be transformed into equivalent, but likely cheaper to execute EXISTS queries. +

+This feature is available in the commercial distribution only.]]> + + (SELECT 1 WHERE FALSE) to NULL.