From bd8b3c63d9a5113f6e241d61992ce6efd97b1f37 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 4 Nov 2021 07:18:40 +0100 Subject: [PATCH] Conditions are Expressions. Selection of condition expressions yielding a boolean value is supported by some databases. Closes #1007 Original pull request: #1079. --- .../data/relational/core/sql/Condition.java | 2 +- .../core/sql/render/ComparisonVisitor.java | 8 ++++---- .../FilteredSingleConditionRenderSupport.java | 12 +++++++----- .../core/sql/render/SelectRendererUnitTests.java | 14 ++++++++++++++ 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Condition.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Condition.java index bacb5e84..956d2c68 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Condition.java +++ b/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; * @since 1.1 * @see Conditions */ -public interface Condition extends Segment { +public interface Condition extends Segment, Expression { /** * Combine another {@link Condition} using {@code AND}. diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java index 186c0601..476f1223 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ComparisonVisitor.java @@ -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); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FilteredSingleConditionRenderSupport.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FilteredSingleConditionRenderSupport.java index 0a148c8d..8f23b672 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FilteredSingleConditionRenderSupport.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/FilteredSingleConditionRenderSupport.java @@ -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,17 +56,18 @@ abstract class FilteredSingleConditionRenderSupport extends FilteredSubtreeVisit @Override Delegation enterNested(Visitable segment) { + if (segment instanceof Condition) { + ConditionVisitor visitor = new ConditionVisitor(context); + current = visitor; + return Delegation.delegateTo(visitor); + } + if (segment instanceof Expression) { ExpressionVisitor visitor = new ExpressionVisitor(context); current = visitor; return Delegation.delegateTo(visitor); } - if (segment instanceof Condition) { - ConditionVisitor visitor = new ConditionVisitor(context); - current = visitor; - return Delegation.delegateTo(visitor); - } throw new IllegalStateException("Cannot provide visitor for " + segment); } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java index bcb5a87a..fc4e6cd8 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java @@ -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() {