18
18
import static org .springframework .data .jpa .repository .query .JpaQueryParsingToken .*;
19
19
20
20
import java .util .ArrayList ;
21
+ import java .util .Collections ;
21
22
import java .util .List ;
22
23
23
24
import org .antlr .v4 .runtime .ParserRuleContext ;
24
25
import org .springframework .data .domain .Sort ;
25
26
import org .springframework .lang .Nullable ;
27
+ import org .springframework .util .Assert ;
26
28
27
29
/**
28
30
* An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that transforms a parsed HQL query.
32
34
*/
33
35
class HqlQueryTransformer extends HqlQueryRenderer {
34
36
35
- @ Nullable private Sort sort ;
36
- private boolean countQuery ;
37
+ // TODO: Separate input from result parameters, encapsulation...
37
38
38
- @ Nullable private String countProjection ;
39
+ private final Sort sort ;
40
+ private final boolean countQuery ;
39
41
40
- @ Nullable private String alias = null ;
42
+ private final @ Nullable String countProjection ;
41
43
42
- private List <JpaQueryParsingToken > projection = null ;
44
+ private @ Nullable String alias = null ;
45
+
46
+ private List <JpaQueryParsingToken > projection = Collections .emptyList ();
47
+ private boolean projectionProcessed ;
43
48
44
49
private boolean hasConstructorExpression = false ;
45
50
46
51
HqlQueryTransformer () {
47
- this (null , false , null );
52
+ this (Sort . unsorted () , false , null );
48
53
}
49
54
50
- HqlQueryTransformer (@ Nullable Sort sort ) {
55
+ HqlQueryTransformer (Sort sort ) {
51
56
this (sort , false , null );
52
57
}
53
58
54
59
HqlQueryTransformer (boolean countQuery , @ Nullable String countProjection ) {
55
- this (null , countQuery , countProjection );
60
+ this (Sort . unsorted () , countQuery , countProjection );
56
61
}
57
62
58
- private HqlQueryTransformer (@ Nullable Sort sort , boolean countQuery , @ Nullable String countProjection ) {
63
+ private HqlQueryTransformer (Sort sort , boolean countQuery , @ Nullable String countProjection ) {
64
+
65
+ Assert .notNull (sort , "Sort must not be null" );
59
66
60
67
this .sort = sort ;
61
68
this .countQuery = countQuery ;
@@ -94,7 +101,7 @@ private static boolean isSubquery(ParserRuleContext ctx) {
94
101
@ Override
95
102
public List <JpaQueryParsingToken > visitOrderedQuery (HqlParser .OrderedQueryContext ctx ) {
96
103
97
- List <JpaQueryParsingToken > tokens = new ArrayList <> ();
104
+ List <JpaQueryParsingToken > tokens = newArrayList ();
98
105
99
106
if (ctx .query () != null ) {
100
107
tokens .addAll (visit (ctx .query ()));
@@ -111,7 +118,7 @@ public List<JpaQueryParsingToken> visitOrderedQuery(HqlParser.OrderedQueryContex
111
118
tokens .addAll (visit (ctx .queryOrder ()));
112
119
}
113
120
114
- if (this .sort != null && this . sort .isSorted ()) {
121
+ if (this .sort .isSorted ()) {
115
122
116
123
if (ctx .queryOrder () != null ) {
117
124
@@ -125,7 +132,7 @@ public List<JpaQueryParsingToken> visitOrderedQuery(HqlParser.OrderedQueryContex
125
132
126
133
this .sort .forEach (order -> {
127
134
128
- JpaQueryParser .checkSortExpression (order );
135
+ JpaQueryParserSupport .checkSortExpression (order );
129
136
130
137
if (order .isIgnoreCase ()) {
131
138
tokens .add (TOKEN_LOWER_FUNC );
@@ -160,7 +167,7 @@ public List<JpaQueryParsingToken> visitOrderedQuery(HqlParser.OrderedQueryContex
160
167
@ Override
161
168
public List <JpaQueryParsingToken > visitFromQuery (HqlParser .FromQueryContext ctx ) {
162
169
163
- List <JpaQueryParsingToken > tokens = new ArrayList <> ();
170
+ List <JpaQueryParsingToken > tokens = newArrayList ();
164
171
165
172
if (countQuery && !isSubquery (ctx ) && ctx .selectClause () == null ) {
166
173
@@ -201,7 +208,7 @@ public List<JpaQueryParsingToken> visitFromQuery(HqlParser.FromQueryContext ctx)
201
208
@ Override
202
209
public List <JpaQueryParsingToken > visitQueryOrder (HqlParser .QueryOrderContext ctx ) {
203
210
204
- List <JpaQueryParsingToken > tokens = new ArrayList <> ();
211
+ List <JpaQueryParsingToken > tokens = newArrayList ();
205
212
206
213
if (!countQuery ) {
207
214
tokens .addAll (visit (ctx .orderByClause ()));
@@ -224,7 +231,7 @@ public List<JpaQueryParsingToken> visitQueryOrder(HqlParser.QueryOrderContext ct
224
231
@ Override
225
232
public List <JpaQueryParsingToken > visitFromRoot (HqlParser .FromRootContext ctx ) {
226
233
227
- List <JpaQueryParsingToken > tokens = new ArrayList <> ();
234
+ List <JpaQueryParsingToken > tokens = newArrayList ();
228
235
229
236
if (ctx .entityName () != null ) {
230
237
@@ -261,7 +268,7 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
261
268
@ Override
262
269
public List <JpaQueryParsingToken > visitAlias (HqlParser .AliasContext ctx ) {
263
270
264
- List <JpaQueryParsingToken > tokens = new ArrayList <> ();
271
+ List <JpaQueryParsingToken > tokens = newArrayList ();
265
272
266
273
if (ctx .AS () != null ) {
267
274
tokens .add (new JpaQueryParsingToken (ctx .AS ()));
@@ -279,7 +286,7 @@ public List<JpaQueryParsingToken> visitAlias(HqlParser.AliasContext ctx) {
279
286
@ Override
280
287
public List <JpaQueryParsingToken > visitSelectClause (HqlParser .SelectClauseContext ctx ) {
281
288
282
- List <JpaQueryParsingToken > tokens = new ArrayList <> ();
289
+ List <JpaQueryParsingToken > tokens = newArrayList ();
283
290
284
291
tokens .add (new JpaQueryParsingToken (ctx .SELECT ()));
285
292
@@ -321,8 +328,9 @@ public List<JpaQueryParsingToken> visitSelectClause(HqlParser.SelectClauseContex
321
328
tokens .addAll (selectionListTokens );
322
329
}
323
330
324
- if (projection == null && !isSubquery (ctx )) {
331
+ if (! projectionProcessed && !isSubquery (ctx )) {
325
332
this .projection = selectionListTokens ;
333
+ this .projectionProcessed = true ;
326
334
}
327
335
328
336
return tokens ;
@@ -335,4 +343,8 @@ public List<JpaQueryParsingToken> visitInstantiation(HqlParser.InstantiationCont
335
343
336
344
return super .visitInstantiation (ctx );
337
345
}
346
+
347
+ static <T > ArrayList <T > newArrayList () {
348
+ return new ArrayList <>();
349
+ }
338
350
}
0 commit comments