1
1
/*
2
- * Copyright 2016-2020 the original author or authors.
2
+ * Copyright 2016-2022 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
25
25
26
26
import org .mybatis .dynamic .sql .BasicColumn ;
27
27
import org .mybatis .dynamic .sql .TableExpression ;
28
+ import org .mybatis .dynamic .sql .render .GuaranteedTableAliasCalculator ;
28
29
import org .mybatis .dynamic .sql .render .RenderingStrategy ;
30
+ import org .mybatis .dynamic .sql .render .TableAliasCalculator ;
29
31
import org .mybatis .dynamic .sql .select .GroupByModel ;
30
32
import org .mybatis .dynamic .sql .select .QueryExpressionModel ;
31
33
import org .mybatis .dynamic .sql .select .join .JoinModel ;
@@ -40,18 +42,33 @@ public class QueryExpressionRenderer {
40
42
private final RenderingStrategy renderingStrategy ;
41
43
private final AtomicInteger sequence ;
42
44
private final TableExpressionRenderer tableExpressionRenderer ;
45
+ private final TableAliasCalculator tableAliasCalculator ;
43
46
44
47
private QueryExpressionRenderer (Builder builder ) {
45
48
queryExpression = Objects .requireNonNull (builder .queryExpression );
46
49
renderingStrategy = Objects .requireNonNull (builder .renderingStrategy );
47
50
sequence = Objects .requireNonNull (builder .sequence );
51
+ tableAliasCalculator = determineJoinTableAliasCalculator (queryExpression );
48
52
tableExpressionRenderer = new TableExpressionRenderer .Builder ()
49
- .withTableAliasCalculator (queryExpression . tableAliasCalculator () )
53
+ .withTableAliasCalculator (tableAliasCalculator )
50
54
.withRenderingStrategy (renderingStrategy )
51
55
.withSequence (sequence )
52
56
.build ();
53
57
}
54
58
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
+
55
72
public FragmentAndParameters render () {
56
73
FragmentAndParameters answer = calculateQueryExpressionStart ();
57
74
answer = addJoinClause (answer );
@@ -81,7 +98,7 @@ private String calculateColumnList() {
81
98
}
82
99
83
100
private String applyTableAndColumnAlias (BasicColumn selectListItem ) {
84
- return selectListItem .renderWithTableAndColumnAlias (queryExpression . tableAliasCalculator () );
101
+ return selectListItem .renderWithTableAndColumnAlias (tableAliasCalculator );
85
102
}
86
103
87
104
private FragmentAndParameters renderTableExpression (TableExpression table ) {
@@ -97,8 +114,8 @@ private FragmentAndParameters addJoinClause(FragmentAndParameters partial) {
97
114
98
115
private FragmentAndParameters renderJoin (JoinModel joinModel ) {
99
116
return JoinRenderer .withJoinModel (joinModel )
100
- .withQueryExpression (queryExpression )
101
117
.withTableExpressionRenderer (tableExpressionRenderer )
118
+ .withTableAliasCalculator (tableAliasCalculator )
102
119
.build ()
103
120
.render ();
104
121
}
@@ -113,7 +130,7 @@ private FragmentAndParameters addWhereClause(FragmentAndParameters partial) {
113
130
private Optional <WhereClauseProvider > renderWhereClause (WhereModel whereModel ) {
114
131
return WhereRenderer .withWhereModel (whereModel )
115
132
.withRenderingStrategy (renderingStrategy )
116
- .withTableAliasCalculator (queryExpression . tableAliasCalculator () )
133
+ .withTableAliasCalculator (tableAliasCalculator )
117
134
.withSequence (sequence )
118
135
.build ()
119
136
.render ();
@@ -132,7 +149,7 @@ private String renderGroupBy(GroupByModel groupByModel) {
132
149
}
133
150
134
151
private String applyTableAlias (BasicColumn column ) {
135
- return column .renderWithTableAlias (queryExpression . tableAliasCalculator () );
152
+ return column .renderWithTableAlias (tableAliasCalculator );
136
153
}
137
154
138
155
public static Builder withQueryExpression (QueryExpressionModel model ) {
0 commit comments