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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy