@@ -41,13 +41,15 @@ class HqlQueryTransformer extends HqlQueryRenderer {
41
41
42
42
private final @ Nullable String countProjection ;
43
43
44
- private @ Nullable String alias = null ;
44
+ private @ Nullable String primaryFromAlias = null ;
45
45
46
46
private List <JpaQueryParsingToken > projection = Collections .emptyList ();
47
47
private boolean projectionProcessed ;
48
48
49
49
private boolean hasConstructorExpression = false ;
50
50
51
+ private JpaQueryTransformerSupport transformerSupport ;
52
+
51
53
HqlQueryTransformer () {
52
54
this (Sort .unsorted (), false , null );
53
55
}
@@ -67,11 +69,12 @@ private HqlQueryTransformer(Sort sort, boolean countQuery, @Nullable String coun
67
69
this .sort = sort ;
68
70
this .countQuery = countQuery ;
69
71
this .countProjection = countProjection ;
72
+ this .transformerSupport = new JpaQueryTransformerSupport ();
70
73
}
71
74
72
75
@ Nullable
73
76
public String getAlias () {
74
- return this .alias ;
77
+ return this .primaryFromAlias ;
75
78
}
76
79
77
80
public List <JpaQueryParsingToken > getProjection () {
@@ -118,7 +121,7 @@ public List<JpaQueryParsingToken> visitOrderedQuery(HqlParser.OrderedQueryContex
118
121
tokens .addAll (visit (ctx .queryOrder ()));
119
122
}
120
123
121
- if (this . sort .isSorted ()) {
124
+ if (sort .isSorted ()) {
122
125
123
126
if (ctx .queryOrder () != null ) {
124
127
@@ -130,29 +133,7 @@ public List<JpaQueryParsingToken> visitOrderedQuery(HqlParser.OrderedQueryContex
130
133
tokens .add (TOKEN_ORDER_BY );
131
134
}
132
135
133
- this .sort .forEach (order -> {
134
-
135
- JpaQueryParserSupport .checkSortExpression (order );
136
-
137
- if (order .isIgnoreCase ()) {
138
- tokens .add (TOKEN_LOWER_FUNC );
139
- }
140
- tokens .add (new JpaQueryParsingToken (() -> {
141
-
142
- if (order .getProperty ().contains ("(" )) {
143
- return order .getProperty ();
144
- }
145
-
146
- return this .alias + "." + order .getProperty ();
147
- }, true ));
148
- if (order .isIgnoreCase ()) {
149
- NOSPACE (tokens );
150
- tokens .add (TOKEN_CLOSE_PAREN );
151
- }
152
- tokens .add (order .isDescending () ? TOKEN_DESC : TOKEN_ASC );
153
- tokens .add (TOKEN_COMMA );
154
- });
155
- CLIP (tokens );
136
+ tokens .addAll (transformerSupport .generateOrderByArguments (primaryFromAlias , sort ));
156
137
}
157
138
} else {
158
139
@@ -176,7 +157,7 @@ public List<JpaQueryParsingToken> visitFromQuery(HqlParser.FromQueryContext ctx)
176
157
if (countProjection != null ) {
177
158
tokens .add (new JpaQueryParsingToken (countProjection ));
178
159
} else {
179
- tokens .add (new JpaQueryParsingToken (() -> this . alias , false ));
160
+ tokens .add (new JpaQueryParsingToken (() -> primaryFromAlias , false ));
180
161
}
181
162
182
163
tokens .add (TOKEN_CLOSE_PAREN );
@@ -240,8 +221,8 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
240
221
if (ctx .variable () != null ) {
241
222
tokens .addAll (visit (ctx .variable ()));
242
223
243
- if (this . alias == null && !isSubquery (ctx )) {
244
- this . alias = tokens .get (tokens .size () - 1 ).getToken ();
224
+ if (primaryFromAlias == null && !isSubquery (ctx )) {
225
+ primaryFromAlias = tokens .get (tokens .size () - 1 ).getToken ();
245
226
}
246
227
} else {
247
228
@@ -250,8 +231,8 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
250
231
tokens .add (TOKEN_AS );
251
232
tokens .add (TOKEN_DOUBLE_UNDERSCORE );
252
233
253
- if (this . alias == null && !isSubquery (ctx )) {
254
- this . alias = TOKEN_DOUBLE_UNDERSCORE .getToken ();
234
+ if (primaryFromAlias == null && !isSubquery (ctx )) {
235
+ primaryFromAlias = TOKEN_DOUBLE_UNDERSCORE .getToken ();
255
236
}
256
237
}
257
238
}
@@ -267,8 +248,8 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
267
248
if (ctx .variable () != null ) {
268
249
tokens .addAll (visit (ctx .variable ()));
269
250
270
- if (this . alias == null && !isSubquery (ctx )) {
271
- this . alias = tokens .get (tokens .size () - 1 ).getToken ();
251
+ if (primaryFromAlias == null && !isSubquery (ctx )) {
252
+ primaryFromAlias = tokens .get (tokens .size () - 1 ).getToken ();
272
253
}
273
254
}
274
255
}
@@ -302,16 +283,22 @@ public List<JpaQueryParsingToken> visitJoin(HqlParser.JoinContext ctx) {
302
283
@ Override
303
284
public List <JpaQueryParsingToken > visitAlias (HqlParser .AliasContext ctx ) {
304
285
305
- List <JpaQueryParsingToken > tokens = newArrayList ( );
286
+ List <JpaQueryParsingToken > tokens = super . visitAlias ( ctx );
306
287
307
- if (ctx . AS () != null ) {
308
- tokens .add ( new JpaQueryParsingToken ( ctx . AS ()) );
288
+ if (primaryFromAlias == null && ! isSubquery ( ctx ) ) {
289
+ primaryFromAlias = tokens .get ( tokens . size () - 1 ). getToken ( );
309
290
}
310
291
311
- tokens .addAll (visit (ctx .identifier ()));
292
+ return tokens ;
293
+ }
294
+
295
+ @ Override
296
+ public List <JpaQueryParsingToken > visitVariable (HqlParser .VariableContext ctx ) {
297
+
298
+ List <JpaQueryParsingToken > tokens = super .visitVariable (ctx );
312
299
313
- if (this . alias == null && ! isSubquery ( ctx ) ) {
314
- this . alias = tokens .get (tokens .size () - 1 ).getToken ();
300
+ if (ctx . identifier () != null ) {
301
+ transformerSupport . registerAlias ( tokens .get (tokens .size () - 1 ).getToken () );
315
302
}
316
303
317
304
return tokens ;
@@ -346,13 +333,13 @@ public List<JpaQueryParsingToken> visitSelectClause(HqlParser.SelectClauseContex
346
333
347
334
if (selectionListTokens .stream ().anyMatch (hqlToken -> hqlToken .getToken ().contains ("new" ))) {
348
335
// constructor
349
- tokens .add (new JpaQueryParsingToken (() -> this . alias ));
336
+ tokens .add (new JpaQueryParsingToken (() -> primaryFromAlias ));
350
337
} else {
351
338
// keep all the select items to distinct against
352
339
tokens .addAll (selectionListTokens );
353
340
}
354
341
} else {
355
- tokens .add (new JpaQueryParsingToken (() -> this . alias ));
342
+ tokens .add (new JpaQueryParsingToken (() -> primaryFromAlias ));
356
343
}
357
344
}
358
345
@@ -363,8 +350,8 @@ public List<JpaQueryParsingToken> visitSelectClause(HqlParser.SelectClauseContex
363
350
}
364
351
365
352
if (!projectionProcessed && !isSubquery (ctx )) {
366
- this . projection = selectionListTokens ;
367
- this . projectionProcessed = true ;
353
+ projection = selectionListTokens ;
354
+ projectionProcessed = true ;
368
355
}
369
356
370
357
return tokens ;
@@ -373,7 +360,7 @@ public List<JpaQueryParsingToken> visitSelectClause(HqlParser.SelectClauseContex
373
360
@ Override
374
361
public List <JpaQueryParsingToken > visitInstantiation (HqlParser .InstantiationContext ctx ) {
375
362
376
- this . hasConstructorExpression = true ;
363
+ hasConstructorExpression = true ;
377
364
378
365
return super .visitInstantiation (ctx );
379
366
}
0 commit comments