You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/05/15 00:29:59 UTC
svn commit: r774954 - in /openjpa/trunk:
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
Author: faywang
Date: Thu May 14 22:29:59 2009
New Revision: 774954
URL: http://svn.apache.org/viewvc?rev=774954&view=rev
Log:
OPENJPA-1013: groupBy/Having support for Criteria query
Modified:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java?rev=774954&r1=774953&r2=774954&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java Thu May 14 22:29:59 2009
@@ -189,7 +189,7 @@
}
@AllowFailure
- public void testJoins() {
+ public void testJoins1() {
String jpql = "SELECT c.name FROM Customer c JOIN c.orders o " +
"JOIN o.lineItems i WHERE i.product.productType = 'printer'";
CriteriaQuery c = cb.create();
@@ -201,14 +201,17 @@
get(Product_.productType), "printer"));
assertEquivalence(c, jpql);
-
- jpql = "SELECT c FROM Customer c LEFT JOIN c.orders o " +
+ }
+
+ @AllowFailure
+ public void testJoins2() {
+ String jpql = "SELECT c FROM Customer c LEFT JOIN c.orders o " +
"WHERE c.status = 1";
c = cb.create();
- Root<Customer> cust1 = c.from(Customer.class);
- Join<Customer, Order> order1 = cust1.join(Customer_.orders,
+ Root<Customer> cust = c.from(Customer.class);
+ Join<Customer, Order> order = cust.join(Customer_.orders,
JoinType.LEFT);
- c.where(cb.equal(cust1.get(Customer_.status), 1)).select(cust1);
+ c.where(cb.equal(cust.get(Customer_.status), 1)).select(cust);
assertEquivalence(c, jpql);
}
@@ -226,7 +229,7 @@
}
@AllowFailure
- public void testPathNavigation() {
+ public void testPathNavigation1() {
String jpql = "SELECT p.vendor FROM Employee e JOIN " +
"e.contactInfo.phones p " +
"WHERE e.contactInfo.address.zipCode = '95054'";
@@ -239,11 +242,13 @@
q.select(phone.get(Phone_.vendor));
assertEquivalence(q, jpql);
-
- jpql = "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) " +
+ }
+
+ @AllowFailure
+ public void testPathNavigation2() {
+ String jpql = "SELECT i.name, p FROM Item i JOIN i.photos p WHERE KEY(p) " +
"LIKE '%egret%'";
-
- q = cb.create();
+ CriteriaQuery q = cb.create();
Root<Item> item = q.from(Item.class);
MapJoin<Item, String, Photo> photo = item.join(Item_.photos);
q.select(item.get(Item_.name), photo).
@@ -253,7 +258,7 @@
}
@AllowFailure
- public void testRestrictQueryResult() {
+ public void testRestrictQueryResult1() {
String jpql = "SELECT t FROM CreditCard c JOIN c.transactionHistory t "
+ "WHERE c.customer.accountNum = 321987 AND INDEX(t) BETWEEN 0 "
+ "AND 9";
@@ -266,9 +271,12 @@
cb.between(t.index(), 0, 9));
assertEquivalence(q, jpql);
-
- jpql = "SELECT o FROM Order o WHERE o.lineItems IS EMPTY";
- q = cb.create();
+ }
+
+ @AllowFailure
+ public void testRestrictQueryResult2() {
+ String jpql = "SELECT o FROM Order o WHERE o.lineItems IS EMPTY";
+ CriteriaQuery q = cb.create();
Root<Order> order = q.from(Order.class);
q.where(cb.isEmpty(order.get(Order_.lineItems))).select(order);
@@ -276,7 +284,7 @@
}
@AllowFailure
- public void testExpressions() {
+ public void testExpression1() {
String jpql = "SELECT o.quantity, o.totalCost*1.08 AS taxedCost, "
+ "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a "
+ "WHERE a.state = 'CA' AND a.county = 'Santa Clara";
@@ -291,27 +299,36 @@
address.get(Address_.zipCode));
assertEquivalence(q, jpql);
-
- jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
- q = cb.create();
+ }
+
+ @AllowFailure
+ public void testExpression2() {
+ String jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
+ CriteriaQuery q = cb.create();
Root<Employee> emp = q.from(Employee.class);
q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
assertEquivalence(q, jpql);
-
- jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w " +
+ }
+
+ @AllowFailure
+ public void testExpression3() {
+ String jpql = "SELECT w.name FROM Course c JOIN c.studentWaitList w " +
"WHERE c.name = 'Calculus' AND INDEX(w) = 0";
- q = cb.create();
+ CriteriaQuery q = cb.create();
Root<Course> course = q.from(Course.class);
ListJoin<Course, Student> w = course.join(Course_.studentWaitList);
q.where(cb.equal(course.get(Course_.name), "Calculus"),
cb.equal(w.index(), 0)).select(w.get(Student_.name));
assertEquivalence(q, jpql);
-
- jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i JOIN " +
+ }
+
+ @AllowFailure
+ public void testExpression4() {
+ String jpql = "SELECT SUM(i.price) FROM Order o JOIN o.lineItems i JOIN " +
"o.customer c WHERE c.lastName = 'Smith' AND c.firstName = 'John'";
- q = cb.create();
+ CriteriaQuery q = cb.create();
Root<Order> o = q.from(Order.class);
Join<Order, LineItem> i = o.join(Order_.lineItems);
Join<Order, Customer> c = o.join(Order_.customer);
@@ -320,10 +337,13 @@
q.select(cb.sum(i.get(LineItem_.price)));
assertEquivalence(q, jpql);
-
- jpql = "SELECT SIZE(d.employees) FROM Department d " +
+ }
+
+ @AllowFailure
+ public void testExpression5() {
+ String jpql = "SELECT SIZE(d.employees) FROM Department d " +
"WHERE d.name = 'Sales'";
- q = cb.create();
+ CriteriaQuery q = cb.create();
Root<Department> d = q.from(Department.class);
q.where(cb.equal(d.get(Department_.name), "Sales"));
q.select(cb.size(d.get(Department_.employees)));
@@ -523,7 +543,6 @@
assertEquivalence(q, jpql);
}
- @AllowFailure
public void testGroupByAndHaving() {
String jpql = "SELECT c.status, AVG(c.filledOrderCount), COUNT(c) FROM "
+ "Customer c GROUP BY c.status HAVING c.status IN (1, 2)";
@@ -539,7 +558,7 @@
}
@AllowFailure
- public void testOrdering() {
+ public void testOrdering1() {
String jpql = "SELECT o FROM Customer c JOIN c.orders o " +
"JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity DESC, " +
"o.totalCost";
@@ -553,38 +572,71 @@
q.select(o);
assertEquivalence(q, jpql);
-
- jpql = "SELECT o.quantity, a.zipCode FROM Customer c JOIN c.orders " +
- "JOIN c.address a WHERE a.state = 'CA' ORDER BY o.quantity, " +
- "a.zipCode";
- q = cb.create();
- Root<Customer> c1 = q.from(Customer.class);
- Join<Customer,Order> o1 = c1.join(Customer_.orders);
- Join<Customer,Address> a1 = c1.join(Customer_.address);
- q.where(cb.equal(a1.get(Address_.state), "CA"));
- q.orderBy(cb.asc(o1.get(Order_.quantity)), cb.asc(a1.get(
+ }
+
+ @AllowFailure
+ public void testOrdering2() {
+ String jpql = "SELECT o.quantity, a.zipCode FROM Customer c " +
+ "JOIN c.orders JOIN c.address a WHERE a.state = 'CA' " +
+ "ORDER BY o.quantity, a.zipCode";
+ CriteriaQuery q = cb.create();
+ Root<Customer> c = q.from(Customer.class);
+ Join<Customer,Order> o = c.join(Customer_.orders);
+ Join<Customer,Address> a = c.join(Customer_.address);
+ q.where(cb.equal(a.get(Address_.state), "CA"));
+ q.orderBy(cb.asc(o.get(Order_.quantity)), cb.asc(a.get(
Address_.zipCode)));
- q.select(o1.get(Order_.quantity), a1.get(Address_.zipCode));
+ q.select(o.get(Order_.quantity), a.get(Address_.zipCode));
assertEquivalence(q, jpql);
-
- jpql = "SELECT o.quantity, o.cost * 1.08 AS taxedCost, a.zipCode " +
- "FROM Customer c JOIN c.orders o JOIN c.address a " +
+ }
+
+ @AllowFailure
+ public void testOrdering3() {
+ String jpql = "SELECT o.quantity, o.cost * 1.08 AS taxedCost, " +
+ "a.zipCode FROM Customer c JOIN c.orders o JOIN c.address a " +
"WHERE a.state = 'CA' AND a.county = 'Santa Clara' " +
"ORDER BY o.quantity, taxedCost, a.zipCode";
- q = cb.create();
- Root<Customer> c2 = q.from(Customer.class);
- Join<Customer,Order> o2 = c2.join(Customer_.orders);
- Join<Customer,Address> a2 = c2.join(Customer_.address);
+ CriteriaQuery q = cb.create();
+ Root<Customer> c = q.from(Customer.class);
+ Join<Customer,Order> o = c.join(Customer_.orders);
+ Join<Customer,Address> a = c.join(Customer_.address);
q.where(cb.equal(a.get(Address_.state), "CA"),
- cb.equal(a.get(Address_.county), "Santa Clara"));
+ cb.equal(a.get(Address_.county), "Santa Clara"));
q.orderBy(cb.asc(o.get(Order_.quantity)),
- cb.asc(cb.prod(o.get(Order_.totalCost), 1.08)),
- cb.asc(a.get(Address_.zipCode)));
+ cb.asc(cb.prod(o.get(Order_.totalCost), 1.08)),
+ cb.asc(a.get(Address_.zipCode)));
q.select(o.get(Order_.quantity),
- cb.prod(o.get(Order_.totalCost), 1.08),
- a.get(Address_.zipCode));
-
+ cb.prod(o.get(Order_.totalCost), 1.08),
+ a.get(Address_.zipCode));
+
+ assertEquivalence(q, jpql);
+ }
+
+ @AllowFailure
+ public void testOrdering4() {
+ String jpql = "SELECT c FROM Customer c "
+ + "ORDER BY c.name DESC, c.status";
+ CriteriaQuery q = cb.create();
+ Root<Customer> c = q.from(Customer.class);
+ q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
+ .get(Customer_.status)));
+ q.select(c);
+
+ assertEquivalence(q, jpql);
+ }
+
+ @AllowFailure
+ public void testOrdering5() {
+ String jpql = "SELECT c.firstName, c.lastName, c.balanceOwed " +
+ "FROM Customer c ORDER BY c.name DESC, c.status";
+ CriteriaQuery q = cb.create();
+ Root<Customer> c = q.from(Customer.class);
+ q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
+ .get(Customer_.status)));
+ q.select(c.get(Customer_.firstName), c.get(Customer_.lastName),
+ c.get(Customer_.balanceOwed));
+
assertEquivalence(q, jpql);
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=774954&r1=774953&r2=774954&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java Thu May 14 22:29:59 2009
@@ -186,14 +186,13 @@
exps.filter = _where == null ? factory.emptyExpression()
: _where.toKernelExpression(factory, _model);
- // exps.grouping = null; // Value[]
- // exps.groupingClauses = null; // String[]
+ evalGrouping(exps, factory);
exps.having = _having == null ? factory.emptyExpression()
: _having.toKernelExpression(factory, _model);
+
+ evalOrdering(exps, factory);
// exps.operation = QueryOperations.OP_SELECT;
- // exps.ordering = null; //Value[]
- // exps.orderingAliases = null; // String[]
- // exps.orderingClauses = null; // String[]
+
// exps.parameterTypes = null; // LinkedMap<>
// exps.projectionAliases = null; // String[]
// exps.projectionClauses = null; // String[]
@@ -203,6 +202,41 @@
return exps;
}
+ void evalOrdering(QueryExpressions exps, ExpressionFactory factory) {
+ if (_orders == null)
+ return;
+ int ordercount = _orders.size();
+ exps.ordering = new Value[ordercount];
+ exps.orderingClauses = new String[ordercount];
+ exps.orderingAliases = new String[ordercount];
+ exps.ascending = new boolean[ordercount];
+ for (int i = 0; i < ordercount; i++) {
+ OrderImpl order = (OrderImpl)_orders.get(i);
+ //Expression<? extends Comparable> expr = order.getExpression();
+ //exps.ordering[i] = Expressions.toValue(
+ // (ExpressionImpl<?>)expr, factory, _model);
+
+ //exps.orderingClauses[i] = assemble(firstChild);
+ //exps.orderingAliases[i] = firstChild.text;
+ exps.ascending[i] = order.isAscending();
+ }
+ }
+
+ void evalGrouping(QueryExpressions exps, ExpressionFactory factory) {
+ if (_groups == null)
+ return;
+ int groupByCount = _groups.size();
+ exps.grouping = new Value[groupByCount];
+
+ for (int i = 0; i < groupByCount; i++) {
+ Expression<?> groupBy = _groups.get(i);
+ exps.grouping[i] = Expressions.toValue(
+ (ExpressionImpl<?>)groupBy, factory, _model);;
+ }
+ }
+
+
+
Value[] toValues(ExpressionFactory factory, List<Selection<?>> sels) {
if (sels == null || (sels.size() == 1 && sels.get(0) == getRoot()))