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 1f58bd63f0..b2f7d894a1 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 @@ -27,6 +27,7 @@ * @author Mark Paluch * @author Jens Schauder * @author Meng Zuozhu + * @author Daniele Canteri * @since 1.1 * @see SQL * @see Expressions @@ -303,20 +304,6 @@ public static In notIn(Column column, Select subselect) { return notIn(column, new SubselectExpression(subselect)); } - static class ConstantCondition extends AbstractSegment implements Condition { - - private final String condition; - - ConstantCondition(String condition) { - this.condition = condition; - } - - @Override - public String toString() { - return condition; - } - } - // Utility constructor. private Conditions() {} } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/ConstantCondition.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/ConstantCondition.java new file mode 100644 index 0000000000..0a549bca35 --- /dev/null +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/ConstantCondition.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.relational.core.sql; + +/** + * {@link Condition} representing fixed sql statement + * + * @author Daniele Canteri + * @since 2.3 + */ +public class ConstantCondition extends AbstractSegment implements Condition { + + private final String condition; + + ConstantCondition(String condition) { + this.condition = condition; + } + + @Override + public String toString() { + return condition; + } +} 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 e48315807d..b6231efa26 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 @@ -19,6 +19,7 @@ import org.springframework.data.relational.core.sql.Between; import org.springframework.data.relational.core.sql.Comparison; import org.springframework.data.relational.core.sql.Condition; +import org.springframework.data.relational.core.sql.ConstantCondition; import org.springframework.data.relational.core.sql.In; import org.springframework.data.relational.core.sql.IsNull; import org.springframework.data.relational.core.sql.Like; @@ -32,6 +33,7 @@ * * @author Mark Paluch * @author Jens Schauder + * @author Daniele Canteri * @since 1.1 * @see AndCondition * @see OrCondition @@ -101,6 +103,10 @@ private DelegatingVisitor getDelegation(Condition segment) { return new NestedConditionVisitor(context, builder::append); } + if (segment instanceof ConstantCondition) { + return new ConstantConditionVisitor(context, builder::append); + } + return null; } diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConstantConditionVisitor.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConstantConditionVisitor.java new file mode 100644 index 0000000000..7c0240d99a --- /dev/null +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ConstantConditionVisitor.java @@ -0,0 +1,48 @@ +/* + * Copyright 2019-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.relational.core.sql.render; + +import org.springframework.data.relational.core.sql.ConstantCondition; + +/** + * Renderer for {@link ConstantCondition}. Uses a {@link RenderTarget} to call back for render results. + * + * @author Daniele Canteri + * @since 2.3 + */ +class ConstantConditionVisitor extends TypedSingleConditionRenderSupport { + + private final RenderTarget target; + + ConstantConditionVisitor(RenderContext context, RenderTarget target) { + super(context); + this.target = target; + } + + /** + * + * (non-Javadoc) + * @see org.springframework.data.relational.core.sql.render.TypedSubtreeVisitor#leaveMatched(org.springframework.data.relational.core.sql.Visitable) + */ + @Override + Delegation leaveMatched(ConstantCondition segment) { + + target.onRendered(segment.toString()); + + return super.leaveMatched(segment); + } + +} 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 7ccb445a3a..a9f81e26da 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 @@ -29,6 +29,7 @@ * Unit tests for rendered {@link org.springframework.data.relational.core.sql.Conditions}. * * @author Mark Paluch + * @author Daniele Canteri */ public class ConditionRendererUnitTests { @@ -230,4 +231,14 @@ public void shouldRenderNotIn() { assertThat(sql).endsWith("WHERE my_table.left NOT IN (my_table.right)"); } + + @Test // DATAJDBC-907 + public void shouldRenderJust() { + + String sql = SqlRenderer.toString(StatementBuilder.select(left).from(table) + .where(Conditions.just("sql")) + .build()); + + assertThat(sql).endsWith("WHERE sql"); + } }