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 7934bb47..779ecf6e 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 @@ -53,14 +53,4 @@ public interface Condition extends Segment { default Condition not() { return new Not(this); } - - /** - * Wraps a {@link Condition} into a condition group that groups the nested {@link Condition} using parentheses. - * - * @return the grouped {@link Condition}. - * @since 2.0 - */ - default Condition group() { - return new ConditionGroup(this); - } } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java index 2be8a2fc..49bc545f 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/Conditions.java @@ -43,6 +43,18 @@ public abstract class Conditions { return new ConstantCondition(sql); } + /** + * Creates a grouped {@link Condition} that is enclosed with parentheses. Useful to combine {@code AND} and {@code OR} + * statements. + * + * @param condition the nested condition to be grouped. + * @return a {@link GroupedCondition}. + * @since 2.0 + */ + public static Condition group(Condition condition) { + return new GroupedCondition(condition); + } + /** * Creates a {@code IS NULL} condition. * diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/ConditionGroup.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/GroupedCondition.java similarity index 88% rename from spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/ConditionGroup.java rename to spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/GroupedCondition.java index 18d9bd4d..93990347 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/ConditionGroup.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/GroupedCondition.java @@ -21,9 +21,9 @@ package org.springframework.data.relational.core.sql; * @author Mark Paluch * @since 2.0 */ -public class ConditionGroup extends MultipleCondition implements Condition { +public class GroupedCondition extends MultipleCondition implements Condition { - ConditionGroup(Condition condition) { + GroupedCondition(Condition condition) { super("", condition); } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/MultipleCondition.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/MultipleCondition.java index 37fefb32..d44445ee 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/MultipleCondition.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/MultipleCondition.java @@ -38,6 +38,10 @@ public abstract class MultipleCondition extends AbstractSegment implements Condi this.conditions = Arrays.asList(conditions); } + public List getConditions() { + return conditions; + } + /* * (non-Javadoc) * @see java.lang.Object#toString() diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java index 7a85706e..0ce9d01c 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionVisitor.java @@ -18,7 +18,7 @@ package org.springframework.data.relational.core.sql.render; import org.springframework.data.relational.core.sql.AndCondition; import org.springframework.data.relational.core.sql.Comparison; import org.springframework.data.relational.core.sql.Condition; -import org.springframework.data.relational.core.sql.ConditionGroup; +import org.springframework.data.relational.core.sql.GroupedCondition; import org.springframework.data.relational.core.sql.In; import org.springframework.data.relational.core.sql.IsNull; import org.springframework.data.relational.core.sql.Like; @@ -87,8 +87,8 @@ class ConditionVisitor extends TypedSubtreeVisitor implements PartRen return new InVisitor(context, builder::append); } - if (segment instanceof ConditionGroup) { - return new ConditionGroupVisitor(context, builder::append); + if (segment instanceof GroupedCondition) { + return new GroupedConditionVisitor(context, builder::append); } return null; diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionGroupVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/GroupedConditionVisitor.java similarity index 86% rename from spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionGroupVisitor.java rename to spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/GroupedConditionVisitor.java index 7521b6a7..38945519 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConditionGroupVisitor.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/GroupedConditionVisitor.java @@ -16,24 +16,24 @@ package org.springframework.data.relational.core.sql.render; import org.springframework.data.relational.core.sql.Condition; -import org.springframework.data.relational.core.sql.ConditionGroup; +import org.springframework.data.relational.core.sql.GroupedCondition; import org.springframework.data.relational.core.sql.Visitable; import org.springframework.lang.Nullable; /** - * Renderer for {@link ConditionGroup}. Uses a {@link RenderTarget} to call back for render results. + * Renderer for {@link GroupedCondition}. Uses a {@link RenderTarget} to call back for render results. * * @author Mark Paluch * @since 2.0 */ -class ConditionGroupVisitor extends TypedSubtreeVisitor { +class GroupedConditionVisitor extends TypedSubtreeVisitor { private final RenderContext context; private final RenderTarget target; private @Nullable ConditionVisitor conditionVisitor; - ConditionGroupVisitor(RenderContext context, RenderTarget target) { + GroupedConditionVisitor(RenderContext context, RenderTarget target) { this.context = context; this.target = target; } diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/ConditionRendererUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/ConditionRendererUnitTests.java index 0165c0f2..15ebcc2d 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/ConditionRendererUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/ConditionRendererUnitTests.java @@ -20,6 +20,7 @@ import static org.assertj.core.api.Assertions.*; import org.junit.Test; import org.springframework.data.relational.core.sql.Column; +import org.springframework.data.relational.core.sql.Conditions; import org.springframework.data.relational.core.sql.StatementBuilder; import org.springframework.data.relational.core.sql.Table; @@ -46,7 +47,7 @@ public class ConditionRendererUnitTests { public void shouldRenderEqualsGroup() { String sql = SqlRenderer - .toString(StatementBuilder.select(left).from(table).where(left.isEqualTo(right).group()).build()); + .toString(StatementBuilder.select(left).from(table).where(Conditions.group(left.isEqualTo(right))).build()); assertThat(sql).endsWith("WHERE (my_table.left = my_table.right)"); } @@ -55,7 +56,7 @@ public class ConditionRendererUnitTests { public void shouldRenderAndGroup() { String sql = SqlRenderer.toString(StatementBuilder.select(left).from(table) - .where(left.isEqualTo(right).and(left.isGreater(right)).group()).build()); + .where(Conditions.group(left.isEqualTo(right).and(left.isGreater(right)))).build()); assertThat(sql).endsWith("WHERE (my_table.left = my_table.right AND my_table.left > my_table.right)"); } @@ -64,21 +65,22 @@ public class ConditionRendererUnitTests { public void shouldRenderAndGroupOr() { String sql = SqlRenderer.toString(StatementBuilder.select(left).from(table) - .where(left.isEqualTo(right).and(left.isGreater(right)).group().or(left.like(right))).build()); + .where(Conditions.group(left.isEqualTo(right).and(left.isGreater(right))).or(left.like(right))).build()); assertThat(sql).endsWith( "WHERE (my_table.left = my_table.right AND my_table.left > my_table.right) OR my_table.left LIKE my_table.right"); } - @Test // DATAJDBC-490 - public void shouldRenderAndGroupOrAandGroup() { + public void shouldRenderAndGroupOrAndGroup() { String sql = SqlRenderer.toString(StatementBuilder.select(left).from(table) - .where(left.isEqualTo(right).and(left.isGreater(right)).group().or(left.like(right).and(right.like(left)).group())).build()); + .where(Conditions.group(left.isEqualTo(right).and(left.isGreater(right))) + .or(Conditions.group(left.like(right).and(right.like(left))))) + .build()); assertThat(sql).endsWith( - "WHERE (my_table.left = my_table.right AND my_table.left > my_table.right) OR (my_table.left LIKE my_table.right AND my_table.right LIKE my_table.left"); + "WHERE (my_table.left = my_table.right AND my_table.left > my_table.right) OR (my_table.left LIKE my_table.right AND my_table.right LIKE my_table.left)"); } @Test // DATAJDBC-309