Skip to content

Commit

Permalink
Add support for collection.any() paths #582
Browse files Browse the repository at this point in the history
  • Loading branch information
timowest committed Dec 11, 2013
1 parent 376e0eb commit fa6c23d
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
21 changes: 17 additions & 4 deletions querydsl-jpa/src/main/java/com/mysema/query/jpa/JPAQueryMixin.java
Expand Up @@ -23,6 +23,7 @@
import com.mysema.query.support.Context;
import com.mysema.query.support.ListAccessVisitor;
import com.mysema.query.support.QueryMixin;
import com.mysema.query.types.CollectionExpression;
import com.mysema.query.types.ConstantImpl;
import com.mysema.query.types.EntityPath;
import com.mysema.query.types.Expression;
Expand Down Expand Up @@ -77,21 +78,33 @@ protected <D> Expression<D> createAlias(Expression<?> expr, Path<?> alias) {
return super.createAlias(expr, alias);
}

private <T> Class<T> getElementTypeOrType(Path<T> path) {
if (path instanceof CollectionExpression) {
return ((CollectionExpression)path).getParameter(0);
} else {
return (Class<T>) path.getType();
}
}

private <T> Path<T> shorten(Path<T> path) {
PathMetadata<?> metadata = path.getMetadata();
if (metadata.getPathType() != PathType.PROPERTY) {
if (metadata.isRoot()) {
return path;
} else if (aliases.containsKey(path)) {
return (Path<T>) aliases.get(path);
} else if (metadata.getPathType() == PathType.COLLECTION_ANY) {
return (Path<T>) shorten(metadata.getParent());
} else if (metadata.getParent().getMetadata().isRoot()) {
Path<T> newPath = new PathImpl<T>(path.getType(), path.toString().replace('.', '_'));
Class<T> type = getElementTypeOrType(path);
Path<T> newPath = new PathImpl<T>(type, path.toString().replace('.', '_'));
leftJoin(path, newPath);
return newPath;
} else {
Class<T> type = getElementTypeOrType(path);
Path<?> parent = shorten(metadata.getParent());
Path<T> oldPath = new PathImpl<T>(path.getType(),
new PathMetadata(parent, metadata.getElement(), metadata.getPathType()));
Path<T> newPath = new PathImpl<T>(path.getType(), oldPath.toString().replace('.', '_'));
Path<T> newPath = new PathImpl<T>(type, oldPath.toString().replace('.', '_'));
leftJoin(oldPath, newPath);
return newPath;
}
Expand All @@ -105,7 +118,7 @@ public <RT> Expression<RT> convert(Expression<RT> expr, boolean forOrder) {
// at least three levels
if (metadata.getParent() != null && !metadata.getParent().getMetadata().isRoot()) {
Path<?> shortened = shorten(metadata.getParent());
expr = new PathImpl<RT>((Class)shortened.getType(),
expr = new PathImpl<RT>(expr.getType(),
new PathMetadata(shortened, metadata.getElement(), metadata.getPathType()));
}
}
Expand Down
Expand Up @@ -93,5 +93,19 @@ public void OrderBy_Long_Reuse() {
md.getOrderBy());
}

// TODO test path.any() behaviour
@Test
public void OrderBy_Any() {
QCat cat = QCat.cat;
QCat cat_kittens = new QCat("cat_kittens");
mixin.from(cat);
mixin.orderBy(cat.kittens.any().name.asc());

QueryMetadata md = mixin.getMetadata();
assertEquals(Arrays.asList(
new JoinExpression(JoinType.DEFAULT, cat),
new JoinExpression(JoinType.LEFTJOIN, cat.kittens.as(cat_kittens))),
md.getJoins());
assertEquals(Arrays.asList(cat_kittens.name.asc()),
md.getOrderBy());
}
}

0 comments on commit fa6c23d

Please sign in to comment.