Browse Source

Polishing.

Minor formatting.
Adding author tag in Javadoc.
Fixing warnings.

Original pull request #1844
pull/1854/head
Jens Schauder 1 year ago
parent
commit
46d0a0629b
No known key found for this signature in database
GPG Key ID: 74F6C554AE971567
  1. 133
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/CaseExpression.java
  2. 1
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/When.java
  3. 7
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ExpressionVisitor.java
  4. 12
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java
  5. 1
      spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/WhenVisitor.java
  6. 6
      spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitorUnitTests.java
  7. 6
      spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/SelectRendererUnitTests.java

133
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/CaseExpression.java

@ -1,9 +1,11 @@
package org.springframework.data.relational.core.sql; package org.springframework.data.relational.core.sql;
import org.springframework.lang.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.*;
/** /**
* Case with one or more conditions expression. * Case with one or more conditions expression.
@ -22,73 +24,64 @@ import static java.util.stream.Collectors.joining;
* @since 3.4 * @since 3.4
*/ */
public class CaseExpression extends AbstractSegment implements Expression { public class CaseExpression extends AbstractSegment implements Expression {
private final List<When> whenList;
private final Expression elseExpression; private final List<When> whenList;
@Nullable
private CaseExpression(List<When> whenList, Expression elseExpression) { private final Expression elseExpression;
super(children(whenList, elseExpression)); private static Segment[] children(List<When> whenList, @Nullable Expression elseExpression) {
this.whenList = whenList;
this.elseExpression = elseExpression; List<Segment> segments = new ArrayList<>(whenList);
}
if (elseExpression != null) {
/** segments.add(elseExpression);
* Create CASE {@link Expression} with initial {@link When} condition. }
* @param condition initial {@link When} condition
* @return the {@link CaseExpression} return segments.toArray(new Segment[0]);
*/ }
public static CaseExpression create(When condition) {
return new CaseExpression(List.of(condition), null); private CaseExpression(List<When> whenList, @Nullable Expression elseExpression) {
}
super(children(whenList, elseExpression));
/**
* Add additional {@link When} condition this.whenList = whenList;
* @param condition the {@link When} condition this.elseExpression = elseExpression;
* @return the {@link CaseExpression} }
*/
public CaseExpression when(When condition) { /**
List<When> conditions = new ArrayList<>(this.whenList); * Create CASE {@link Expression} with initial {@link When} condition.
conditions.add(condition); *
return new CaseExpression(conditions, elseExpression); * @param condition initial {@link When} condition
} * @return the {@link CaseExpression}
*/
/** public static CaseExpression create(When condition) {
* Add ELSE clause return new CaseExpression(List.of(condition), null);
* @param elseExpression the {@link Expression} else value }
* @return the {@link CaseExpression}
*/ /**
public CaseExpression elseExpression(Literal elseExpression) { * Add additional {@link When} condition
return new CaseExpression(whenList, elseExpression); *
} * @param condition the {@link When} condition
* @return the {@link CaseExpression}
/** */
* @return the {@link When} conditions public CaseExpression when(When condition) {
*/ List<When> conditions = new ArrayList<>(this.whenList);
public List<When> getWhenList() { conditions.add(condition);
return whenList; return new CaseExpression(conditions, elseExpression);
} }
/** /**
* @return the ELSE {@link Literal} value * Add ELSE clause
*/ *
public Expression getElseExpression() { * @param elseExpression the {@link Expression} else value
return elseExpression; * @return the {@link CaseExpression}
} */
public CaseExpression elseExpression(Expression elseExpression) {
@Override return new CaseExpression(whenList, elseExpression);
public String toString() { }
return "CASE " + whenList.stream().map(When::toString).collect(joining(" ")) + (elseExpression != null ? " ELSE " + elseExpression : "") + " END";
} @Override
public String toString() {
private static Segment[] children(List<When> whenList, Expression elseExpression) { return "CASE " + whenList.stream().map(When::toString).collect(joining(" ")) + (elseExpression != null ? " ELSE " + elseExpression : "") + " END";
}
List<Segment> segments = new ArrayList<>();
segments.addAll(whenList);
if (elseExpression != null) {
segments.add(elseExpression);
}
return segments.toArray(new Segment[segments.size()]);
}
} }

1
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/When.java

@ -10,6 +10,7 @@ package org.springframework.data.relational.core.sql;
* @since 3.4 * @since 3.4
*/ */
public class When extends AbstractSegment { public class When extends AbstractSegment {
private final Condition condition; private final Condition condition;
private final Expression value; private final Expression value;

7
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/ExpressionVisitor.java

@ -24,7 +24,7 @@ import org.springframework.util.Assert;
* *
* @author Mark Paluch * @author Mark Paluch
* @author Jens Schauder * @author Jens Schauder
* @since 1.1 * @author Sven Rienstra
* @see Column * @see Column
* @see SubselectExpression * @see SubselectExpression
*/ */
@ -48,7 +48,7 @@ class ExpressionVisitor extends TypedSubtreeVisitor<Expression> implements PartR
/** /**
* Creates an {@code ExpressionVisitor}. * Creates an {@code ExpressionVisitor}.
* *
* @param context must not be {@literal null}. * @param context must not be {@literal null}.
* @param aliasHandling controls if columns should be rendered as their alias or using their table names. * @param aliasHandling controls if columns should be rendered as their alias or using their table names.
* @since 2.3 * @since 2.3
*/ */
@ -109,6 +109,7 @@ class ExpressionVisitor extends TypedSubtreeVisitor<Expression> implements PartR
partRenderer = visitor; partRenderer = visitor;
return Delegation.delegateTo(visitor); return Delegation.delegateTo(visitor);
} else if (segment instanceof CaseExpression) { } else if (segment instanceof CaseExpression) {
CaseExpressionVisitor visitor = new CaseExpressionVisitor(context); CaseExpressionVisitor visitor = new CaseExpressionVisitor(context);
partRenderer = visitor; partRenderer = visitor;
return Delegation.delegateTo(visitor); return Delegation.delegateTo(visitor);
@ -132,7 +133,7 @@ class ExpressionVisitor extends TypedSubtreeVisitor<Expression> implements PartR
if (segment instanceof InlineQuery) { if (segment instanceof InlineQuery) {
NoopVisitor<InlineQuery> partRenderer = new NoopVisitor(InlineQuery.class); NoopVisitor<InlineQuery> partRenderer = new NoopVisitor<>(InlineQuery.class);
return Delegation.delegateTo(partRenderer); return Delegation.delegateTo(partRenderer);
} }
return super.enterNested(segment); return super.enterNested(segment);

12
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitor.java

@ -16,8 +16,8 @@
package org.springframework.data.relational.core.sql.render; package org.springframework.data.relational.core.sql.render;
import org.springframework.data.relational.core.sql.Column;
import org.springframework.data.relational.core.sql.CaseExpression; import org.springframework.data.relational.core.sql.CaseExpression;
import org.springframework.data.relational.core.sql.Column;
import org.springframework.data.relational.core.sql.Expressions; import org.springframework.data.relational.core.sql.Expressions;
import org.springframework.data.relational.core.sql.OrderByField; import org.springframework.data.relational.core.sql.OrderByField;
import org.springframework.data.relational.core.sql.SimpleFunction; import org.springframework.data.relational.core.sql.SimpleFunction;
@ -31,6 +31,7 @@ import org.springframework.lang.Nullable;
* @author Jens Schauder * @author Jens Schauder
* @author Chirag Tailor * @author Chirag Tailor
* @author Koen Punt * @author Koen Punt
* @author Sven Rienstra
* @since 1.1 * @since 1.1
*/ */
class OrderByClauseVisitor extends TypedSubtreeVisitor<OrderByField> implements PartRenderer { class OrderByClauseVisitor extends TypedSubtreeVisitor<OrderByField> implements PartRenderer {
@ -39,7 +40,8 @@ class OrderByClauseVisitor extends TypedSubtreeVisitor<OrderByField> implements
private final StringBuilder builder = new StringBuilder(); private final StringBuilder builder = new StringBuilder();
@Nullable private PartRenderer delegate; @Nullable
private PartRenderer delegate;
private boolean first = true; private boolean first = true;
@ -69,7 +71,7 @@ class OrderByClauseVisitor extends TypedSubtreeVisitor<OrderByField> implements
String nullPrecedence = context.getSelectRenderContext().evaluateOrderByNullHandling(segment.getNullHandling()); String nullPrecedence = context.getSelectRenderContext().evaluateOrderByNullHandling(segment.getNullHandling());
if (!nullPrecedence.isEmpty()) { if (!nullPrecedence.isEmpty()) {
builder.append(" ") // builder.append(" ") //
.append(nullPrecedence); .append(nullPrecedence);
} }
@ -82,12 +84,12 @@ class OrderByClauseVisitor extends TypedSubtreeVisitor<OrderByField> implements
if (segment instanceof SimpleFunction) { if (segment instanceof SimpleFunction) {
delegate = new SimpleFunctionVisitor(context); delegate = new SimpleFunctionVisitor(context);
return Delegation.delegateTo((SimpleFunctionVisitor)delegate); return Delegation.delegateTo((SimpleFunctionVisitor) delegate);
} }
if (segment instanceof Expressions.SimpleExpression || segment instanceof CaseExpression) { if (segment instanceof Expressions.SimpleExpression || segment instanceof CaseExpression) {
delegate = new ExpressionVisitor(context); delegate = new ExpressionVisitor(context);
return Delegation.delegateTo((ExpressionVisitor)delegate); return Delegation.delegateTo((ExpressionVisitor) delegate);
} }
return super.enterNested(segment); return super.enterNested(segment);

1
spring-data-relational/src/main/java/org/springframework/data/relational/core/sql/render/WhenVisitor.java

@ -10,6 +10,7 @@ import org.springframework.data.relational.core.sql.When;
* @since 3.4 * @since 3.4
*/ */
public class WhenVisitor extends TypedSingleConditionRenderSupport<When> implements PartRenderer { public class WhenVisitor extends TypedSingleConditionRenderSupport<When> implements PartRenderer {
private final StringBuilder part = new StringBuilder(); private final StringBuilder part = new StringBuilder();
private boolean conditionRendered; private boolean conditionRendered;

6
spring-data-relational/src/test/java/org/springframework/data/relational/core/sql/render/OrderByClauseVisitorUnitTests.java

@ -29,6 +29,7 @@ import java.util.List;
* @author Mark Paluch * @author Mark Paluch
* @author Jens Schauder * @author Jens Schauder
* @author Koen Punt * @author Koen Punt
* @author Sven Rienstra
*/ */
class OrderByClauseVisitorUnitTests { class OrderByClauseVisitorUnitTests {
@ -125,15 +126,16 @@ class OrderByClauseVisitorUnitTests {
@Test @Test
void shouldRenderOrderByCase() { void shouldRenderOrderByCase() {
Table employee = SQL.table("employee").as("emp"); Table employee = SQL.table("employee").as("emp");
Column column = employee.column("name"); Column column = employee.column("name");
CaseExpression caseExpression = CaseExpression.create(When.when(column.isNull(), SQL.literalOf(1))).elseExpression(SQL.literalOf(2)); CaseExpression caseExpression = CaseExpression.create(When.when(column.isNull(), SQL.literalOf(1))).elseExpression(SQL.literalOf(column));
Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(caseExpression).asc()).build(); Select select = Select.builder().select(column).from(employee).orderBy(OrderByField.from(caseExpression).asc()).build();
OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs())); OrderByClauseVisitor visitor = new OrderByClauseVisitor(new SimpleRenderContext(NamingStrategies.asIs()));
select.visit(visitor); select.visit(visitor);
assertThat(visitor.getRenderedPart().toString()).isEqualTo("CASE WHEN emp.name IS NULL THEN 1 ELSE 2 END ASC"); assertThat(visitor.getRenderedPart().toString()).isEqualTo("CASE WHEN emp.name IS NULL THEN 1 ELSE emp.name END ASC");
} }
} }

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

@ -31,6 +31,7 @@ import java.util.List;
* *
* @author Mark Paluch * @author Mark Paluch
* @author Jens Schauder * @author Jens Schauder
* @author Sven Rienstra
*/ */
class SelectRendererUnitTests { class SelectRendererUnitTests {
@ -690,11 +691,12 @@ class SelectRendererUnitTests {
@Test @Test
void rendersCaseExpression() { void rendersCaseExpression() {
Table table = SQL.table("table"); Table table = SQL.table("table");
Column column = table.column("name"); Column column = table.column("name");
CaseExpression caseExpression = CaseExpression.create(When.when(column.isNull(), SQL.literalOf(1))) // CaseExpression caseExpression = CaseExpression.create(When.when(column.isNull(), SQL.literalOf(1))) //
.when(When.when(column.isNotNull(), SQL.literalOf(2))) // .when(When.when(column.isNotNull(), column)) //
.elseExpression(SQL.literalOf(3)); .elseExpression(SQL.literalOf(3));
Select select = StatementBuilder.select(caseExpression) // Select select = StatementBuilder.select(caseExpression) //
@ -702,7 +704,7 @@ class SelectRendererUnitTests {
.build(); .build();
String rendered = SqlRenderer.toString(select); String rendered = SqlRenderer.toString(select);
assertThat(rendered).isEqualTo("SELECT CASE WHEN table.name IS NULL THEN 1 WHEN table.name IS NOT NULL THEN 2 ELSE 3 END FROM table"); assertThat(rendered).isEqualTo("SELECT CASE WHEN table.name IS NULL THEN 1 WHEN table.name IS NOT NULL THEN table.name ELSE 3 END FROM table");
} }
/** /**

Loading…
Cancel
Save