From ed2676721e91706374e6fe46f635bfc9f6cbf85e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 8 Aug 2014 20:06:12 +0300 Subject: [PATCH] Fix any path handling --- .../com/mysema/query/support/QueryMixin.java | 39 ++++++++++++++----- .../com/mysema/query/AbstractJPATest.java | 5 +++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/support/QueryMixin.java b/querydsl-core/src/main/java/com/mysema/query/support/QueryMixin.java index b53ad8597..779a1af03 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/QueryMixin.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/QueryMixin.java @@ -13,6 +13,8 @@ */ package com.mysema.query.support; +import javax.annotation.Nullable; + import com.mysema.query.DefaultQueryMetadata; import com.mysema.query.JoinFlag; import com.mysema.query.JoinType; @@ -48,6 +50,8 @@ public class QueryMixin { private final boolean expandAnyPaths; + private ReplaceVisitor replaceVisitor; + private T self; public QueryMixin() { @@ -121,18 +125,35 @@ public class QueryMixin { return p; } + private Path normalizePath(Path expr) { + Context context = new Context(); + Path replaced = (Path)expr.accept(CollectionAnyVisitor.DEFAULT, context); + if (!replaced.equals(expr)) { + for (int i = 0; i < context.paths.size(); i++) { + Path path = context.paths.get(i).getMetadata().getParent(); + Path replacement = context.replacements.get(i); + this.innerJoin(path, replacement); + } + return replaced; + } else { + return expr; + } + } + @SuppressWarnings("rawtypes") public Expression convert(Expression expr, boolean forOrder) { - if (expandAnyPaths && expr instanceof Path) { - Context context = new Context(); - Expression replaced = expr.accept(CollectionAnyVisitor.DEFAULT, context); - if (!replaced.equals(expr)) { - for (int i = 0; i < context.paths.size(); i++) { - Path path = context.paths.get(i).getMetadata().getParent(); - Path replacement = context.replacements.get(i); - this.innerJoin(path, replacement); + if (expandAnyPaths) { + if (expr instanceof Path) { + expr = (Expression)normalizePath((Path)expr); + } else if (expr != null) { + if (replaceVisitor == null) { + replaceVisitor = new ReplaceVisitor() { + public Expression visit(Path expr, @Nullable Void context) { + return normalizePath(expr); + } + }; } - return replaced; + expr = (Expression)expr.accept(replaceVisitor, null); } } if (expr instanceof ProjectionRole) { diff --git a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java index d14bf1b3f..dc968a4dd 100644 --- a/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java +++ b/querydsl-jpa/src/test/java/com/mysema/query/AbstractJPATest.java @@ -240,6 +240,11 @@ public abstract class AbstractJPATest { assertFalse(query().from(cat).list(cat.kittens.any().name).isEmpty()); } + @Test + public void Any_In_Projection3() { + assertFalse(query().from(cat).list(cat.kittens.any().name, cat.kittens.any().bodyWeight).isEmpty()); + } + @Test public void Any_In1() { //select cat from Cat cat where exists (