Polishing.

See #2555.
This commit is contained in:
Greg L. Turnquist
2022-06-03 14:44:32 -05:00
parent a344a76959
commit cc1eb9ce2b
3 changed files with 20 additions and 13 deletions

View File

@@ -63,16 +63,18 @@ public class JSqlParserQueryEnhancer implements QueryEnhancer {
* @param query the query we want to enhance. Must not be {@literal null}.
*/
public JSqlParserQueryEnhancer(DeclaredQuery query) {
this.query = query;
this.parsedType = detectParsedType();
}
/**
* Detects what type of query is provided.
*
*
* @return the parsed type
*/
private ParsedType detectParsedType() {
try {
Statement statement = CCJSqlParserUtil.parse(this.query.getQueryString());
@@ -85,7 +87,6 @@ public class JSqlParserQueryEnhancer implements QueryEnhancer {
} else {
return ParsedType.SELECT;
}
} catch (JSQLParserException e) {
throw new IllegalArgumentException("The query you provided is not a valid SQL Query!", e);
}
@@ -93,6 +94,7 @@ public class JSqlParserQueryEnhancer implements QueryEnhancer {
@Override
public String applySorting(Sort sort, @Nullable String alias) {
String queryString = query.getQueryString();
Assert.hasText(queryString, "Query must not be null or empty!");
@@ -168,9 +170,11 @@ public class JSqlParserQueryEnhancer implements QueryEnhancer {
* @return a {@literal Set} of aliases used in the query. Guaranteed to be not {@literal null}.
*/
private Set<String> getJoinAliases(String query) {
if (this.parsedType != ParsedType.SELECT) {
return new HashSet<>();
}
return getJoinAliases((PlainSelect) parseSelectStatement(query).getSelectBody());
}
@@ -377,16 +381,17 @@ public class JSqlParserQueryEnhancer implements QueryEnhancer {
public DeclaredQuery getQuery() {
return this.query;
}
}
/**
* An enum to represent the top level parsed statement of the provided query.
* <ul>
* <li>{@code ParsedType.DELETE}: means the top level statement is {@link Delete}</li>
* <li>{@code ParsedType.UPDATE}: means the top level statement is {@link Update}</li>
* <li>{@code ParsedType.SELECT}: means the top level statement is {@link Select}</li>
* </ul>
*/
enum ParsedType {
DELETE, UPDATE, SELECT;
/**
* An enum to represent the top level parsed statement of the provided query.
* <ul>
* <li>{@code ParsedType.DELETE}: means the top level statement is {@link Delete}</li>
* <li>{@code ParsedType.UPDATE}: means the top level statement is {@link Update}</li>
* <li>{@code ParsedType.SELECT}: means the top level statement is {@link Select}</li>
* </ul>
*/
enum ParsedType {
DELETE, UPDATE, SELECT;
}
}

View File

@@ -2867,6 +2867,7 @@ public class UserRepositoryTests {
@Test // GH-2555
void modifyingUpdateNativeQueryWorksWithJSQLParser() {
flushTestUsers();
Optional<User> byIdUser = repository.findById(firstUser.getId());

View File

@@ -733,6 +733,7 @@ class QueryEnhancerUnitTests {
@Test // GH-2555
void modifyingQueriesAreDetectedCorrectly() {
String modifyingQuery = "update userinfo user set user.is_in_treatment = false where user.id = :userId";
String aliasNotConsideringQueryType = QueryUtils.detectAlias(modifyingQuery);