Browse Source

Conditions are Expressions.

Selection of condition expressions yielding a boolean value is supported by some databases.

Closes #1007
Original pull request: #1079.
pull/1092/head
Jens Schauder 4 years ago committed by Mark Paluch
parent
commit
bd8b3c63d9
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 2
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Condition.java
  2. 8
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java
  3. 10
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FilteredSingleConditionRenderSupport.java
  4. 14
      spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java

2
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Condition.java

@ -23,7 +23,7 @@ package org.springframework.data.relational.core.sql; @@ -23,7 +23,7 @@ package org.springframework.data.relational.core.sql;
* @since 1.1
* @see Conditions
*/
public interface Condition extends Segment {
public interface Condition extends Segment, Expression {
/**
* Combine another {@link Condition} using {@code AND}.

8
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java

@ -52,14 +52,14 @@ class ComparisonVisitor extends FilteredSubtreeVisitor { @@ -52,14 +52,14 @@ class ComparisonVisitor extends FilteredSubtreeVisitor {
@Override
Delegation enterNested(Visitable segment) {
if (segment instanceof Expression) {
ExpressionVisitor visitor = new ExpressionVisitor(context);
if (segment instanceof Condition) {
ConditionVisitor visitor = new ConditionVisitor(context);
current = visitor;
return Delegation.delegateTo(visitor);
}
if (segment instanceof Condition) {
ConditionVisitor visitor = new ConditionVisitor(context);
if (segment instanceof Expression) {
ExpressionVisitor visitor = new ExpressionVisitor(context);
current = visitor;
return Delegation.delegateTo(visitor);
}

10
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FilteredSingleConditionRenderSupport.java

@ -28,6 +28,7 @@ import org.springframework.util.Assert; @@ -28,6 +28,7 @@ import org.springframework.util.Assert;
* and delegate nested {@link Expression} and {@link Condition} rendering.
*
* @author Mark Paluch
* @author Jens Schauder
* @since 1.1
*/
abstract class FilteredSingleConditionRenderSupport extends FilteredSubtreeVisitor {
@ -55,18 +56,19 @@ abstract class FilteredSingleConditionRenderSupport extends FilteredSubtreeVisit @@ -55,18 +56,19 @@ abstract class FilteredSingleConditionRenderSupport extends FilteredSubtreeVisit
@Override
Delegation enterNested(Visitable segment) {
if (segment instanceof Expression) {
ExpressionVisitor visitor = new ExpressionVisitor(context);
if (segment instanceof Condition) {
ConditionVisitor visitor = new ConditionVisitor(context);
current = visitor;
return Delegation.delegateTo(visitor);
}
if (segment instanceof Condition) {
ConditionVisitor visitor = new ConditionVisitor(context);
if (segment instanceof Expression) {
ExpressionVisitor visitor = new ExpressionVisitor(context);
current = visitor;
return Delegation.delegateTo(visitor);
}
throw new IllegalStateException("Cannot provide visitor for " + segment);
}

14
spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java

@ -480,6 +480,20 @@ class SelectRendererUnitTests { @@ -480,6 +480,20 @@ class SelectRendererUnitTests {
assertThat(rendered).isEqualTo("SELECT CAST(User.name AS VARCHAR2) FROM User");
}
@Test // GH-1007
void shouldRenderConditionAsExpression() {
Table table = SQL.table("User");
Select select = StatementBuilder.select( //
Conditions.isGreater(table.column("age"), SQL.literalOf(18)) //
) //
.from(table) //
.build();
final String rendered = SqlRenderer.toString(select);
assertThat(rendered).isEqualTo("SELECT User.age > 18 FROM User");
}
@Test // GH-968
void rendersFullyQualifiedNamesInOrderBy() {

Loading…
Cancel
Save