Improve delegate path handling

This commit is contained in:
Timo Westkämper 2015-09-23 21:39:59 +03:00
parent 5789cae7d9
commit 36e05ab00a
2 changed files with 18 additions and 5 deletions

View File

@ -330,13 +330,16 @@ public abstract class MongodbSerializer implements Visitor<Object, Void> {
public String visit(Path<?> expr, Void context) {
PathMetadata metadata = expr.getMetadata();
if (metadata.getParent() != null) {
Path<?> parent = metadata.getParent();
if (parent.getMetadata().getPathType() == PathType.DELEGATE) {
parent = parent.getMetadata().getParent();
}
if (metadata.getPathType() == PathType.COLLECTION_ANY) {
return visit(metadata.getParent(), context);
} else if (metadata.getParent().getMetadata().getPathType() != PathType.VARIABLE
&& metadata.getParent().getMetadata().getPathType() != PathType.DELEGATE) {
return visit(parent, context);
} else if (parent.getMetadata().getPathType() != PathType.VARIABLE) {
String rv = getKeyForPath(expr, metadata);
String parent = visit(metadata.getParent(), context);
return rv != null ? parent + "." + rv : parent;
String parentStr = visit(parent, context);
return rv != null ? parentStr + "." + rv : parentStr;
}
}
return getKeyForPath(expr, metadata);

View File

@ -30,6 +30,7 @@ import com.mongodb.DBObject;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.dsl.*;
import com.querydsl.mongodb.domain.QAddress;
import com.querydsl.mongodb.domain.QDummyEntity;
import com.querydsl.mongodb.domain.QPerson;
import com.querydsl.mongodb.domain.QUser;
@ -263,6 +264,15 @@ public class MongodbSerializerTest {
assertQuery(person.addressId.eq(id), dbo("addressId",id));
}
@Test
public void Path() {
QUser user = QUser.user;
assertEquals("firstName", serializer.visit(user.firstName, null));
assertEquals("firstName", serializer.visit(user.as(QUser.class).firstName, null));
assertEquals("mainAddress.street", serializer.visit(user.mainAddress().street, null));
assertEquals("mainAddress.street", serializer.visit(user.mainAddress().as(QAddress.class).street, null));
}
private List<OrderSpecifier<?>> sortList(OrderSpecifier<?> ... order) {
return Arrays.asList(order);