Skip to content

Commit 4584e5d

Browse files
committed
DATAJDBC-309 - Introduce RenderContext and RenderNamingStrategy.
Introduce naming strategy to customize table and column naming.
1 parent 3fe0bce commit 4584e5d

23 files changed

+477
-78
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,17 @@
3131
*/
3232
class ComparisonVisitor extends FilteredSubtreeVisitor {
3333

34+
private final RenderContext context;
3435
private final Comparison condition;
3536
private final RenderTarget target;
3637
private final StringBuilder part = new StringBuilder();
3738
private @Nullable PartRenderer current;
3839

39-
ComparisonVisitor(Comparison condition, RenderTarget target) {
40+
ComparisonVisitor(RenderContext context, Comparison condition, RenderTarget target) {
4041
super(it -> it == condition);
4142
this.condition = condition;
4243
this.target = target;
44+
this.context = context;
4345
}
4446

4547
/*
@@ -50,13 +52,13 @@ class ComparisonVisitor extends FilteredSubtreeVisitor {
5052
Delegation enterNested(Visitable segment) {
5153

5254
if (segment instanceof Expression) {
53-
ExpressionVisitor visitor = new ExpressionVisitor();
55+
ExpressionVisitor visitor = new ExpressionVisitor(context);
5456
current = visitor;
5557
return Delegation.delegateTo(visitor);
5658
}
5759

5860
if (segment instanceof Condition) {
59-
ConditionVisitor visitor = new ConditionVisitor();
61+
ConditionVisitor visitor = new ConditionVisitor(context);
6062
current = visitor;
6163
return Delegation.delegateTo(visitor);
6264
}

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,13 @@
3939
*/
4040
class ConditionVisitor extends TypedSubtreeVisitor<Condition> implements PartRenderer {
4141

42+
private final RenderContext context;
4243
private StringBuilder builder = new StringBuilder();
4344

45+
ConditionVisitor(RenderContext context) {
46+
this.context = context;
47+
}
48+
4449
/*
4550
* (non-Javadoc)
4651
* @see org.springframework.data.relational.core.sql.render.TypedSubtreeVisitor#enterMatched(org.springframework.data.relational.core.sql.Visitable)
@@ -57,27 +62,27 @@ Delegation enterMatched(Condition segment) {
5762
private DelegatingVisitor getDelegation(Condition segment) {
5863

5964
if (segment instanceof AndCondition) {
60-
return new MultiConcatConditionVisitor((AndCondition) segment, builder::append);
65+
return new MultiConcatConditionVisitor(context, (AndCondition) segment, builder::append);
6166
}
6267

6368
if (segment instanceof OrCondition) {
64-
return new MultiConcatConditionVisitor((OrCondition) segment, builder::append);
69+
return new MultiConcatConditionVisitor(context, (OrCondition) segment, builder::append);
6570
}
6671

6772
if (segment instanceof IsNull) {
68-
return new IsNullVisitor(builder::append);
73+
return new IsNullVisitor(context, builder::append);
6974
}
7075

7176
if (segment instanceof Comparison) {
72-
return new ComparisonVisitor((Comparison) segment, builder::append);
77+
return new ComparisonVisitor(context, (Comparison) segment, builder::append);
7378
}
7479

7580
if (segment instanceof Like) {
76-
return new LikeVisitor((Like) segment, builder::append);
81+
return new LikeVisitor((Like) segment, context, builder::append);
7782
}
7883

7984
if (segment instanceof In) {
80-
return new InVisitor(builder::append);
85+
return new InVisitor(context, builder::append);
8186
}
8287

8388
return null;

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,13 @@
3333
*/
3434
class ExpressionVisitor extends TypedSubtreeVisitor<Expression> implements PartRenderer {
3535

36+
private final RenderContext context;
37+
3638
private CharSequence value = "";
3739
private PartRenderer partRenderer;
3840

39-
ExpressionVisitor() {
41+
ExpressionVisitor(RenderContext context) {
42+
this.context = context;
4043
}
4144

4245
/*
@@ -48,13 +51,17 @@ Delegation enterMatched(Expression segment) {
4851

4952
if (segment instanceof SubselectExpression) {
5053

51-
SelectStatementVisitor visitor = new SelectStatementVisitor();
54+
SelectStatementVisitor visitor = new SelectStatementVisitor(context);
5255
partRenderer = visitor;
5356
return Delegation.delegateTo(visitor);
5457
}
5558

5659
if (segment instanceof Column) {
57-
value = ((Column) segment).getTable().getReferenceName() + "." + ((Column) segment).getReferenceName();
60+
61+
RenderNamingStrategy namingStrategy = context.getNamingStrategy();
62+
Column column = (Column) segment;
63+
64+
value = namingStrategy.getReferenceName(column.getTable()) + "." + namingStrategy.getReferenceName(column);
5865
} else if (segment instanceof BindMarker) {
5966

6067
if (segment instanceof Named) {
@@ -75,7 +82,7 @@ Delegation enterMatched(Expression segment) {
7582
Delegation enterNested(Visitable segment) {
7683

7784
if (segment instanceof Condition) {
78-
ConditionVisitor visitor = new ConditionVisitor();
85+
ConditionVisitor visitor = new ConditionVisitor(context);
7986
partRenderer = visitor;
8087
return Delegation.delegateTo(visitor);
8188
}

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,20 @@
3030
*/
3131
abstract class FilteredSingleConditionRenderSupport extends FilteredSubtreeVisitor {
3232

33+
private final RenderContext context;
3334
private PartRenderer current;
3435

3536
/**
3637
* Creates a new {@link FilteredSingleConditionRenderSupport} given the filter {@link Predicate}.
3738
*
39+
* @param context
3840
* @param filter filter predicate to identify when to {@link #enterMatched(Visitable)
3941
* enter}/{@link #leaveMatched(Visitable) leave} the {@link Visitable segment} that this visitor is
4042
* responsible for.
4143
*/
42-
FilteredSingleConditionRenderSupport(Predicate<Visitable> filter) {
44+
FilteredSingleConditionRenderSupport(RenderContext context, Predicate<Visitable> filter) {
4345
super(filter);
46+
this.context = context;
4447
}
4548

4649
/*
@@ -51,13 +54,13 @@ abstract class FilteredSingleConditionRenderSupport extends FilteredSubtreeVisit
5154
Delegation enterNested(Visitable segment) {
5255

5356
if (segment instanceof Expression) {
54-
ExpressionVisitor visitor = new ExpressionVisitor();
57+
ExpressionVisitor visitor = new ExpressionVisitor(context);
5558
current = visitor;
5659
return Delegation.delegateTo(visitor);
5760
}
5861

5962
if (segment instanceof Condition) {
60-
ConditionVisitor visitor = new ConditionVisitor();
63+
ConditionVisitor visitor = new ConditionVisitor(context);
6164
current = visitor;
6265
return Delegation.delegateTo(visitor);
6366
}

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,24 @@
2626
*/
2727
class FromClauseVisitor extends TypedSubtreeVisitor<From> {
2828

29-
private final StringBuilder builder = new StringBuilder();
29+
private final FromTableVisitor visitor;
3030
private final RenderTarget parent;
31-
31+
private final StringBuilder builder = new StringBuilder();
3232
private boolean first = true;
33-
private final FromTableVisitor visitor = new FromTableVisitor(it -> {
3433

35-
if (first) {
36-
first = false;
37-
} else {
38-
builder.append(", ");
39-
}
34+
FromClauseVisitor(RenderContext context, RenderTarget parent) {
35+
36+
this.visitor = new FromTableVisitor(context, it -> {
37+
38+
if (first) {
39+
first = false;
40+
} else {
41+
builder.append(", ");
42+
}
4043

41-
builder.append(it);
42-
});
44+
builder.append(it);
45+
});
4346

44-
FromClauseVisitor(RenderTarget parent) {
4547
this.parent = parent;
4648
}
4749

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
*/
2929
class FromTableVisitor extends TypedSubtreeVisitor<Table> {
3030

31+
private final RenderContext context;
3132
private final RenderTarget parent;
3233

33-
FromTableVisitor(RenderTarget parent) {
34+
FromTableVisitor(RenderContext context, RenderTarget parent) {
3435
super();
36+
this.context = context;
3537
this.parent = parent;
3638
}
3739

@@ -44,7 +46,7 @@ Delegation enterMatched(Table segment) {
4446

4547
StringBuilder builder = new StringBuilder();
4648

47-
builder.append(segment.getName());
49+
builder.append(context.getNamingStrategy().getName(segment));
4850
if (segment instanceof Aliased) {
4951
builder.append(" AS ").append(((Aliased) segment).getAlias());
5052
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class InVisitor extends TypedSingleConditionRenderSupport<In> {
3030
private final StringBuilder part = new StringBuilder();
3131
private boolean needsComma = false;
3232

33-
InVisitor(RenderTarget target) {
33+
InVisitor(RenderContext context, RenderTarget target) {
34+
super(context);
3435
this.target = target;
3536
}
3637

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class IsNullVisitor extends TypedSingleConditionRenderSupport<IsNull> {
2929
private final RenderTarget target;
3030
private final StringBuilder part = new StringBuilder();
3131

32-
IsNullVisitor(RenderTarget target) {
32+
IsNullVisitor(RenderContext context, RenderTarget target) {
33+
super(context);
3334
this.target = target;
3435
}
3536

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@
2929
*/
3030
class JoinVisitor extends TypedSubtreeVisitor<Join> {
3131

32+
private final RenderContext context;
3233
private final RenderTarget parent;
3334
private final StringBuilder joinClause = new StringBuilder();
3435
private boolean inCondition = false;
3536
private boolean hasSeenCondition = false;
3637

37-
JoinVisitor(RenderTarget parent) {
38+
JoinVisitor(RenderContext context, RenderTarget parent) {
39+
this.context = context;
3840
this.parent = parent;
3941
}
4042

@@ -58,7 +60,7 @@ Delegation enterMatched(Join segment) {
5860
Delegation enterNested(Visitable segment) {
5961

6062
if (segment instanceof Table && !inCondition) {
61-
joinClause.append(((Table) segment).getName());
63+
joinClause.append(context.getNamingStrategy().getName(((Table) segment)));
6264
if (segment instanceof Aliased) {
6365
joinClause.append(" AS ").append(((Aliased) segment).getAlias());
6466
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@
3030
*/
3131
class LikeVisitor extends FilteredSubtreeVisitor {
3232

33+
private final RenderContext context;
3334
private final RenderTarget target;
3435
private final StringBuilder part = new StringBuilder();
3536
private @Nullable PartRenderer current;
3637

37-
LikeVisitor(Like condition, RenderTarget target) {
38+
LikeVisitor(Like condition, RenderContext context, RenderTarget target) {
3839
super(it -> it == condition);
40+
this.context = context;
3941
this.target = target;
4042
}
4143

@@ -47,13 +49,13 @@ class LikeVisitor extends FilteredSubtreeVisitor {
4749
Delegation enterNested(Visitable segment) {
4850

4951
if (segment instanceof Expression) {
50-
ExpressionVisitor visitor = new ExpressionVisitor();
52+
ExpressionVisitor visitor = new ExpressionVisitor(context);
5153
current = visitor;
5254
return Delegation.delegateTo(visitor);
5355
}
5456

5557
if (segment instanceof Condition) {
56-
ConditionVisitor visitor = new ConditionVisitor();
58+
ConditionVisitor visitor = new ConditionVisitor(context);
5759
current = visitor;
5860
return Delegation.delegateTo(visitor);
5961
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ class MultiConcatConditionVisitor extends FilteredSingleConditionRenderSupport {
3232
private final String concat;
3333
private final StringBuilder part = new StringBuilder();
3434

35-
MultiConcatConditionVisitor(AndCondition condition, RenderTarget target) {
36-
super(it -> it == condition);
35+
MultiConcatConditionVisitor(RenderContext context, AndCondition condition, RenderTarget target) {
36+
super(context, it -> it == condition);
3737
this.target = target;
3838
this.concat = " AND ";
3939
}
4040

41-
MultiConcatConditionVisitor(OrCondition condition, RenderTarget target) {
42-
super(it -> it == condition);
41+
MultiConcatConditionVisitor(RenderContext context, OrCondition condition, RenderTarget target) {
42+
super(context, it -> it == condition);
4343
this.target = target;
4444
this.concat = " OR ";
4545
}

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@
2828
public class NaiveSqlRenderer {
2929

3030
private final Select select;
31+
private final RenderContext context;
3132

32-
private NaiveSqlRenderer(Select select) {
33+
private NaiveSqlRenderer(Select select, RenderContext context) {
34+
this.context = context;
3335

3436
Assert.notNull(select, "Select must not be null!");
3537

@@ -43,7 +45,18 @@ private NaiveSqlRenderer(Select select) {
4345
* @return the renderer.
4446
*/
4547
public static NaiveSqlRenderer create(Select select) {
46-
return new NaiveSqlRenderer(select);
48+
return new NaiveSqlRenderer(select, new SimpleRenderContext(NamingStrategies.asIs()));
49+
}
50+
51+
/**
52+
* Creates a new {@link NaiveSqlRenderer} using a {@link RenderContext}.
53+
*
54+
* @param select must not be {@literal null}.
55+
* @param context must not be {@literal null}.
56+
* @return the renderer.
57+
*/
58+
public static NaiveSqlRenderer create(Select select, RenderContext context) {
59+
return new NaiveSqlRenderer(select, context);
4760
}
4861

4962
/**
@@ -63,7 +76,7 @@ public static String render(Select select) {
6376
*/
6477
public String render() {
6578

66-
SelectStatementVisitor visitor = new SelectStatementVisitor();
79+
SelectStatementVisitor visitor = new SelectStatementVisitor(context);
6780
select.visit(visitor);
6881

6982
return visitor.getRenderedPart().toString();

0 commit comments

Comments
 (0)