Skip to content

Commit 91c51e5

Browse files
move to dedicated method
1 parent 411d226 commit 91c51e5

File tree

2 files changed

+28
-13
lines changed

2 files changed

+28
-13
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryTransformer.java

+19-13
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.util.ArrayList;
2121
import java.util.Collections;
2222
import java.util.List;
23-
import java.util.stream.Collectors;
2423

2524
import org.antlr.v4.runtime.ParserRuleContext;
2625
import org.springframework.data.domain.Sort;
@@ -31,6 +30,7 @@
3130
* An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that transforms a parsed HQL query.
3231
*
3332
* @author Greg Turnquist
33+
* @author Christoph Strobl
3434
* @since 3.1
3535
*/
3636
class HqlQueryTransformer extends HqlQueryRenderer {
@@ -358,23 +358,14 @@ public List<JpaQueryParsingToken> visitSelectClause(HqlParser.SelectClauseContex
358358

359359
if (ctx.DISTINCT() != null) {
360360

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);
371362

372-
if (selectionListTokens.stream().anyMatch(hqlToken -> hqlToken.getToken().contains("new"))) {
363+
if (countSelection.stream().anyMatch(hqlToken -> hqlToken.getToken().contains("new"))) {
373364
// constructor
374365
tokens.add(new JpaQueryParsingToken(() -> primaryFromAlias));
375366
} else {
376367
// keep all the select items to distinct against
377-
tokens.addAll(selectionListTokens);
368+
tokens.addAll(countSelection);
378369
}
379370
} else {
380371
tokens.add(new JpaQueryParsingToken(() -> primaryFromAlias));
@@ -406,4 +397,19 @@ public List<JpaQueryParsingToken> visitInstantiation(HqlParser.InstantiationCont
406397
static <T> ArrayList<T> newArrayList() {
407398
return new ArrayList<>();
408399
}
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+
}
409415
}

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryParsingToken.java

+9
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,15 @@ boolean getSpace() {
131131
return this.space;
132132
}
133133

134+
boolean isA(JpaQueryParsingToken token) {
135+
return token.getToken().equalsIgnoreCase(this.getToken());
136+
}
137+
138+
@Override
139+
public String toString() {
140+
return getToken();
141+
}
142+
134143
/**
135144
* Switch the last {@link JpaQueryParsingToken}'s spacing to {@literal true}.
136145
*/

0 commit comments

Comments
 (0)