19
19
20
20
import java .util .ArrayList ;
21
21
import java .util .Collections ;
22
- import java .util .HashSet ;
23
22
import java .util .List ;
24
- import java .util .Set ;
25
23
26
24
import org .antlr .v4 .runtime .ParserRuleContext ;
27
25
import org .springframework .data .domain .Sort ;
34
32
* @author Greg Turnquist
35
33
* @since 3.1
36
34
*/
37
- class HqlQueryTransformer extends HqlQueryRenderer implements QueryTransformer {
35
+ class HqlQueryTransformer extends HqlQueryRenderer {
38
36
39
37
// TODO: Separate input from result parameters, encapsulation...
40
38
@@ -43,14 +41,14 @@ class HqlQueryTransformer extends HqlQueryRenderer implements QueryTransformer {
43
41
44
42
private final @ Nullable String countProjection ;
45
43
46
- private @ Nullable String primaryFromClauseAlias = null ;
44
+ private @ Nullable String primaryFromAlias = null ;
47
45
48
46
private List <JpaQueryParsingToken > projection = Collections .emptyList ();
49
47
private boolean projectionProcessed ;
50
48
51
49
private boolean hasConstructorExpression = false ;
52
50
53
- private Set < String > projectionAliases ;
51
+ private JpaQueryTransformerSupport transformerSupport ;
54
52
55
53
HqlQueryTransformer () {
56
54
this (Sort .unsorted (), false , null );
@@ -71,12 +69,12 @@ private HqlQueryTransformer(Sort sort, boolean countQuery, @Nullable String coun
71
69
this .sort = sort ;
72
70
this .countQuery = countQuery ;
73
71
this .countProjection = countProjection ;
74
- this .projectionAliases = new HashSet <> ();
72
+ this .transformerSupport = new JpaQueryTransformerSupport ();
75
73
}
76
74
77
75
@ Nullable
78
76
public String getAlias () {
79
- return this .primaryFromClauseAlias ;
77
+ return this .primaryFromAlias ;
80
78
}
81
79
82
80
public List <JpaQueryParsingToken > getProjection () {
@@ -87,11 +85,6 @@ public boolean hasConstructorExpression() {
87
85
return this .hasConstructorExpression ;
88
86
}
89
87
90
- @ Override
91
- public Set <String > getProjectionAliases () {
92
- return this .projectionAliases ;
93
- }
94
-
95
88
/**
96
89
* Is this select clause a {@literal subquery}?
97
90
*
@@ -140,30 +133,7 @@ public List<JpaQueryParsingToken> visitOrderedQuery(HqlParser.OrderedQueryContex
140
133
tokens .add (TOKEN_ORDER_BY );
141
134
}
142
135
143
- this .sort .forEach (order -> {
144
-
145
- JpaQueryParserSupport .checkSortExpression (order );
146
-
147
- if (order .isIgnoreCase ()) {
148
- tokens .add (TOKEN_LOWER_FUNC );
149
- }
150
-
151
- tokens .add (new JpaQueryParsingToken (() -> {
152
-
153
- if (shouldAlias (order )) {
154
- return primaryFromClauseAlias + "." + order .getProperty ();
155
- } else {
156
- return order .getProperty ();
157
- }
158
- }, true ));
159
- if (order .isIgnoreCase ()) {
160
- NOSPACE (tokens );
161
- tokens .add (TOKEN_CLOSE_PAREN );
162
- }
163
- tokens .add (order .isDescending () ? TOKEN_DESC : TOKEN_ASC );
164
- tokens .add (TOKEN_COMMA );
165
- });
166
- CLIP (tokens );
136
+ tokens .addAll (transformerSupport .generateOrderByArguments (primaryFromAlias , this .sort ));
167
137
}
168
138
} else {
169
139
@@ -187,7 +157,7 @@ public List<JpaQueryParsingToken> visitFromQuery(HqlParser.FromQueryContext ctx)
187
157
if (countProjection != null ) {
188
158
tokens .add (new JpaQueryParsingToken (countProjection ));
189
159
} else {
190
- tokens .add (new JpaQueryParsingToken (() -> this .primaryFromClauseAlias , false ));
160
+ tokens .add (new JpaQueryParsingToken (() -> this .primaryFromAlias , false ));
191
161
}
192
162
193
163
tokens .add (TOKEN_CLOSE_PAREN );
@@ -251,8 +221,8 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
251
221
if (ctx .variable () != null ) {
252
222
tokens .addAll (visit (ctx .variable ()));
253
223
254
- if (primaryFromClauseAlias == null && !isSubquery (ctx )) {
255
- primaryFromClauseAlias = tokens .get (tokens .size () - 1 ).getToken ();
224
+ if (primaryFromAlias == null && !isSubquery (ctx )) {
225
+ primaryFromAlias = tokens .get (tokens .size () - 1 ).getToken ();
256
226
}
257
227
}
258
228
} else if (ctx .subquery () != null ) {
@@ -267,8 +237,8 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
267
237
if (ctx .variable () != null ) {
268
238
tokens .addAll (visit (ctx .variable ()));
269
239
270
- if (primaryFromClauseAlias == null && !isSubquery (ctx )) {
271
- primaryFromClauseAlias = tokens .get (tokens .size () - 1 ).getToken ();
240
+ if (primaryFromAlias == null && !isSubquery (ctx )) {
241
+ primaryFromAlias = tokens .get (tokens .size () - 1 ).getToken ();
272
242
}
273
243
}
274
244
}
@@ -281,8 +251,8 @@ public List<JpaQueryParsingToken> visitAlias(HqlParser.AliasContext ctx) {
281
251
282
252
List <JpaQueryParsingToken > tokens = super .visitAlias (ctx );
283
253
284
- if (primaryFromClauseAlias == null && !isSubquery (ctx )) {
285
- primaryFromClauseAlias = tokens .get (tokens .size () - 1 ).getToken ();
254
+ if (primaryFromAlias == null && !isSubquery (ctx )) {
255
+ primaryFromAlias = tokens .get (tokens .size () - 1 ).getToken ();
286
256
}
287
257
288
258
return tokens ;
@@ -294,7 +264,7 @@ public List<JpaQueryParsingToken> visitVariable(HqlParser.VariableContext ctx) {
294
264
List <JpaQueryParsingToken > tokens = super .visitVariable (ctx );
295
265
296
266
if (ctx .identifier () != null ) {
297
- projectionAliases . add (tokens .get (tokens .size () - 1 ).getToken ());
267
+ transformerSupport . registerAlias (tokens .get (tokens .size () - 1 ).getToken ());
298
268
}
299
269
300
270
return tokens ;
@@ -329,13 +299,13 @@ public List<JpaQueryParsingToken> visitSelectClause(HqlParser.SelectClauseContex
329
299
330
300
if (selectionListTokens .stream ().anyMatch (hqlToken -> hqlToken .getToken ().contains ("new" ))) {
331
301
// constructor
332
- tokens .add (new JpaQueryParsingToken (() -> this .primaryFromClauseAlias ));
302
+ tokens .add (new JpaQueryParsingToken (() -> this .primaryFromAlias ));
333
303
} else {
334
304
// keep all the select items to distinct against
335
305
tokens .addAll (selectionListTokens );
336
306
}
337
307
} else {
338
- tokens .add (new JpaQueryParsingToken (() -> this .primaryFromClauseAlias ));
308
+ tokens .add (new JpaQueryParsingToken (() -> this .primaryFromAlias ));
339
309
}
340
310
}
341
311
0 commit comments