OPENJPA-1039: treat AND OR operators as non-associative

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@765085 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Pinaki Poddar 2009-04-15 08:34:45 +00:00
parent affdc073d0
commit 21b41a50fe
2 changed files with 22 additions and 2 deletions

View File

@ -28,6 +28,7 @@ import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.query.DomainObject;
import org.apache.openjpa.persistence.query.Expression;
import org.apache.openjpa.persistence.query.OpenJPAQueryBuilder;
import org.apache.openjpa.persistence.query.Predicate;
import org.apache.openjpa.persistence.query.QueryBuilderImpl;
import org.apache.openjpa.persistence.query.QueryDefinition;
import org.apache.openjpa.persistence.query.SelectItem;
@ -90,6 +91,25 @@ public class TestCriteria extends SingleEMFTestCase {
// do nothing as we may not have a database connection
}
public void testLogicalPredicateAssociativity() {
DomainObject e = qb.createQueryDefinition(Employee.class);
Predicate p1 = e.get("salary").greaterThan(100);
Predicate p2 = e.get("rating").equal(5);
Predicate p3 = e.get("name").like("John");
Predicate w1 = p1.and(p2.or(p3));
Predicate w2 = (p1.and(p2)).or(p3);
QueryDefinition q1 = e.select(e).where(w1);
String jpql1 = qb.toJPQL(q1);
emf.createEntityManager().createDynamicQuery(q1).getResultList();
QueryDefinition q2 = e.select(e).where(w2);
String jpql2 = qb.toJPQL(q2);
System.err.println(jpql1);
System.err.println(jpql2);
assertNotEquals(jpql1, jpql2);
emf.createEntityManager().createDynamicQuery(q2).getResultList();
}
public void testMultipleDomainOfSameClass() {
DomainObject o1 = qb.createQueryDefinition(Order.class);
DomainObject o2 = o1.addRoot(Order.class);

View File

@ -52,7 +52,7 @@ public class LogicalPredicate extends AbstractVisitable
}
public String asExpression(AliasContext ctx) {
return ((Visitable)_p1).asExpression(ctx) + " " + _op + " "
+ ((Visitable)_p2).asExpression(ctx);
return OPEN_BRACE + ((Visitable)_p1).asExpression(ctx) + SPACE + _op +
SPACE + ((Visitable)_p2).asExpression(ctx) + CLOSE_BRACE;
}
}