Skip to content

Commit bf5c72b

Browse files
committed
Move creation of the table alias calculator to the rendering phase
1 parent 7281e22 commit bf5c72b

File tree

3 files changed

+38
-34
lines changed

3 files changed

+38
-34
lines changed

src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionModel.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2020 the original author or authors.
2+
* Copyright 2016-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -27,8 +27,6 @@
2727
import org.mybatis.dynamic.sql.BasicColumn;
2828
import org.mybatis.dynamic.sql.SqlTable;
2929
import org.mybatis.dynamic.sql.TableExpression;
30-
import org.mybatis.dynamic.sql.render.GuaranteedTableAliasCalculator;
31-
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
3230
import org.mybatis.dynamic.sql.select.join.JoinModel;
3331
import org.mybatis.dynamic.sql.where.WhereModel;
3432

@@ -38,7 +36,7 @@ public class QueryExpressionModel {
3836
private final List<BasicColumn> selectList;
3937
private final TableExpression table;
4038
private final JoinModel joinModel;
41-
private final TableAliasCalculator tableAliasCalculator;
39+
private final Map<SqlTable, String> tableAliases;
4240
private final WhereModel whereModel;
4341
private final GroupByModel groupByModel;
4442

@@ -48,22 +46,11 @@ private QueryExpressionModel(Builder builder) {
4846
selectList = Objects.requireNonNull(builder.selectList);
4947
table = Objects.requireNonNull(builder.table);
5048
joinModel = builder.joinModel;
51-
tableAliasCalculator = joinModel().map(jm -> determineJoinTableAliasCalculator(jm, builder.tableAliases))
52-
.orElseGet(() -> TableAliasCalculator.of(builder.tableAliases));
49+
tableAliases = builder.tableAliases;
5350
whereModel = builder.whereModel;
5451
groupByModel = builder.groupByModel;
5552
}
5653

57-
private TableAliasCalculator determineJoinTableAliasCalculator(JoinModel joinModel, Map<SqlTable,
58-
String> tableAliases) {
59-
if (joinModel.containsSubQueries()) {
60-
// if there are subQueries, then force explicit qualifiers
61-
return TableAliasCalculator.of(tableAliases);
62-
} else {
63-
return GuaranteedTableAliasCalculator.of(tableAliases);
64-
}
65-
}
66-
6754
public Optional<String> connector() {
6855
return Optional.ofNullable(connector);
6956
}
@@ -80,8 +67,8 @@ public TableExpression table() {
8067
return table;
8168
}
8269

83-
public TableAliasCalculator tableAliasCalculator() {
84-
return tableAliasCalculator;
70+
public Map<SqlTable, String> tableAliases() {
71+
return tableAliases;
8572
}
8673

8774
public Optional<WhereModel> whereModel() {

src/main/java/org/mybatis/dynamic/sql/select/render/JoinRenderer.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2020 the original author or authors.
2+
* Copyright 2016-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@
2222
import java.util.stream.Collectors;
2323

2424
import org.mybatis.dynamic.sql.BasicColumn;
25-
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
25+
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
2626
import org.mybatis.dynamic.sql.select.join.JoinCriterion;
2727
import org.mybatis.dynamic.sql.select.join.JoinModel;
2828
import org.mybatis.dynamic.sql.select.join.JoinSpecification;
@@ -31,13 +31,13 @@
3131

3232
public class JoinRenderer {
3333
private final JoinModel joinModel;
34-
private final QueryExpressionModel queryExpression;
3534
private final TableExpressionRenderer tableExpressionRenderer;
35+
private final TableAliasCalculator tableAliasCalculator;
3636

3737
private JoinRenderer(Builder builder) {
3838
joinModel = Objects.requireNonNull(builder.joinModel);
39-
queryExpression = Objects.requireNonNull(builder.queryExpression);
4039
tableExpressionRenderer = Objects.requireNonNull(builder.tableExpressionRenderer);
40+
tableAliasCalculator = Objects.requireNonNull(builder.tableAliasCalculator);
4141
}
4242

4343
public FragmentAndParameters render() {
@@ -75,7 +75,7 @@ private String renderCriterion(JoinCriterion joinCriterion) {
7575
}
7676

7777
private String applyTableAlias(BasicColumn column) {
78-
return column.renderWithTableAlias(queryExpression.tableAliasCalculator());
78+
return column.renderWithTableAlias(tableAliasCalculator);
7979
}
8080

8181
public static Builder withJoinModel(JoinModel joinModel) {
@@ -84,21 +84,21 @@ public static Builder withJoinModel(JoinModel joinModel) {
8484

8585
public static class Builder {
8686
private JoinModel joinModel;
87-
private QueryExpressionModel queryExpression;
8887
private TableExpressionRenderer tableExpressionRenderer;
88+
private TableAliasCalculator tableAliasCalculator;
8989

9090
public Builder withJoinModel(JoinModel joinModel) {
9191
this.joinModel = joinModel;
9292
return this;
9393
}
9494

95-
public Builder withQueryExpression(QueryExpressionModel queryExpression) {
96-
this.queryExpression = queryExpression;
95+
public Builder withTableExpressionRenderer(TableExpressionRenderer tableExpressionRenderer) {
96+
this.tableExpressionRenderer = tableExpressionRenderer;
9797
return this;
9898
}
9999

100-
public Builder withTableExpressionRenderer(TableExpressionRenderer tableExpressionRenderer) {
101-
this.tableExpressionRenderer = tableExpressionRenderer;
100+
public Builder withTableAliasCalculator(TableAliasCalculator tableAliasCalculator) {
101+
this.tableAliasCalculator = tableAliasCalculator;
102102
return this;
103103
}
104104

src/main/java/org/mybatis/dynamic/sql/select/render/QueryExpressionRenderer.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2020 the original author or authors.
2+
* Copyright 2016-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -25,7 +25,9 @@
2525

2626
import org.mybatis.dynamic.sql.BasicColumn;
2727
import org.mybatis.dynamic.sql.TableExpression;
28+
import org.mybatis.dynamic.sql.render.GuaranteedTableAliasCalculator;
2829
import org.mybatis.dynamic.sql.render.RenderingStrategy;
30+
import org.mybatis.dynamic.sql.render.TableAliasCalculator;
2931
import org.mybatis.dynamic.sql.select.GroupByModel;
3032
import org.mybatis.dynamic.sql.select.QueryExpressionModel;
3133
import org.mybatis.dynamic.sql.select.join.JoinModel;
@@ -40,18 +42,33 @@ public class QueryExpressionRenderer {
4042
private final RenderingStrategy renderingStrategy;
4143
private final AtomicInteger sequence;
4244
private final TableExpressionRenderer tableExpressionRenderer;
45+
private final TableAliasCalculator tableAliasCalculator;
4346

4447
private QueryExpressionRenderer(Builder builder) {
4548
queryExpression = Objects.requireNonNull(builder.queryExpression);
4649
renderingStrategy = Objects.requireNonNull(builder.renderingStrategy);
4750
sequence = Objects.requireNonNull(builder.sequence);
51+
tableAliasCalculator = determineJoinTableAliasCalculator(queryExpression);
4852
tableExpressionRenderer = new TableExpressionRenderer.Builder()
49-
.withTableAliasCalculator(queryExpression.tableAliasCalculator())
53+
.withTableAliasCalculator(tableAliasCalculator)
5054
.withRenderingStrategy(renderingStrategy)
5155
.withSequence(sequence)
5256
.build();
5357
}
5458

59+
private TableAliasCalculator determineJoinTableAliasCalculator(QueryExpressionModel queryExpression) {
60+
return queryExpression.joinModel().map(JoinModel::containsSubQueries).map(containsSubQueries -> {
61+
if (containsSubQueries) {
62+
// if there are subQueries, then force explicit qualifiers
63+
return TableAliasCalculator.of(queryExpression.tableAliases());
64+
} else {
65+
// there are joins, but no sub-queries. In this case, we can use the
66+
// table names as qualifiers without requiring explicit qualifiers
67+
return GuaranteedTableAliasCalculator.of(queryExpression.tableAliases());
68+
}
69+
}).orElseGet(() -> TableAliasCalculator.of(queryExpression.tableAliases()));
70+
}
71+
5572
public FragmentAndParameters render() {
5673
FragmentAndParameters answer = calculateQueryExpressionStart();
5774
answer = addJoinClause(answer);
@@ -81,7 +98,7 @@ private String calculateColumnList() {
8198
}
8299

83100
private String applyTableAndColumnAlias(BasicColumn selectListItem) {
84-
return selectListItem.renderWithTableAndColumnAlias(queryExpression.tableAliasCalculator());
101+
return selectListItem.renderWithTableAndColumnAlias(tableAliasCalculator);
85102
}
86103

87104
private FragmentAndParameters renderTableExpression(TableExpression table) {
@@ -97,8 +114,8 @@ private FragmentAndParameters addJoinClause(FragmentAndParameters partial) {
97114

98115
private FragmentAndParameters renderJoin(JoinModel joinModel) {
99116
return JoinRenderer.withJoinModel(joinModel)
100-
.withQueryExpression(queryExpression)
101117
.withTableExpressionRenderer(tableExpressionRenderer)
118+
.withTableAliasCalculator(tableAliasCalculator)
102119
.build()
103120
.render();
104121
}
@@ -113,7 +130,7 @@ private FragmentAndParameters addWhereClause(FragmentAndParameters partial) {
113130
private Optional<WhereClauseProvider> renderWhereClause(WhereModel whereModel) {
114131
return WhereRenderer.withWhereModel(whereModel)
115132
.withRenderingStrategy(renderingStrategy)
116-
.withTableAliasCalculator(queryExpression.tableAliasCalculator())
133+
.withTableAliasCalculator(tableAliasCalculator)
117134
.withSequence(sequence)
118135
.build()
119136
.render();
@@ -132,7 +149,7 @@ private String renderGroupBy(GroupByModel groupByModel) {
132149
}
133150

134151
private String applyTableAlias(BasicColumn column) {
135-
return column.renderWithTableAlias(queryExpression.tableAliasCalculator());
152+
return column.renderWithTableAlias(tableAliasCalculator);
136153
}
137154

138155
public static Builder withQueryExpression(QueryExpressionModel model) {

0 commit comments

Comments
 (0)