Skip to content

Commit

Permalink
#15 JPAModule many-relation fix
Browse files Browse the repository at this point in the history
fixed querydsl integration and added test cases
  • Loading branch information
remmeier committed Sep 24, 2016
1 parent 10ea37f commit ddfb4bc
Show file tree
Hide file tree
Showing 12 changed files with 183 additions and 70 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@ public JsonApiResponse findOneTarget(T_ID sourceId, String fieldName, QueryAdapt
resource = ((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.findOneTarget(sourceId, fieldName, toQueryParams(queryAdapter));
} else if(relationshipRepository instanceof QuerySpecRelationshipRepository){
resource = ((QuerySpecRelationshipRepository)relationshipRepository).findOneTarget(sourceId, fieldName, toQuerySpec(queryAdapter));
QuerySpecRelationshipRepository querySpecRepository = (QuerySpecRelationshipRepository) relationshipRepository;
Class<?> targetResourceClass = querySpecRepository.getTargetResourceClass();
resource = querySpecRepository.findOneTarget(sourceId, fieldName, toQuerySpec(queryAdapter, targetResourceClass));
} else {
resource = ((RelationshipRepository) relationshipRepository)
.findOneTarget(sourceId, fieldName, toQueryParams(queryAdapter));
Expand All @@ -96,7 +98,9 @@ public JsonApiResponse findManyTargets(T_ID sourceId, String fieldName, QueryAda
resources = ((AnnotatedRelationshipRepositoryAdapter) relationshipRepository)
.findManyTargets(sourceId, fieldName, toQueryParams(queryAdapter));
}else if(relationshipRepository instanceof QuerySpecRelationshipRepository){
resources = ((QuerySpecRelationshipRepository)relationshipRepository).findManyTargets(sourceId, fieldName, toQuerySpec(queryAdapter));
QuerySpecRelationshipRepository querySpecRepository = (QuerySpecRelationshipRepository) relationshipRepository;
Class<?> targetResourceClass = querySpecRepository.getTargetResourceClass();
resources = querySpecRepository.findManyTargets(sourceId, fieldName, toQuerySpec(queryAdapter, targetResourceClass));
} else {
resources = ((RelationshipRepository) relationshipRepository)
.findManyTargets(sourceId, fieldName, toQueryParams(queryAdapter));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public JsonApiResponse findOne(ID id, QueryAdapter queryAdapter) {
resource = ((AnnotatedResourceRepositoryAdapter) resourceRepository).findOne(id, toQueryParams(queryAdapter));
}
else if (resourceRepository instanceof QuerySpecResourceRepository) {
resource = ((QuerySpecResourceRepository) resourceRepository).findOne(id, toQuerySpec(queryAdapter));
resource = ((QuerySpecResourceRepository) resourceRepository).findOne(id, toQuerySpec(queryAdapter, resourceInformation.getResourceClass()));
}
else {
resource = ((ResourceRepository) resourceRepository).findOne(id, toQueryParams(queryAdapter));
Expand All @@ -49,7 +49,7 @@ public JsonApiResponse findAll(QueryAdapter queryAdapter) {
resources = ((AnnotatedResourceRepositoryAdapter) resourceRepository).findAll(toQueryParams(queryAdapter));
}
else if (resourceRepository instanceof QuerySpecResourceRepository) {
resources = ((QuerySpecResourceRepository) resourceRepository).findAll(toQuerySpec(queryAdapter));
resources = ((QuerySpecResourceRepository) resourceRepository).findAll(toQuerySpec(queryAdapter, resourceInformation.getResourceClass()));
}
else {
resources = ((ResourceRepository) resourceRepository).findAll(toQueryParams(queryAdapter));
Expand All @@ -63,7 +63,7 @@ public JsonApiResponse findAll(Iterable ids, QueryAdapter queryAdapter) {
resources = ((AnnotatedResourceRepositoryAdapter) resourceRepository).findAll(ids, toQueryParams(queryAdapter));
}
else if (resourceRepository instanceof QuerySpecResourceRepository) {
resources = ((QuerySpecResourceRepository) resourceRepository).findAll(ids, toQuerySpec(queryAdapter));
resources = ((QuerySpecResourceRepository) resourceRepository).findAll(ids, toQuerySpec(queryAdapter, resourceInformation.getResourceClass()));
}
else {
resources = ((ResourceRepository) resourceRepository).findAll(ids, toQueryParams(queryAdapter));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ private LinksInformation getLinksInformation(Object repository, Iterable<?> reso
return null;
}

protected QuerySpec toQuerySpec(QueryAdapter queryAdapter) {
protected QuerySpec toQuerySpec(QueryAdapter queryAdapter, Class<?> targetResourceClass) {
if(queryAdapter == null)
return null;
if(queryAdapter instanceof QuerySpecAdapter){
Expand All @@ -98,8 +98,7 @@ protected QuerySpec toQuerySpec(QueryAdapter queryAdapter) {

DefaultQuerySpecConverter converter = new DefaultQuerySpecConverter(resourceRegistry, operatorRegistry);

Class<?> resourceClass = resourceInformation.getResourceClass();
return converter.fromParams(resourceClass, queryParams);
return converter.fromParams(targetResourceClass, queryParams);
}

protected abstract FilterOperator getDefaultOperator() ;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,7 @@ private JpaQueryExecutor<?> getExecutor(I sourceId, String fieldName, QuerySpec

@Override
public Class<T> getSourceResourceClass() {
// TODO Auto-generated method stub
return null;
return entityClass;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,11 @@ public E getEntityAttribute(MetaAttributePath attrPath) {
criteriaPath = joinMap(currentCriteriaPath, pathElement);
} else {
// we may need to downcast if attribute is defined on a subtype
Class<?> entityType = pathElement.getParent().asDataObject().getImplementationClass();
boolean isSubType = !entityType.isAssignableFrom(backend.getJavaType(currentCriteriaPath));
Class<?> pathType = pathElement.getParent().asDataObject().getImplementationClass();
Class<?> currentType = backend.getJavaElementType(currentCriteriaPath);
boolean isSubType = !pathType.isAssignableFrom(currentType);
if (isSubType) {
currentCriteriaPath = backend.joinSubType(currentCriteriaPath, entityType);
currentCriteriaPath = backend.joinSubType(currentCriteriaPath, pathType);
}
criteriaPath = backend.getAttribute(currentCriteriaPath, pathElement);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public interface JpaQueryBackend<F, O, P, E> {

public P or(List<P> predicates);

public Class<?> getJavaType(E currentCriteriaPath);
public Class<?> getJavaElementType(E currentCriteriaPath);

public E getAttribute(E currentCriteriaPath, MetaAttribute pathElement);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ public Expression<?> joinMapKey(Expression<?> currentCriteriaPath, MetaAttribute
}

@Override
public Class<?> getJavaType(Expression<?> currentCriteriaPath) {
public Class<?> getJavaElementType(Expression<?> currentCriteriaPath) {
return currentCriteriaPath.getJavaType();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,19 @@
import javax.persistence.criteria.JoinType;

import com.google.common.collect.ImmutableList;
import com.querydsl.core.types.CollectionExpression;
import com.querydsl.core.types.EntityPath;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.ExpressionUtils;
import com.querydsl.core.types.OperationImpl;
import com.querydsl.core.types.Ops;
import com.querydsl.core.types.Order;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.QTuple;
import com.querydsl.core.types.dsl.BeanPath;
import com.querydsl.core.types.dsl.CollectionExpressionBase;
import com.querydsl.core.types.dsl.ComparableExpression;
import com.querydsl.core.types.dsl.LiteralExpression;
import com.querydsl.core.types.dsl.MapExpressionBase;
Expand All @@ -41,13 +44,16 @@
import io.katharsis.queryspec.FilterOperator;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class QuerydslQueryBackend<T>
implements JpaQueryBackend<Expression<?>, OrderSpecifier<?>, Predicate, Expression<?>> {
public class QuerydslQueryBackend<T> implements JpaQueryBackend<Expression<?>, OrderSpecifier<?>, Predicate, Expression<?>> {

private JoinRegistry<Expression<?>, Expression<?>> joinHelper;
private EntityPath<T> root;

private Path<T> root;

private EntityPath<?> parentFrom;

private QuerydslQueryImpl<T> queryImpl;

private JPAQuery<T> querydslQuery;

private List<OrderSpecifier<?>> orderList = new ArrayList<>();
Expand All @@ -60,17 +66,27 @@ public QuerydslQueryBackend(QuerydslQueryImpl<T> queryImpl, Class<T> clazz, Clas

if (parentEntityClass != null) {
parentFrom = QuerydslUtils.getEntityPath(parentEntityClass);
root = (EntityPath<T>) QuerydslUtils.get(parentFrom, parentAttr.getName());
root = QuerydslUtils.getEntityPath(clazz);

Path joinPath = (Path) QuerydslUtils.get(parentFrom, parentAttr.getName());
joinHelper = new JoinRegistry<>(this, queryImpl);

joinHelper.putJoin(new MetaAttributePath(), root);
querydslQuery = queryFactory.select(root);
querydslQuery = querydslQuery.from(parentFrom);
} else {
if (joinPath instanceof CollectionExpression) {
querydslQuery = querydslQuery.join((CollectionExpression) joinPath, root);
}
else {
querydslQuery = querydslQuery.join((EntityPath) joinPath, root);
}
}
else {
root = QuerydslUtils.getEntityPath(clazz);
joinHelper = new JoinRegistry<>(this, queryImpl);
joinHelper.putJoin(new MetaAttributePath(), root);
querydslQuery = queryFactory.select(root);
querydslQuery = querydslQuery.from(root);
querydslQuery = querydslQuery.from((EntityPath) root);
}
}

Expand All @@ -93,7 +109,7 @@ public void addPredicate(Predicate predicate) {
}

@Override
public EntityPath<T> getRoot() {
public Path<T> getRoot() {
return root;
}

Expand All @@ -111,7 +127,8 @@ public List<OrderSpecifier<?>> getOrderList() {
public OrderSpecifier<?> newSort(Expression<?> expr, Direction dir) {
if (dir == Direction.ASC) {
return new OrderSpecifier(Order.ASC, expr);
} else {
}
else {
return new OrderSpecifier(Order.DESC, expr);
}
}
Expand All @@ -124,8 +141,7 @@ public void distinct() {
@Override
public void addParentPredicate(MetaAttribute primaryKeyAttr) {
List<?> parentIds = queryImpl.getParentIds();
SimpleExpression<?> parentIdPath = (SimpleExpression<?>) QuerydslUtils.get(parentFrom,
primaryKeyAttr.getName());
SimpleExpression<?> parentIdPath = (SimpleExpression<?>) QuerydslUtils.get(parentFrom, primaryKeyAttr.getName());
addPredicate(parentIdPath.in((List) parentIds));
}

Expand All @@ -142,7 +158,8 @@ public void addSelection(Expression<?> expression, String name) {
if (selection != null) {
if (selection instanceof QTuple) {
newSelection.addAll(((QTuple) selection).getArgs());
} else {
}
else {
newSelection.add(selection);
}
}
Expand Down Expand Up @@ -178,37 +195,49 @@ public Predicate buildPredicate(FilterOperator operator, Expression<?> expressio
private Predicate handle(Expression expression, FilterOperator operator, Object value) { // NOSONAR
if (operator == FilterOperator.EQ || operator == FilterOperator.NEQ) {
return handleEquals(expression, operator, value);
} else if (operator == JpaFilterOperators.LIKE) {
}
else if (operator == JpaFilterOperators.LIKE) {
return ((StringExpression) expression).like(value.toString());
} else if (operator == JpaFilterOperators.NOT_LIKE) {
}
else if (operator == JpaFilterOperators.NOT_LIKE) {
return ((StringExpression) expression).like(value.toString()).not();
} else if (operator == JpaFilterOperators.ILIKE) {
}
else if (operator == JpaFilterOperators.ILIKE) {
return ((StringExpression) expression).lower().like(value.toString().toLowerCase());
} else if (operator == FilterOperator.GT) {
}
else if (operator == FilterOperator.GT) {
if (expression instanceof NumberExpression) {
return ((NumberExpression) expression).gt((Number) value);
} else {
}
else {
return ((ComparableExpression) expression).gt((Comparable) value);
}
} else if (operator == FilterOperator.LT) {
}
else if (operator == FilterOperator.LT) {
if (expression instanceof NumberExpression) {
return ((NumberExpression) expression).lt((Number) value);
} else {
}
else {
return ((ComparableExpression) expression).lt((Comparable) value);
}
} else if (operator == FilterOperator.GE) {
}
else if (operator == FilterOperator.GE) {
if (expression instanceof NumberExpression) {
return ((NumberExpression) expression).goe((Number) value);
} else {
}
else {
return ((ComparableExpression) expression).goe((Comparable) value);
}
} else if (operator == FilterOperator.LE) {
}
else if (operator == FilterOperator.LE) {
if (expression instanceof NumberExpression) {
return ((NumberExpression) expression).loe((Number) value);
} else {
}
else {
return ((ComparableExpression) expression).loe((Comparable) value);
}
} else {
}
else {
throw new IllegalStateException("unexpected operator " + operator);
}

Expand All @@ -218,15 +247,18 @@ private Predicate handleEquals(Expression<?> expression, FilterOperator operator
if (value instanceof List) {
Predicate p = ((SimpleExpression) expression).in((List) value);
return negateIfNeeded(p, operator);
} else if (Collection.class.isAssignableFrom(expression.getType())) {
}
else if (Collection.class.isAssignableFrom(expression.getType())) {
SimpleExpression simpleExpr = (SimpleExpression) expression;
Predicate p = simpleExpr.in(value);
return negateIfNeeded(p, operator);
} else if (expression instanceof MapExpressionBase) {
}
else if (expression instanceof MapExpressionBase) {
MapExpressionBase mapExpression = (MapExpressionBase) expression;
Predicate p = mapExpression.containsValue(value);
return negateIfNeeded(p, operator);
} else if (value == null) {
}
else if (value == null) {
return negateIfNeeded(((SimpleExpression) expression).isNull(), operator);
}
return negateIfNeeded(((SimpleExpression) expression).eq(value), operator);
Expand All @@ -237,7 +269,8 @@ private Expression<?> handleConversions(Expression<?> expression, FilterOperator
if (expression.getType() != String.class
&& (operator == JpaFilterOperators.LIKE || operator == JpaFilterOperators.ILIKE)) {
return ((LiteralExpression) expression).stringValue();
} else {
}
else {
return expression;
}
}
Expand All @@ -246,7 +279,8 @@ private Expression<?> handleConversions(Expression<?> expression, FilterOperator
public Predicate and(List<Predicate> predicates) {
if (predicates.size() == 1) {
return predicates.get(0);
} else {
}
else {
return new BooleanPredicateOperation(Ops.AND, (ImmutableList) ImmutableList.copyOf(predicates));
}
}
Expand All @@ -260,7 +294,8 @@ public Predicate not(Predicate predicate) {
public Predicate or(List<Predicate> predicates) {
if (predicates.size() == 1) {
return predicates.get(0);
} else {
}
else {
return new BooleanPredicateOperation(Ops.OR, (ImmutableList) ImmutableList.copyOf(predicates));
}
}
Expand Down Expand Up @@ -312,7 +347,10 @@ public Expression<?> joinMapKey(Expression<?> currentCriteriaPath, MetaAttribute
}

@Override
public Class<?> getJavaType(Expression<?> expression) {
public Class<?> getJavaElementType(Expression<?> expression) {
if (expression instanceof CollectionExpressionBase) {
return ((CollectionExpressionBase) expression).getElementType();
}
return expression.getType();
}

Expand All @@ -323,7 +361,8 @@ public Expression<?> getAttribute(final Expression<?> expression, MetaAttribute
QuerydslExpressionFactory expressionFactory = (QuerydslExpressionFactory) virtualAttrs
.get((MetaVirtualAttribute) pathElement);
return expressionFactory.getExpression(expression, getQuery());
} else {
}
else {
return QuerydslUtils.get(expression, pathElement.getName());
}
}
Expand All @@ -344,7 +383,8 @@ public Expression<?> doJoin(MetaAttribute targetAttr, JoinType joinType, Express
.get(virtualAttr);

return expressionFactory.getExpression(parent, getQuery());
} else {
}
else {
Expression<Object> expression = QuerydslUtils.get(parent, targetAttr.getName());
querydslQuery.getMetadata().addJoin(QuerydslUtils.convertJoinType(joinType), expression);
return expression;
Expand Down
Loading

0 comments on commit ddfb4bc

Please sign in to comment.