|
20 | 20 | import java.util.ArrayList;
|
21 | 21 | import java.util.Collections;
|
22 | 22 | import java.util.List;
|
23 |
| -import java.util.stream.Collectors; |
24 | 23 |
|
25 | 24 | import org.antlr.v4.runtime.ParserRuleContext;
|
26 | 25 | import org.springframework.data.domain.Sort;
|
|
31 | 30 | * An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that transforms a parsed HQL query.
|
32 | 31 | *
|
33 | 32 | * @author Greg Turnquist
|
| 33 | + * @author Christoph Strobl |
34 | 34 | * @since 3.1
|
35 | 35 | */
|
36 | 36 | class HqlQueryTransformer extends HqlQueryRenderer {
|
@@ -358,23 +358,14 @@ public List<JpaQueryParsingToken> visitSelectClause(HqlParser.SelectClauseContex
|
358 | 358 |
|
359 | 359 | if (ctx.DISTINCT() != null) {
|
360 | 360 |
|
361 |
| - List<JpaQueryParsingToken> target = new ArrayList<>(selectionListTokens.size()); |
362 |
| - for(int i=0;i<selectionListTokens.size();i++) { |
363 |
| - JpaQueryParsingToken token = selectionListTokens.get(i); |
364 |
| - if(token.getToken().equalsIgnoreCase("as")) { |
365 |
| - i++; |
366 |
| - continue; |
367 |
| - } |
368 |
| - target.add(token); |
369 |
| - } |
370 |
| - selectionListTokens = target; |
| 361 | + List<JpaQueryParsingToken> countSelection = getCountSelection(selectionListTokens); |
371 | 362 |
|
372 |
| - if (selectionListTokens.stream().anyMatch(hqlToken -> hqlToken.getToken().contains("new"))) { |
| 363 | + if (countSelection.stream().anyMatch(hqlToken -> hqlToken.getToken().contains("new"))) { |
373 | 364 | // constructor
|
374 | 365 | tokens.add(new JpaQueryParsingToken(() -> primaryFromAlias));
|
375 | 366 | } else {
|
376 | 367 | // keep all the select items to distinct against
|
377 |
| - tokens.addAll(selectionListTokens); |
| 368 | + tokens.addAll(countSelection); |
378 | 369 | }
|
379 | 370 | } else {
|
380 | 371 | tokens.add(new JpaQueryParsingToken(() -> primaryFromAlias));
|
@@ -406,4 +397,19 @@ public List<JpaQueryParsingToken> visitInstantiation(HqlParser.InstantiationCont
|
406 | 397 | static <T> ArrayList<T> newArrayList() {
|
407 | 398 | return new ArrayList<>();
|
408 | 399 | }
|
| 400 | + |
| 401 | + private static List<JpaQueryParsingToken> getCountSelection(List<JpaQueryParsingToken> selectionListTokens) { |
| 402 | + |
| 403 | + List<JpaQueryParsingToken> target = new ArrayList<>(selectionListTokens.size()); |
| 404 | + for (int i = 0; i < selectionListTokens.size(); i++) { |
| 405 | + JpaQueryParsingToken token = selectionListTokens.get(i); |
| 406 | + if (token.isA(TOKEN_AS)) { |
| 407 | + i++; |
| 408 | + continue; |
| 409 | + } |
| 410 | + target.add(token); |
| 411 | + } |
| 412 | + selectionListTokens = target; |
| 413 | + return selectionListTokens; |
| 414 | + } |
409 | 415 | }
|
0 commit comments