DATAJPA-1363 - QueryUtils now detects aliases for functions using complex expressions.

This commit is contained in:
Oliver Gierke
2018-06-19 00:42:08 +02:00
parent fcfbd789e5
commit e752422c09
2 changed files with 15 additions and 5 deletions

View File

@@ -169,9 +169,10 @@ public abstract class QueryUtils {
CONSTRUCTOR_EXPRESSION = compile(builder.toString(), CASE_INSENSITIVE + DOTALL);
builder = new StringBuilder();
builder.append("\\s+"); // at least one space
builder.append("\\w+\\([0-9a-zA-z\\._,\\s']+\\)"); // any function call including parameters within the brackets
builder.append("\\s+[as|AS]+\\s+(([\\w\\.]+))"); // the potential alias
// any function call including parameters within the brackets
builder.append("\\w+\\s*\\([\\w\\.,\\s'=]+\\)");
// the potential alias
builder.append("\\s+[as|AS]+\\s+(([\\w\\.]+))");
FUNCTION_PATTERN = compile(builder.toString());
}
@@ -325,7 +326,7 @@ public abstract class QueryUtils {
* @param query a {@literal String} containing a query. Must not be {@literal null}.
* @return a {@literal Set} containing all found aliases. Guaranteed to be not {@literal null}.
*/
private static Set<String> getFunctionAliases(String query) {
static Set<String> getFunctionAliases(String query) {
Set<String> result = new HashSet<>();
Matcher matcher = FUNCTION_PATTERN.matcher(query);
@@ -588,7 +589,8 @@ public abstract class QueryUtils {
propertyPathModel = from.get(segment).getModel();
}
if (requiresJoin(propertyPathModel, model instanceof PluralAttribute, !property.hasNext()) && !isAlreadyFetched(from, segment)) {
if (requiresJoin(propertyPathModel, model instanceof PluralAttribute, !property.hasNext())
&& !isAlreadyFetched(from, segment)) {
Join<?, ?> join = getOrCreateJoin(from, segment);
return (Expression<T>) (property.hasNext() ? toExpressionRecursively(join, property.next()) : join);
} else {

View File

@@ -395,6 +395,14 @@ public class QueryUtilsUnitTests {
.endsWith("WHERE x.id = :id");
}
@Test // DATAJPA-1363
public void discoversAliasWithComplexFunction() {
assertThat(
QueryUtils.getFunctionAliases("select new MyDto(sum(case when myEntity.prop3=0 then 1 else 0 end) as myAlias")) //
.contains("myAlias");
}
private static void assertCountQuery(String originalQuery, String countQuery) {
assertThat(createCountQueryFor(originalQuery), is(countQuery));
}