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.
2525
2626import org .mybatis .dynamic .sql .BasicColumn ;
2727import org .mybatis .dynamic .sql .TableExpression ;
28+ import org .mybatis .dynamic .sql .render .GuaranteedTableAliasCalculator ;
2829import org .mybatis .dynamic .sql .render .RenderingStrategy ;
30+ import org .mybatis .dynamic .sql .render .TableAliasCalculator ;
2931import org .mybatis .dynamic .sql .select .GroupByModel ;
3032import org .mybatis .dynamic .sql .select .QueryExpressionModel ;
3133import 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