[jOOQ/jOOQ#13593] Implement more transform patterns

- Settings.transformPatternsCaseMergeWhenElse
- Settings.transformPatternsCaseMergeWhenWhen
This commit is contained in:
Lukas Eder 2022-10-27 17:12:20 +02:00
parent 4542c1bcb1
commit 1ca748ffc1
4 changed files with 263 additions and 1 deletions

View File

@ -179,6 +179,12 @@ public class Settings
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsCaseElseCase = true;
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsCaseMergeWhenWhen = true;
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsCaseMergeWhenElse = true;
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsCaseThenBoolean = true;
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsTrivialCaseAbbreviation = true;
@XmlElement(defaultValue = "true")
protected Boolean transformPatternsTrivialPredicates = true;
@ -2169,6 +2175,92 @@ public class Settings
this.transformPatternsCaseElseCase = value;
}
/**
* Transform <code>CASE WHEN a THEN x WHEN b THEN x END</code> to <code>CASE WHEN a OR b THEN x END</code>.
* <p>
* Two consecutive <code>WHEN</code> clauses can be merged, if their respective <code>THEN</code> clause is identical.
* <p>
* This feature is available in the commercial distribution only.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isTransformPatternsCaseMergeWhenWhen() {
return transformPatternsCaseMergeWhenWhen;
}
/**
* Sets the value of the transformPatternsCaseMergeWhenWhen property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setTransformPatternsCaseMergeWhenWhen(Boolean value) {
this.transformPatternsCaseMergeWhenWhen = value;
}
/**
* Transform <code>CASE WHEN a THEN x WHEN b THEN y ELSE y END</code> to <code>CASE WHEN a THEN x ELSE y END</code>.
* <p>
* The ultimate <code>WHEN</code> clause can be merged with the <code>ELSE</code>, if their respective result is identical.
* If the <code>WHEN</code> clause is the only <code>WHEN</code> clause, then the entire <code>CASE</code> expression can
* be replaced by the <code>ELSE</code> clause content.
* <p>
* This feature is available in the commercial distribution only.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isTransformPatternsCaseMergeWhenElse() {
return transformPatternsCaseMergeWhenElse;
}
/**
* Sets the value of the transformPatternsCaseMergeWhenElse property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setTransformPatternsCaseMergeWhenElse(Boolean value) {
this.transformPatternsCaseMergeWhenElse = value;
}
/**
* Transform <code>CASE THEN TRUE ELSE FALSE</code> to something simpler.
* <p>
* A <code>CASE</code> expression that transforms things to booleans can usually be simplified easily.
* <p>
* This feature is available in the commercial distribution only.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isTransformPatternsCaseThenBoolean() {
return transformPatternsCaseThenBoolean;
}
/**
* Sets the value of the transformPatternsCaseThenBoolean property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setTransformPatternsCaseThenBoolean(Boolean value) {
this.transformPatternsCaseThenBoolean = value;
}
/**
* Transform trivial case abbreviations like <code>NVL(NULL, a)</code> to <code>a</code>.
* <p>
@ -5196,6 +5288,21 @@ public class Settings
return this;
}
public Settings withTransformPatternsCaseMergeWhenWhen(Boolean value) {
setTransformPatternsCaseMergeWhenWhen(value);
return this;
}
public Settings withTransformPatternsCaseMergeWhenElse(Boolean value) {
setTransformPatternsCaseMergeWhenElse(value);
return this;
}
public Settings withTransformPatternsCaseThenBoolean(Boolean value) {
setTransformPatternsCaseThenBoolean(value);
return this;
}
public Settings withTransformPatternsTrivialCaseAbbreviation(Boolean value) {
setTransformPatternsTrivialCaseAbbreviation(value);
return this;
@ -6176,6 +6283,9 @@ public class Settings
builder.append("transformPatternsMergeBetweenSymmetricPredicates", transformPatternsMergeBetweenSymmetricPredicates);
builder.append("transformPatternsCaseElseNull", transformPatternsCaseElseNull);
builder.append("transformPatternsCaseElseCase", transformPatternsCaseElseCase);
builder.append("transformPatternsCaseMergeWhenWhen", transformPatternsCaseMergeWhenWhen);
builder.append("transformPatternsCaseMergeWhenElse", transformPatternsCaseMergeWhenElse);
builder.append("transformPatternsCaseThenBoolean", transformPatternsCaseThenBoolean);
builder.append("transformPatternsTrivialCaseAbbreviation", transformPatternsTrivialCaseAbbreviation);
builder.append("transformPatternsTrivialPredicates", transformPatternsTrivialPredicates);
builder.append("transformPatternsScalarSubqueryCountAsteriskGtZero", transformPatternsScalarSubqueryCountAsteriskGtZero);
@ -6889,6 +6999,33 @@ public class Settings
return false;
}
}
if (transformPatternsCaseMergeWhenWhen == null) {
if (other.transformPatternsCaseMergeWhenWhen!= null) {
return false;
}
} else {
if (!transformPatternsCaseMergeWhenWhen.equals(other.transformPatternsCaseMergeWhenWhen)) {
return false;
}
}
if (transformPatternsCaseMergeWhenElse == null) {
if (other.transformPatternsCaseMergeWhenElse!= null) {
return false;
}
} else {
if (!transformPatternsCaseMergeWhenElse.equals(other.transformPatternsCaseMergeWhenElse)) {
return false;
}
}
if (transformPatternsCaseThenBoolean == null) {
if (other.transformPatternsCaseThenBoolean!= null) {
return false;
}
} else {
if (!transformPatternsCaseThenBoolean.equals(other.transformPatternsCaseThenBoolean)) {
return false;
}
}
if (transformPatternsTrivialCaseAbbreviation == null) {
if (other.transformPatternsTrivialCaseAbbreviation!= null) {
return false;
@ -8004,6 +8141,9 @@ public class Settings
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)+((transformPatternsCaseMergeWhenWhen == null)? 0 :transformPatternsCaseMergeWhenWhen.hashCode()));
result = ((prime*result)+((transformPatternsCaseMergeWhenElse == null)? 0 :transformPatternsCaseMergeWhenElse.hashCode()));
result = ((prime*result)+((transformPatternsCaseThenBoolean == null)? 0 :transformPatternsCaseThenBoolean.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()));

View File

@ -1717,6 +1717,51 @@ package org.jooq.impl;

View File

@ -252,10 +252,61 @@ public final class QOM {
permits
QueryPartListView
{
// TODO: These methods could return unmodifiable views instead, to avoid
// copying things around...
@NotNull default UnmodifiableList<Q> $concat(UnmodifiableList<Q> other) {
QueryPartList<Q> r = new QueryPartList<>(this);
r.addAll(other);
return r;
return unmodifiable(r);
}
@NotNull default UnmodifiableList<Q> $removeFirst() {
QueryPartList<Q> r = new QueryPartList<>();
for (int i = 1; i < size(); i++)
r.add(get(i));
return unmodifiable(r);
}
@NotNull default UnmodifiableList<Q> $set(int position, Q newValue) {
QueryPartList<Q> r = new QueryPartList<>();
for (int i = 0; i < size(); i++)
if (i == position)
r.add(newValue);
else
r.add(get(i));
return unmodifiable(r);
}
@NotNull default UnmodifiableList<Q> $remove(int position) {
QueryPartList<Q> r = new QueryPartList<>();
for (int i = 0; i < size(); i++)
if (i != position)
r.add(get(i));
return unmodifiable(r);
}
@NotNull default UnmodifiableList<Q> $removeLast() {
QueryPartList<Q> r = new QueryPartList<>();
for (int i = 0; i < size() - 1; i++)
r.add(get(i));
return unmodifiable(r);
}
@Nullable default Q $first() {
return isEmpty() ? null : get(0);
}
@Nullable default Q $last() {
return isEmpty() ? null : get(size() - 1);
}
}

View File

@ -568,6 +568,32 @@ This feature is available in the commercial distribution only.]]></jxb:javadoc><
This feature is available in the commercial distribution only.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="transformPatternsCaseMergeWhenWhen" type="boolean" minOccurs="0" maxOccurs="1" default="true">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Transform <code>CASE WHEN a THEN x WHEN b THEN x END</code> to <code>CASE WHEN a OR b THEN x END</code>.
<p>
Two consecutive <code>WHEN</code> clauses can be merged, if their respective <code>THEN</code> clause is identical.
<p>
This feature is available in the commercial distribution only.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="transformPatternsCaseMergeWhenElse" type="boolean" minOccurs="0" maxOccurs="1" default="true">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Transform <code>CASE WHEN a THEN x WHEN b THEN y ELSE y END</code> to <code>CASE WHEN a THEN x ELSE y END</code>.
<p>
The ultimate <code>WHEN</code> clause can be merged with the <code>ELSE</code>, if their respective result is identical.
If the <code>WHEN</code> clause is the only <code>WHEN</code> clause, then the entire <code>CASE</code> expression can
be replaced by the <code>ELSE</code> clause content.
<p>
This feature is available in the commercial distribution only.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="transformPatternsCaseThenBoolean" type="boolean" minOccurs="0" maxOccurs="1" default="true">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Transform <code>CASE .. THEN TRUE ELSE FALSE</code> to something simpler.
<p>
A <code>CASE</code> expression that transforms things to booleans can usually be simplified easily.
<p>
This feature is available in the commercial distribution only.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="transformPatternsTrivialCaseAbbreviation" type="boolean" minOccurs="0" maxOccurs="1" default="true">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Transform trivial case abbreviations like <code>NVL(NULL, a)</code> to <code>a</code>.
<p>