You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/06/30 15:40:18 UTC
svn commit: r789723 [2/2] - in /openjpa/trunk:
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/
openjpa-persistence/src/main/java/org/apache/open...
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=789723&r1=789722&r2=789723&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 Tue Jun 30 13:40:17 2009
@@ -25,14 +25,17 @@
import javax.persistence.Parameter;
import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.MapJoin;
+import javax.persistence.criteria.ParameterExpression;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.SetJoin;
import javax.persistence.criteria.Subquery;
import javax.persistence.criteria.QueryBuilder.Case;
+import javax.persistence.criteria.QueryBuilder.SimpleCase;
import org.apache.openjpa.persistence.test.AllowFailure;
@@ -107,28 +110,29 @@
public void testProjection() {
String jpql = "select a.balance,a.loan from Account a";
- CriteriaQuery<?> c = cb.createQuery();
+ CriteriaQuery<Tuple> c = cb.createTupleQuery();
Root<Account> account = c.from(Account.class);
-// c.select(account.get(Account_.balance), account.get(Account_.loan));
+ c.multiselect(account.get(Account_.balance), account.get(Account_.loan));
assertEquivalence(c, jpql);
}
public void testAbsExpression() {
- CriteriaQuery<?> c = cb.createQuery();
+ String jpql = "select a from Account a where abs(a.balance)=100";
+
+ CriteriaQuery<Account> c = cb.createQuery(Account.class);
Root<Account> account = c.from(Account.class);
- String jpql = "select a from Account a where abs(a.balance)=100";
-// c.select(account).where(
-// cb.equal(cb.abs(account.get(Account_.balance)), 100));
+ c.select(account).where(cb.equal(cb.abs(account.get(Account_.balance)), 100));
assertEquivalence(c, jpql);
}
public void testAvgExpression() {
- CriteriaQuery<?> c = cb.createQuery();
+ String jpql = "select avg(a.balance) from Account a";
+
+ CriteriaQuery<Double> c = cb.createQuery(Double.class);
Root<Account> account = c.from(Account.class);
- String jpql = "select avg(a.balance) from Account a";
-// c.select(cb.avg(account.get(Account_.balance)));
+ c.select(cb.avg(account.get(Account_.balance)));
assertEquivalence(c, jpql);
}
@@ -330,9 +334,9 @@
public void testTypeExpression() {
String jpql = "SELECT TYPE(e) FROM Employee e WHERE TYPE(e) <> Exempt";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Object> q = cb.createQuery();
Root<Employee> emp = q.from(Employee.class);
-// q.select(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
+ q.multiselect(emp.type()).where(cb.notEqual(emp.type(), Exempt.class));
assertEquivalence(q, jpql);
}
@@ -372,30 +376,28 @@
String jpql = "SELECT SIZE(d.employees) FROM Department d "
+ "WHERE d.name = 'Sales'";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Integer> q = cb.createQuery(Integer.class);
Root<Department> d = q.from(Department.class);
q.where(cb.equal(d.get(Department_.name), "Sales"));
-// q.select(cb.size(d.get(Department_.employees)));
+ q.select(cb.size(d.get(Department_.employees)));
assertEquivalence(q, jpql);
}
public void testCaseExpression() {
- String jpql =
- "SELECT e.name, CASE WHEN e.rating = 1 THEN e.salary * 1.1 "
- + "WHEN e.rating = 2 THEN e.salary * 1.2 ELSE e.salary * "
- + "1.01 END "
+ String jpql = "SELECT e.name, CASE "
+ + "WHEN e.rating = 1 THEN e.salary * 1.1 "
+ + "WHEN e.rating = 2 THEN e.salary * 1.2 "
+ + "ELSE e.salary * 1.01 END "
+ "FROM Employee e WHERE e.department.name = 'Engineering'";
CriteriaQuery<?> q = cb.createQuery();
Root<Employee> e = q.from(Employee.class);
- q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
- "Engineering"));
-// q.select(e.get(Employee_.name), cb.multiselect(Case().when(
-// cb.equal(e.get(Employee_.rating), 1),
-// cb.prod(e.get(Employee_.salary), 1.1)).when(
-// cb.equal(e.get(Employee_.rating), 2),
-// cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
-// cb.prod(e.get(Employee_.salary), 1.01))));
+ q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+ q.multiselect(e.get(Employee_.name),
+ cb.selectCase()
+ .when(cb.equal(e.get(Employee_.rating), 1), cb.prod(e.get(Employee_.salary), 1.1))
+ .when(cb.equal(e.get(Employee_.rating), 2), cb.prod(e.get(Employee_.salary), 1.2))
+ .otherwise(cb.prod(e.get(Employee_.salary), 1.01)));
assertEquivalence(q, jpql);
}
@@ -440,14 +442,12 @@
+ "FROM Employee e WHERE e.department.name = 'Engineering'";
CriteriaQuery<?> q = cb.createQuery();
Root<Employee> e = q.from(Employee.class);
- q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
- "Engineering"));
-// q.select(e.get(Employee_.name), cb.multiselect(Case().when(
-// cb.equal(e.get(Employee_.rating), 1),
-// cb.prod(e.get(Employee_.salary), 1.1)).when(
-// cb.equal(e.get(Employee_.rating), 2),
-// cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
-// cb.prod(e.get(Employee_.salary), 1.01)));
+ q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+ q.multiselect(e.get(Employee_.name),
+ cb.selectCase()
+ .when(cb.equal(e.get(Employee_.rating), 1), cb.prod(e.get(Employee_.salary), 1.1))
+ .when(cb.equal(e.get(Employee_.rating), 2), cb.prod(e.get(Employee_.salary), 1.2))
+ .otherwise(cb.prod(e.get(Employee_.salary), 1.01)));
assertEquivalence(q, jpql);
}
@@ -457,14 +457,16 @@
+ "WHEN 1 THEN e.salary * 1.1 "
+ "WHEN 2 THEN e.salary * 1.2 ELSE e.salary * 1.01 END "
+ "FROM Employee e WHERE e.department.name = 'Engineering'";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<Employee> e = q.from(Employee.class);
- q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
- "Engineering"));
-// q.select(e.get(Employee_.name), cb.multiselect(Case(e.get(Employee_.rating))
-// .when(1, cb.prod(e.get(Employee_.salary), 1.1)).when(2,
-// cb.prod(e.get(Employee_.salary), 1.2)).otherwise(
-// cb.prod(e.get(Employee_.salary), 1.01)));
+ q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+ Expression<Long> salary = e.get(Employee_.salary);
+ Expression<Integer> rating = e.get(Employee_.rating);
+ q.multiselect(e.get(Employee_.name),
+ cb.selectCase(rating).
+ when(1, cb.prod(salary, 1.1))
+ .when(2, cb.prod(salary, 1.2))
+ .otherwise(cb.prod(salary, 1.01)));
assertEquivalence(q, jpql);
}
@@ -473,46 +475,47 @@
String jpql = "SELECT e.name, CASE e.rating WHEN 1 THEN 10 "
+ "WHEN 2 THEN 20 ELSE 30 END "
+ "FROM Employee e WHERE e.department.name = 'Engineering'";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<Employee> e = q.from(Employee.class);
- q.where(cb.equal(e.get(Employee_.department).get(Department_.name),
- "Engineering"));
-// q.select(e.get(Employee_.name), cb.multiselect(Case(e.get(Employee_.rating))
-// .when(1, 10).when(2, 20).otherwise(30));
+ Expression<Integer> rating = e.get(Employee_.rating);
+ q.where(cb.equal(e.get(Employee_.department).get(Department_.name), "Engineering"));
+ q.multiselect(e.get(Employee_.name),
+ cb.selectCase(rating)
+ .when(1, 10)
+ .when(2, 20)
+ .otherwise(30));
assertEquivalence(q, jpql);
}
public void testLiterals() {
- String jpql = "SELECT p FROM Person p where 'Joe' MEMBER OF " +
- "p.nickNames";
- CriteriaQuery<?> q = cb.createQuery();
+ String jpql = "SELECT p FROM Person p where 'Joe' MEMBER OF p.nickNames";
+ CriteriaQuery<Person> q = cb.createQuery(Person.class);
Root<Person> p = q.from(Person.class);
-// q.select(p).where(
-// cb.isMember(cb.literal("Joe"), p.get(Person_.nickNames)));
+ q.select(p).where(cb.isMember(cb.literal("Joe"), p.get(Person_.nickNames)));
assertEquivalence(q, jpql);
}
public void testParameters1() {
String jpql = "SELECT c FROM Customer c Where c.status = :stat";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
Parameter<Integer> param = cb.parameter(Integer.class, "stat");
-// q.select(c).where(cb.equal(c.get(Customer_.status), param));
+ q.select(c).where(cb.equal(c.get(Customer_.status), param));
assertEquivalence(q, jpql, new String[] { "stat" }, new Object[] { 1 });
}
public void testParameters2() {
- String jpql = "SELECT c FROM Customer c Where c.status = :stat AND "
- + "c.name = :name";
- CriteriaQuery<?> q = cb.createQuery();
+ String jpql = "SELECT c FROM Customer c Where c.status = :stat AND c.name = :name";
+
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
Parameter<Integer> param1 = cb.parameter(Integer.class, "stat");
Parameter<String> param2 = cb.parameter(String.class, "name");
-// q.select(c).where(
-// cb.and(cb.equal(c.get(Customer_.status), param1), cb.equal(c
-// .get(Customer_.name), param2)));
+ q.select(c).where(cb.and(cb.equal(c.get(Customer_.status), param1),
+ cb.equal(c.get(Customer_.name), param2)));
assertEquivalence(q, jpql, new String[] { "stat", "name" },
new Object[] { 1, "test" });
@@ -520,22 +523,24 @@
public void testParameters3() {
String jpql = "SELECT c FROM Customer c Where c.status = :stat";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
Parameter<Integer> param = cb.parameter(Integer.class, "stat");
-// q.select(c).where(cb.equal(c.get(Customer_.status), param));
+ q.select(c).where(cb.equal(c.get(Customer_.status), param));
+
assertEquivalence(q, jpql, new String[]{"stat"}, new Object[] { 1 });
}
public void testParameters4() {
- String jpql = "SELECT c FROM Customer c Where c.status = :stat AND "
- + "c.name = :name";
- CriteriaQuery<?> q = cb.createQuery();
+ String jpql = "SELECT c FROM Customer c Where c.status = :stat AND c.name = :name";
+
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
Parameter<Integer> param1 = cb.parameter(Integer.class, "stat");
Parameter<String> param2 = cb.parameter(String.class, "name");
-// q.select(c).where(cb.and(cb.equal(c.get(Customer_.status), param1),
-// cb.equal(c.get(Customer_.name), param2)));
+ q.select(c).where(cb.and(cb.equal(c.get(Customer_.status), param1),
+ cb.equal(c.get(Customer_.name), param2)));
assertEquivalence(q, jpql, new String[]{"stat", "name"},
new Object[] { 1, "test" });
}
@@ -543,16 +548,16 @@
@AllowFailure(message="collection valued parameter does not work in in()")
public void testParameters5() {
String jpql = "SELECT c FROM Customer c Where c.status IN (:coll)";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
- Parameter<List> param1 = cb.parameter(List.class, "coll");
+ ParameterExpression<List> param1 = cb.parameter(List.class, "coll");
q.where(c.get(Customer_.status).in(param1));
- // q.select(c).where(cb.in(c.get(Customer_.status)).value(params1));
+ q.select(c);
List vals = new ArrayList();
vals.add(1);
vals.add(2);
- assertEquivalence(q, jpql, new String[] {"coll"},
- new Object[] {vals});
+ assertEquivalence(q, jpql, new String[] {"coll"}, new Object[] {vals});
}
@AllowFailure(message="Generates invalid SQL")
@@ -560,29 +565,27 @@
String jpql = "SELECT v.location.street, KEY(i).title, VALUE(i) FROM "
+ "VideoStore v JOIN v.videoInventory i WHERE v.location.zipCode = "
+ "'94301' AND VALUE(i) > 0";
- CriteriaQuery<?> q = cb.createQuery();
+
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<VideoStore> v = q.from(VideoStore.class);
- MapJoin<VideoStore, Movie, Integer> inv = v
- .join(VideoStore_.videoInventory);
+ MapJoin<VideoStore, Movie, Integer> i = v.join(VideoStore_.videoInventory);
q.where(cb.and(
- cb.equal(v.get(VideoStore_.location).get(Address_.zipCode),
- "94301"), cb.gt(inv.value(), 0)));
-// q.select(v.get(VideoStore_.location).get(Address_.street), inv.key()
-// .get(Movie_.title), inv.value());
+ cb.equal(v.get(VideoStore_.location).get(Address_.zipCode), "94301"),
+ cb.gt(i.value(), 0)));
+ q.multiselect(v.get(VideoStore_.location).get(Address_.street),
+ i.key().get(Movie_.title),
+ i.value());
assertEquivalence(q, jpql);
}
public void testNewConstruct() {
- String jpql = "SELECT NEW CustomerDetails(c.id, c.status) FROM "
- + "Customer c";
+ String jpql = "SELECT NEW CustomerDetails(c.id, c.status) FROM Customer c";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<CustomerDetails> q = cb.createQuery(CustomerDetails.class);
Root<Customer> c = q.from(Customer.class);
-// q.select(cb.multiselect(CustomerDetails.class, c.get(Customer_.id),
-// c.get(Customer_.status))
-// );
+ q.select(cb.construct(CustomerDetails.class, c.get(Customer_.id), c.get(Customer_.status)));
assertEquivalence(q, jpql);
}
@@ -626,13 +629,13 @@
+ "goodCustomer.balanceOwed < (SELECT AVG(c.balanceOwed) "
+ " FROM "
+ "Customer c)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> goodCustomer = q.from(Customer.class);
Subquery<Double> sq = q.subquery(Double.class);
Root<Customer> c = sq.from(Customer.class);
q.where(cb.lt(goodCustomer.get(Customer_.balanceOwed), sq.select(cb
.avg(c.get(Customer_.balanceOwed)))));
-// q.select(goodCustomer);
+ q.select(goodCustomer);
assertEquivalence(q, jpql);
}
@@ -641,14 +644,14 @@
String jpql = "SELECT DISTINCT emp FROM Employee emp WHERE EXISTS ("
+ "SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp ="
+ " emp.spouse)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Employee> q = cb.createQuery(Employee.class);
Root<Employee> emp = q.from(Employee.class);
Subquery<Employee> sq = q.subquery(Employee.class);
Root<Employee> spouseEmp = sq.from(Employee.class);
sq.select(spouseEmp);
sq.where(cb.equal(spouseEmp, emp.get(Employee_.spouse)));
q.where(cb.exists(sq));
-// q.select(emp).distinct(true);
+ q.select(emp).distinct(true);
assertEquivalence(q, jpql);
}
@@ -657,9 +660,9 @@
String jpql = "SELECT emp FROM Employee emp WHERE emp.salary > ALL ("
+ "SELECT m.salary FROM Manager m WHERE m.department = "
+ "emp.department)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Employee> q = cb.createQuery(Employee.class);
Root<Employee> emp = q.from(Employee.class);
-// q.select(emp);
+ q.select(emp);
Subquery<BigDecimal> sq = q.subquery(BigDecimal.class);
Root<Manager> m = sq.from(Manager.class);
sq.select(m.get(Manager_.salary));
@@ -673,9 +676,9 @@
public void testSubqueries4() {
String jpql = "SELECT c FROM Customer c WHERE "
+ "(SELECT COUNT(o) FROM c.orders o) > 10";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c1 = q.from(Customer.class);
-// q.select(c1);
+ q.select(c1);
Subquery<Long> sq3 = q.subquery(Long.class);
Root<Customer> c2 = sq3.correlate(c1);
Join<Customer, Order> o = c2.join(Customer_.orders);
@@ -687,9 +690,9 @@
public void testSubqueries5() {
String jpql = "SELECT o FROM Order o WHERE 10000 < ALL ("
+ "SELECT a.balance FROM o.customer c JOIN c.accounts a)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Order> q = cb.createQuery(Order.class);
Root<Order> o = q.from(Order.class);
-// q.select(o);
+ q.select(o);
Subquery<Integer> sq = q.subquery(Integer.class);
Root<Order> osq = sq.correlate(o);
Join<Order, Customer> c = osq.join(Order_.customer);
@@ -700,13 +703,12 @@
assertEquivalence(q, jpql);
}
- @AllowFailure(message="Root of subquery.delgate is not set")
public void testSubqueries6() {
String jpql = "SELECT o FROM Order o JOIN o.customer c WHERE 10000 < "
+ "ALL (SELECT a.balance FROM c.accounts a)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Order> q = cb.createQuery(Order.class);
Root<Order> o = q.from(Order.class);
-// q.select(o);
+ q.select(o);
Join<Order, Customer> c = o.join(Order_.customer);
Subquery<Integer> sq = q.subquery(Integer.class);
Join<Order, Customer> csq = sq.correlate(c);
@@ -720,12 +722,12 @@
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)";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<Customer> c = q.from(Customer.class);
q.groupBy(c.get(Customer_.status));
q.having(cb.in(c.get(Customer_.status)).value(1).value(2));
-// q.select(c.get(Customer_.status), cb.avg(c
-// .get(Customer_.filledOrderCount)), cb.count(c));
+ q.multiselect(c.get(Customer_.status), cb.avg(c
+ .get(Customer_.filledOrderCount)), cb.count(c));
assertEquivalence(q, jpql);
}
@@ -734,14 +736,14 @@
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";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Order> q = cb.createQuery(Order.class);
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.desc(o.get(Order_.quantity)), cb.asc(o
.get(Order_.totalCost)));
-// q.select(o);
+ q.select(o);
assertEquivalence(q, jpql);
}
@@ -750,14 +752,14 @@
String jpql = "SELECT o.quantity, a.zipCode FROM Customer c "
+ "JOIN c.orders o JOIN c.address a WHERE a.state = 'CA' "
+ "ORDER BY o.quantity, a.zipCode";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
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(o.get(Order_.quantity), a.get(Address_.zipCode));
+ q.multiselect(o.get(Order_.quantity), a.get(Address_.zipCode));
assertEquivalence(q, jpql);
}
@@ -767,29 +769,29 @@
+ "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";
- CriteriaQuery<?> q = cb.createQuery();
+ CriteriaQuery<Tuple> q = cb.createTupleQuery();
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"));
- q.orderBy(cb.asc(o.get(Order_.quantity)), cb.asc(cb.prod(
- o.get(Order_.totalCost), 1.08)),
+ Expression<Double> taxedCost = cb.prod(o.get(Order_.totalCost), 1.08);
+ taxedCost.setAlias("taxedCost");
+ q.where(cb.equal(a.get(Address_.state), "CA"),
+ cb.equal(a.get(Address_.county), "Santa Clara"));
+ q.orderBy(cb.asc(o.get(Order_.quantity)),
+ cb.asc(taxedCost),
cb.asc(a.get(Address_.zipCode)));
-// q.select(o.get(Order_.quantity), cb.prod(
-// o.get(Order_.totalCost), 1.08), a.get(Address_.zipCode));
+ q.multiselect(o.get(Order_.quantity), taxedCost, a.get(Address_.zipCode));
assertEquivalence(q, jpql);
}
public void testOrdering4() {
- String jpql = "SELECT c FROM Customer c "
- + "ORDER BY c.name DESC, c.status";
- CriteriaQuery<?> q = cb.createQuery();
+ String jpql = "SELECT c FROM Customer c ORDER BY c.name DESC, c.status";
+ CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> c = q.from(Customer.class);
- q.orderBy(cb.desc(c.get(Customer_.name)), cb.asc(c
- .get(Customer_.status)));
-// q.select(c);
+ q.orderBy(cb.desc(c.get(Customer_.name)),
+ cb.asc(c.get(Customer_.status)));
+ q.select(c);
assertEquivalence(q, jpql);
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/ImplicitFieldAccessMappedSuperclass_.java Tue Jun 30 13:40:17 2009
@@ -12,4 +12,5 @@
public class ImplicitFieldAccessMappedSuperclass_ {
public static volatile SingularAttribute<ImplicitFieldAccessMappedSuperclass,Date> createTime;
public static volatile SingularAttribute<ImplicitFieldAccessMappedSuperclass,Long> id;
+ public static volatile SingularAttribute<ImplicitFieldAccessMappedSuperclass,Integer> version;
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java Tue Jun 30 13:40:17 2009
@@ -35,7 +35,6 @@
import javax.persistence.metamodel.Type.PersistenceType;
import org.apache.openjpa.meta.ClassMetaData;
-import org.apache.openjpa.meta.MetaDataRepository;
import org.apache.openjpa.persistence.enhance.identity.Book;
import org.apache.openjpa.persistence.enhance.identity.BookId;
import org.apache.openjpa.persistence.enhance.identity.Library;
@@ -82,10 +81,9 @@
}
public void testMetaClassFieldsArePopulated() {
- EntityType<ImplicitFieldAccessSubclass> m =
- model.entity(ImplicitFieldAccessSubclass.class);
- Class<?> mCls = m.getJavaType();
+ EntityType<ImplicitFieldAccessSubclass> m = model.entity(ImplicitFieldAccessSubclass.class);
assertNotNull(m);
+ Class<?> mCls = m.getJavaType();
assertSame(ImplicitFieldAccessSubclass.class, mCls);
Class<?> m2Cls = model.repos.getMetaModel(mCls, true);
@@ -102,7 +100,7 @@
}
}
- public void testDomainClassAreCategorizedInPersistentCategory() {
+ public void testDomainClassCategorizedInPersistentCategory() {
assertCategory(PersistenceType.MAPPED_SUPERCLASS, ImplicitFieldAccessMappedSuperclass.class);
assertCategory(PersistenceType.ENTITY, ImplicitFieldAccessBase.class);
assertCategory(PersistenceType.ENTITY, ImplicitFieldAccessSubclass.class);
@@ -130,19 +128,15 @@
e0.getSingularAttribute("f0", ExplicitFieldAccess.class);
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
-
+ // good
}
- ManagedType<ImplicitFieldAccessSubclass> e1 = model.entity(
- ImplicitFieldAccessSubclass.class);
+ ManagedType<ImplicitFieldAccessSubclass> e1 = model.entity(ImplicitFieldAccessSubclass.class);
assertNotNull(e1.getAttribute("f0"));
-
}
public void testAttributeByDeclaration() {
- ManagedType<ImplicitFieldAccessBase> e0 =
- model.entity(ImplicitFieldAccessBase.class);
- ManagedType<ImplicitFieldAccessSubclass> e1 =
- model.entity(ImplicitFieldAccessSubclass.class);
+ ManagedType<ImplicitFieldAccessBase> e0 = model.entity(ImplicitFieldAccessBase.class);
+ ManagedType<ImplicitFieldAccessSubclass> e1 = model.entity(ImplicitFieldAccessSubclass.class);
assertNotNull(e0.getAttribute("f0"));
assertNotNull(e1.getAttribute("f0"));
System.err.println(e0.getAttribute("f0"));
@@ -151,14 +145,13 @@
assertSame(e0.getAttribute("f0"), e0.getSingularAttribute("f0", String.class));
assertSame(e1.getAttribute("f0"), e1.getSingularAttribute("f0", String.class));
assertNotSame(e0.getAttribute("f0"), e1.getAttribute("f0"));
- assertNotSame(e0.getSingularAttribute("f0", String.class), e1.getSingularAttribute("f0",
- String.class));
+ assertNotSame(e0.getSingularAttribute("f0", String.class), e1.getSingularAttribute("f0", String.class));
assertNotNull(e0.getDeclaredAttribute("f0"));
try {
e1.getDeclaredAttribute("f0");
fail("Expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
-
+ // good
}
}
@@ -189,10 +182,8 @@
}
public void testPCSet() {
- ManagedType<ImplicitFieldAccessBase> e0 =
- model.entity(ImplicitFieldAccessBase.class);
- ManagedType<ExplicitFieldAccess> r1 =
- model.entity(ExplicitFieldAccess.class);
+ ManagedType<ImplicitFieldAccessBase> e0 = model.entity(ImplicitFieldAccessBase.class);
+ ManagedType<ExplicitFieldAccess> r1 = model.entity(ExplicitFieldAccess.class);
SetAttribute<?, ?> relSet = e0.getSet("setRelation", ExplicitFieldAccess.class);
assertEquals(javax.persistence.metamodel.PluralAttribute.CollectionType.SET, relSet.getCollectionType());
assertEquals(e0, relSet.getDeclaringType());
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java Tue Jun 30 13:40:17 2009
@@ -18,7 +18,7 @@
*/
package org.apache.openjpa.persistence;
-import javax.persistence.ResultItem;
+import javax.persistence.TupleElement;
/**
* A single dimension of projection in query result.
@@ -27,9 +27,9 @@
*
* @param <X> type of the result
*/
-public class ResultItemImpl<X> implements ResultItem<X> {
+public class ResultItemImpl<X> implements TupleElement<X> {
protected String _alias;
- protected Class<X> _cls;
+ protected final Class<X> _cls;
protected ResultItemImpl(Class<X> cls) {
_cls = cls;
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java Tue Jun 30 13:40:17 2009
@@ -89,7 +89,7 @@
* @return query object
*/
public <T> CriteriaQuery<T> createQuery(Class<T> resultClass) {
- throw new UnsupportedOperationException();
+ return new CriteriaQueryImpl<T>(_model, resultClass);
}
/**
@@ -98,7 +98,7 @@
* @return query object
*/
public CriteriaQuery<Tuple> createTupleQuery() {
- throw new UnsupportedOperationException();
+ return new CriteriaQueryImpl<Tuple>(_model, Tuple.class);
}
public Object parse(String ql, ExpressionStoreQuery query) {
@@ -106,22 +106,12 @@
}
public void populate(Object parsed, ExpressionStoreQuery query) {
- CriteriaQueryImpl c = (CriteriaQueryImpl) parsed;
+ CriteriaQueryImpl<?> c = (CriteriaQueryImpl<?>) parsed;
query.invalidateCompilation();
query.getContext().setCandidateType(c.getRoot().getJavaType(), true);
query.setQuery(parsed);
}
- /**
- * Define a select list item corresponding to a constructor.
- * @param result class whose instance is to be constructed
- * @param selections arguments to the constructor
- * @return selection item
- */
- public <Y> Selection<Y> construct(Class<Y> result, Selection<?>... selections) {
- throw new UnsupportedOperationException();
- }
-
public <N extends Number> Expression<N> abs(Expression<N> x) {
return new Expressions.Abs<N>(x);
}
@@ -199,8 +189,8 @@
return new Expressions.Count(x, true);
}
- public CriteriaQuery createQuery() {
- return new CriteriaQueryImpl(_model);
+ public CriteriaQuery<Object> createQuery() {
+ return new CriteriaQueryImpl<Object>(_model, Object.class);
}
public Expression<Date> currentDate() {
@@ -305,8 +295,7 @@
return new Expressions.In<T>(expression);
}
- public <C extends Collection<?>> Predicate isEmpty(
- Expression<C> collection) {
+ public <C extends Collection<?>> Predicate isEmpty(Expression<C> collection) {
return new Expressions.IsEmpty(collection);
}
@@ -314,28 +303,23 @@
return new Expressions.Equal(x, false);
}
- public <E, C extends Collection<E>> Predicate isMember(E e,
- Expression<C> c) {
+ public <E, C extends Collection<E>> Predicate isMember(E e, Expression<C> c) {
return new Expressions.IsMember<E>(e, c);
}
- public <E, C extends Collection<E>> Predicate isMember(Expression<E> e,
- Expression<C> c) {
+ public <E, C extends Collection<E>> Predicate isMember(Expression<E> e, Expression<C> c) {
return new Expressions.IsMember<E>(e.getJavaType(), e, c);
}
- public <C extends Collection<?>> Predicate isNotEmpty(
- Expression<C> collection) {
- return isEmpty(collection).negate();
+ public <C extends Collection<?>> Predicate isNotEmpty(Expression<C> collection) {
+ return new Expressions.IsNotEmpty(collection);
}
- public <E, C extends Collection<E>> Predicate isNotMember(E e,
- Expression<C> c) {
+ public <E, C extends Collection<E>> Predicate isNotMember(E e, Expression<C> c) {
return isMember(e, c).negate();
}
- public <E, C extends Collection<E>> Predicate isNotMember(
- Expression<E> e, Expression<C> c) {
+ public <E, C extends Collection<E>> Predicate isNotMember(Expression<E> e, Expression<C> c) {
return isMember(e, c).negate();
}
@@ -347,8 +331,7 @@
throw new AbstractMethodError();
}
- public Predicate le(Expression<? extends Number> x,
- Expression<? extends Number> y) {
+ public Predicate le(Expression<? extends Number> x, Expression<? extends Number> y) {
return new Expressions.LessThanEqual(x,y);
}
@@ -365,24 +348,20 @@
}
- public <Y extends Comparable<Y>> Predicate lessThan(
- Expression<? extends Y> x, Expression<? extends Y> y) {
+ public <Y extends Comparable<Y>> Predicate lessThan(Expression<? extends Y> x, Expression<? extends Y> y) {
return new Expressions.LessThan(x,y);
}
- public <Y extends Comparable<Y>> Predicate lessThan(
- Expression<? extends Y> x, Y y) {
+ public <Y extends Comparable<Y>> Predicate lessThan(Expression<? extends Y> x, Y y) {
return new Expressions.LessThan(x,y);
}
- public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(
- Expression<? extends Y> x, Expression<? extends Y> y) {
+ public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(Expression<? extends Y> x, Expression<? extends Y> y) {
return new Expressions.LessThanEqual(x,y);
}
- public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(
- Expression<? extends Y> x, Y y) {
+ public <Y extends Comparable<Y>> Predicate lessThanOrEqualTo(Expression<? extends Y> x, Y y) {
return new Expressions.LessThanEqual(x,y);
}
@@ -394,23 +373,19 @@
return new Expressions.Like(x,pattern);
}
- public Predicate like(Expression<String> x, Expression<String> pattern,
- Expression<Character> escapeChar) {
+ public Predicate like(Expression<String> x, Expression<String> pattern, Expression<Character> escapeChar) {
return new Expressions.Like(x,pattern,escapeChar);
}
- public Predicate like(Expression<String> x, Expression<String> pattern,
- char escapeChar) {
+ public Predicate like(Expression<String> x, Expression<String> pattern, char escapeChar) {
return new Expressions.Like(x,pattern,escapeChar);
}
- public Predicate like(Expression<String> x, String pattern,
- Expression<Character> escapeChar) {
+ public Predicate like(Expression<String> x, String pattern, Expression<Character> escapeChar) {
return new Expressions.Like(x,pattern,escapeChar);
}
- public Predicate like(Expression<String> x, String pattern,
- char escapeChar) {
+ public Predicate like(Expression<String> x, String pattern, char escapeChar) {
return new Expressions.Like(x,pattern,escapeChar);
}
@@ -418,8 +393,7 @@
return new Expressions.Constant<T>(value);
}
- public Expression<Integer> locate(Expression<String> x,
- Expression<String> pattern) {
+ public Expression<Integer> locate(Expression<String> x, Expression<String> pattern) {
return new Expressions.Locate(x, pattern);
}
@@ -428,14 +402,12 @@
}
- public Expression<Integer> locate(Expression<String> x,
- Expression<String> pattern, Expression<Integer> from) {
+ public Expression<Integer> locate(Expression<String> x, Expression<String> pattern, Expression<Integer> from) {
return new Expressions.Locate(x, pattern, from);
}
- public Expression<Integer> locate(Expression<String> x, String pattern,
- int from) {
+ public Expression<Integer> locate(Expression<String> x, String pattern, int from) {
return new Expressions.Locate(x, pattern, from);
}
@@ -445,8 +417,7 @@
}
- public Predicate lt(Expression<? extends Number> x,
- Expression<? extends Number> y) {
+ public Predicate lt(Expression<? extends Number> x, Expression<? extends Number> y) {
return new Expressions.LessThan(x,y);
}
@@ -462,8 +433,7 @@
return new Expressions.Min<N>(x);
}
- public Expression<Integer> mod(Expression<Integer> x,
- Expression<Integer> y) {
+ public Expression<Integer> mod(Expression<Integer> x, Expression<Integer> y) {
return new Expressions.Mod(x,y);
}
@@ -499,23 +469,19 @@
return like(x, pattern).negate();
}
- public Predicate notLike(Expression<String> x, Expression<String> pattern,
- Expression<Character> escapeChar) {
+ public Predicate notLike(Expression<String> x, Expression<String> pattern, Expression<Character> escapeChar) {
return like(x, pattern, escapeChar).negate();
}
- public Predicate notLike(Expression<String> x, Expression<String> pattern,
- char escapeChar) {
+ public Predicate notLike(Expression<String> x, Expression<String> pattern, char escapeChar) {
return like(x, pattern, escapeChar).negate();
}
- public Predicate notLike(Expression<String> x, String pattern,
- Expression<Character> escapeChar) {
+ public Predicate notLike(Expression<String> x, String pattern, Expression<Character> escapeChar) {
return like(x, pattern, escapeChar).negate();
}
- public Predicate notLike(Expression<String> x, String pattern,
- char escapeChar) {
+ public Predicate notLike(Expression<String> x, String pattern, char escapeChar) {
return like(x, pattern, escapeChar).negate();
}
@@ -546,23 +512,19 @@
return new ParameterImpl<T>(paramClass, name);
}
- public <N extends Number> Expression<N> prod(Expression<? extends N> x,
- Expression<? extends N> y) {
+ public <N extends Number> Expression<N> prod(Expression<? extends N> x, Expression<? extends N> y) {
return new Expressions.Product<N>(x,y);
}
- public <N extends Number> Expression<N> prod(Expression<? extends N> x,
- N y) {
+ public <N extends Number> Expression<N> prod(Expression<? extends N> x, N y) {
return new Expressions.Product<N>(x,y);
}
- public <N extends Number> Expression<N> prod(N x,
- Expression<? extends N> y) {
+ public <N extends Number> Expression<N> prod(N x, Expression<? extends N> y) {
return new Expressions.Product<N>(x,y);
}
- public Expression<Number> quot(Expression<? extends Number> x,
- Expression<? extends Number> y) {
+ public Expression<Number> quot(Expression<? extends Number> x, Expression<? extends Number> y) {
return new Expressions.Quotient<Number>(x,y);
}
@@ -574,17 +536,21 @@
return new Expressions.Quotient<Number>(x,y);
}
- public <Y> Selection<Y> select(Class<Y> result,
- Selection<?>... selections) {
- return new SelectionImpl(result).setSelections(selections);
+ /**
+ * Define a select list item corresponding to a constructor.
+ * @param result class whose instance is to be constructed
+ * @param selections arguments to the constructor
+ * @return selection item
+ */
+ public <Y> Selection<Y> construct(Class<Y> result, Selection<?>... selections) {
+ return new NewInstanceSelection<Y>(result, selections);
}
public <R> Case<R> selectCase() {
return new Expressions.Case();
}
- public <C, R> SimpleCase<C, R> selectCase(
- Expression<? extends C> expression) {
+ public <C, R> SimpleCase<C, R> selectCase(Expression<? extends C> expression) {
return new Expressions.SimpleCase(expression);
}
@@ -592,8 +558,7 @@
return new Expressions.Size(collection);
}
- public <C extends Collection<?>> Expression<Integer> size(
- Expression<C> collection) {
+ public <C extends Collection<?>> Expression<Integer> size(Expression<C> collection) {
return new Expressions.Size(collection);
}
@@ -606,8 +571,7 @@
return new Expressions.Sqrt(x);
}
- public Expression<String> substring(Expression<String> x,
- Expression<Integer> from) {
+ public Expression<String> substring(Expression<String> x, Expression<Integer> from) {
return new Expressions.Substring(x, from);
}
@@ -615,13 +579,11 @@
return new Expressions.Substring(x, from);
}
- public Expression<String> substring(Expression<String> x,
- Expression<Integer> from, Expression<Integer> len) {
+ public Expression<String> substring(Expression<String> x, Expression<Integer> from, Expression<Integer> len) {
return new Expressions.Substring(x, from, len);
}
- public Expression<String> substring(Expression<String> x, int from,
- int len) {
+ public Expression<String> substring(Expression<String> x, int from, int len) {
return new Expressions.Substring(x, from, len);
}
@@ -629,28 +591,23 @@
return new Expressions.Sum<N>(x);
}
- public <N extends Number> Expression<N> sum(Expression<? extends N> x,
- Expression<? extends N> y) {
+ public <N extends Number> Expression<N> sum(Expression<? extends N> x, Expression<? extends N> y) {
return new Expressions.Sum<N>(x,y);
}
- public <N extends Number> Expression<N> sum(Expression<? extends N> x,
- N y) {
+ public <N extends Number> Expression<N> sum(Expression<? extends N> x, N y) {
return new Expressions.Sum<N>(x,y);
}
- public <N extends Number> Expression<N> sum(N x,
- Expression<? extends N> y) {
+ public <N extends Number> Expression<N> sum(N x, Expression<? extends N> y) {
return new Expressions.Sum<N>(x,y);
}
- public Expression<BigDecimal> toBigDecimal(
- Expression<? extends Number> number) {
+ public Expression<BigDecimal> toBigDecimal(Expression<? extends Number> number) {
return new Expressions.Cast<BigDecimal>(number, BigDecimal.class);
}
- public Expression<BigInteger> toBigInteger(
- Expression<? extends Number> number) {
+ public Expression<BigInteger> toBigInteger(Expression<? extends Number> number) {
return new Expressions.Cast<BigInteger>(number, BigInteger.class);
}
@@ -682,8 +639,7 @@
return new Expressions.Trim(x, ts);
}
- public Expression<String> trim(Expression<Character> t,
- Expression<String> x) {
+ public Expression<String> trim(Expression<Character> t, Expression<String> x) {
return new Expressions.Trim(x, t);
}
@@ -691,8 +647,7 @@
return new Expressions.Trim(x, t);
}
- public Expression<String> trim(Trimspec ts, Expression<Character> t,
- Expression<String> x) {
+ public Expression<String> trim(Trimspec ts, Expression<Character> t, Expression<String> x) {
return new Expressions.Trim(x, t, ts);
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java Tue Jun 30 13:40:17 2009
@@ -87,16 +87,14 @@
Class<?> cls = join.getAttribute().getJavaType();
if (join.getAttribute().isAssociation()) {
ClassMetaData meta = metamodel.repos.getMetaData(cls, null, true);
- PersistenceType type = metamodel.getPersistenceType(meta);
+ PersistenceType type = MetamodelImpl.getPersistenceType(meta);
if (type == PersistenceType.ENTITY || type == PersistenceType.EMBEDDABLE)
metas.add(meta);
}
}
if (root.getFetches() != null) {
for (Fetch<?,?> fetch : root.getFetches()) {
- metas.add(metamodel.repos.getMetaData(
- fetch.getAttribute().getJavaType(),
- null, false));
+ metas.add(metamodel.repos.getMetaData(fetch.getAttribute().getJavaType(), null, false));
}
}
}
@@ -140,12 +138,10 @@
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, q);;
+ exps.grouping[i] = Expressions.toValue((ExpressionImpl<?>)groupBy, factory, model, q);;
}
- exps.having = having == null ? factory.emptyExpression()
- : having.toKernelExpression(factory, model, q);
+ exps.having = having == null ? factory.emptyExpression() : having.toKernelExpression(factory, model, q);
}
protected void evalDistinct(QueryExpressions exps, ExpressionFactory factory, CriteriaQueryImpl<?> q) {
@@ -170,8 +166,7 @@
for (Root<?> root : roots) {
if (root.getJoins() != null) {
for (Join<?, ?> join : root.getJoins()) {
- filter = and(factory, ((ExpressionImpl<?>)join)
- .toKernelExpression(factory, model, q), filter);
+ filter = and(factory, ((ExpressionImpl<?>)join).toKernelExpression(factory, model, q), filter);
}
}
((RootImpl<?>)root).addToContext(factory, model, q);
@@ -181,17 +176,17 @@
List<Join<?,?>> corrJoins = subQuery.getCorrelatedJoins();
if (corrJoins != null) {
for (int i = 0; i < corrJoins.size(); i++)
- filter = and(factory, ((ExpressionImpl<?>)corrJoins.get(i))
- .toKernelExpression(factory, model, q), filter);
+ filter = and(factory, ((ExpressionImpl<?>)corrJoins.get(i)).toKernelExpression(factory, model, q),
+ filter);
}
}
if (where != null) {
- filter = and(factory, where.toKernelExpression
- (factory, model, q), filter);
+ filter = and(factory, where.toKernelExpression(factory, model, q), filter);
}
- if (filter == null)
+ if (filter == null) {
filter = factory.emptyExpression();
+ }
exps.filter = filter;
}
@@ -207,27 +202,23 @@
exps.projections = new Value[selections.size()];
List<Value> projections = new ArrayList<Value>();
List<String> aliases = new ArrayList<String>();
- getProjections(exps, selections, projections, aliases, factory, q,
- model);
- exps.projections = projections.toArray(new Value[0]);
- exps.projectionAliases = aliases.toArray(new String[0]);
+ getProjections(exps, selections, projections, aliases, factory, q, model);
+ exps.projections = projections.toArray(new Value[projections.size()]);
+ exps.projectionAliases = aliases.toArray(new String[aliases.size()]);
}
- private void getProjections(QueryExpressions exps,
- List<Selection<?>> selections, List projections, List<String> aliases,
+ private void getProjections(QueryExpressions exps, List<Selection<?>> selections,
+ List<Value> projections, List<String> aliases,
ExpressionFactory factory, CriteriaQueryImpl<?> q, MetamodelImpl model) {
for (Selection<?> s : selections) {
- List<Selection<?>> sels = ((SelectionImpl)s).getSelections();
- if (sels == null) {
- projections.add(((ExpressionImpl<?>)s).
- toValue(factory, model, q));
- aliases.add(q.getAlias(s));
- } else {
- // this is for constructor expression in the selection
+ if (s instanceof NewInstanceSelection<?>) {
exps.resultClass = s.getJavaType();
- getProjections(exps, sels, projections, aliases, factory, q,
- model);
- }
+ getProjections(exps, ((NewInstanceSelection)s).getConstructorArguments(), projections, aliases,
+ factory, q, model);
+ } else {
+ projections.add(((ExpressionImpl<?>)s).toValue(factory, model, q));
+ aliases.add(q.getAlias(s));
+ }
}
}
@@ -269,10 +260,8 @@
exps.fetchPaths = oPaths.toArray(new String[oPaths.size()]);
}
- protected static org.apache.openjpa.kernel.exps.Expression and (
- ExpressionFactory factory,
- org.apache.openjpa.kernel.exps.Expression e1,
- org.apache.openjpa.kernel.exps.Expression e2) {
+ protected static org.apache.openjpa.kernel.exps.Expression and (ExpressionFactory factory,
+ org.apache.openjpa.kernel.exps.Expression e1, org.apache.openjpa.kernel.exps.Expression e2) {
return e1 == null ? e2 : e2 == null ? e1 : factory.and(e1, e2);
}
}
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=789723&r1=789722&r2=789723&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 Tue Jun 30 13:40:17 2009
@@ -71,6 +71,7 @@
private List<Subquery<?>> _subqueries;
private Boolean _distinct;
private SubqueryImpl<?> _delegator;
+ private final Class<T> _resultClass;
// AliasContext
private int aliasCount = 0;
@@ -85,13 +86,15 @@
// SubqueryContext
//private Stack<Context> _contexts = null;
- public CriteriaQueryImpl(MetamodelImpl model) {
+ public CriteriaQueryImpl(MetamodelImpl model, Class<T> resultClass) {
this._model = model;
+ this._resultClass = resultClass;
_aliases = new HashMap<Selection<?>, String>();
}
- public CriteriaQueryImpl(MetamodelImpl model, SubqueryImpl<?> delegator) {
+ public CriteriaQueryImpl(MetamodelImpl model, SubqueryImpl<T> delegator) {
this._model = model;
+ this._resultClass = delegator.getJavaType();
_delegator = delegator;
_aliases = getAliases();
}
@@ -112,7 +115,7 @@
// return _contexts;
//}
- public CriteriaQuery distinct(boolean distinct) {
+ public CriteriaQuery<T> distinct(boolean distinct) {
_distinct = distinct;
return this;
}
@@ -171,7 +174,7 @@
* @return the modified query
*/
public CriteriaQuery<T> multiselect(Selection<?>... selections) {
- throw new AbstractMethodError();
+ return select(selections);
}
/**
@@ -200,26 +203,26 @@
return _selections;
}
- public CriteriaQuery groupBy(Expression<?>... grouping) {
+ public CriteriaQuery<T> groupBy(Expression<?>... grouping) {
_groups = new ArrayList<Expression<?>>();
for (Expression<?> e : grouping)
_groups.add(e);
return this;
}
- public CriteriaQuery having(Expression<Boolean> restriction) {
+ public CriteriaQuery<T> having(Expression<Boolean> restriction) {
_having = new PredicateImpl().add(restriction);
return this;
}
- public CriteriaQuery having(Predicate... restrictions) {
+ public CriteriaQuery<T> having(Predicate... restrictions) {
_having = new PredicateImpl();
for (Predicate p : restrictions)
_having.add(p);
return this;
}
- public CriteriaQuery orderBy(Order... o) {
+ public CriteriaQuery<T> orderBy(Order... o) {
_orders = Arrays.asList(o);
return this;
}
@@ -232,7 +235,7 @@
* @return the modified query
*/
public CriteriaQuery<T> select(Selection<T> selection) {
- throw new AbstractMethodError();
+ return select(new Selection<?>[]{selection});
}
public CriteriaQuery<T> select(Selection<?>... selections) {
@@ -348,18 +351,18 @@
// _contexts = contexts;
//}
- public CriteriaQueryImpl getInnermostParent() {
+ public CriteriaQueryImpl<?> getInnermostParent() {
if (_delegator == null)
return this;
- AbstractQuery parent = _delegator.getParent();
+ AbstractQuery<?> parent = _delegator.getParent();
if (parent instanceof CriteriaQueryImpl)
- return (CriteriaQueryImpl)parent;
+ return (CriteriaQueryImpl<?>)parent;
// parent is a SubqueryImpl
- return ((SubqueryImpl)parent).getDelegate().getInnermostParent();
+ return ((SubqueryImpl<?>)parent).getDelegate().getInnermostParent();
}
public Map<Selection<?>,String> getAliases() {
- CriteriaQueryImpl c = getInnermostParent();
+ CriteriaQueryImpl<?> c = getInnermostParent();
if (c._aliases == null)
c._aliases = new HashMap<Selection<?>, String>();
return c._aliases;
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java Tue Jun 30 13:40:17 2009
@@ -27,6 +27,7 @@
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.Value;
+import org.apache.openjpa.persistence.ResultItemImpl;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
/**
@@ -36,13 +37,14 @@
*
* @param <X> the type of the value this expression represents.
*/
-public class ExpressionImpl<X> extends SelectionImpl<X>
+public abstract class ExpressionImpl<X> extends ResultItemImpl<X>
implements Expression<X> {
- Value toValue(ExpressionFactory factory, MetamodelImpl model,
- CriteriaQueryImpl<?> q) {
- throw new AbstractMethodError(this.getClass().getName());
- }
+ abstract Value toValue(ExpressionFactory factory, MetamodelImpl model,
+ CriteriaQueryImpl<?> q);
+// {
+// throw new AbstractMethodError(this.getClass().getName());
+// }
org.apache.openjpa.kernel.exps.Expression toKernelExpression(
ExpressionFactory factory, MetamodelImpl model,
@@ -65,7 +67,7 @@
* @return expression
*/
public <Y> Expression<Y> as(Class<Y> type) {
- throw new AbstractMethodError();
+ return new Expressions.CastAs<Y>(type, this);
}
/**
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Tue Jun 30 13:40:17 2009
@@ -62,7 +62,7 @@
*
* @param <X> the type of the resultant expression
*/
- public static class UnaryFunctionalExpression<X>
+ public abstract static class UnaryFunctionalExpression<X>
extends ExpressionImpl<X> {
protected ExpressionImpl<?> e;
@@ -83,7 +83,7 @@
*
* @param <X> the type of the resultant expression
*/
- public static class BinarayFunctionalExpression<X>
+ public abstract static class BinarayFunctionalExpression<X>
extends ExpressionImpl<X>{
protected ExpressionImpl<?> e1;
protected ExpressionImpl<?> e2;
@@ -241,6 +241,7 @@
return factory.cast(Expressions.toValue(e, factory, model, q), b);
}
}
+
public static class Concat extends BinarayFunctionalExpression<String> {
public Concat(Expression<String> x, Expression<String> y) {
super(String.class, x, y);
@@ -758,6 +759,29 @@
}
}
+ public static class IsNotEmpty extends PredicateImpl {
+ ExpressionImpl<?> collection;
+ public IsNotEmpty(Expression<?> collection) {
+ super();
+ this.collection = (ExpressionImpl<?>)collection;
+ }
+
+ @Override
+ public PredicateImpl clone() {
+ return new IsNotEmpty(collection);
+ }
+
+ @Override
+ public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+ ExpressionFactory factory, MetamodelImpl model,
+ CriteriaQueryImpl<?> q) {
+ Value val = Expressions.toValue(collection, factory, model, q);
+ return (isNegated())
+ ? factory.isEmpty(val) : factory.isNotEmpty(val);
+ }
+ }
+
+
public static class Index extends UnaryFunctionalExpression<Integer> {
public Index(Joins.List<?,?> e) {
super(Integer.class, e);
@@ -1262,5 +1286,21 @@
return factory.not(super.toKernelExpression(factory, model, q));
}
}
+
+ public static class CastAs<Y> extends ExpressionImpl<Y> {
+ protected final ExpressionImpl<?> actual;
+ public CastAs(Class<Y> cast, ExpressionImpl<?> actual) {
+ super(cast);
+ this.actual = actual;
+ }
+
+ @Override
+ public org.apache.openjpa.kernel.exps.Value toValue(
+ ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
+ org.apache.openjpa.kernel.exps.Value e = actual.toValue(factory, model, q);
+ e.setImplicitType(getJavaType());
+ return e;
+ }
+ }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FetchPathImpl.java Tue Jun 30 13:40:17 2009
@@ -47,8 +47,7 @@
this(parent, member, JoinType.INNER);
}
- FetchPathImpl(FetchParent<?,Z> parent, Members.Member<? super Z,X> member,
- JoinType type) {
+ FetchPathImpl(FetchParent<?,Z> parent, Members.Member<? super Z,X> member, JoinType type) {
super((PathImpl<?,Z>)parent, member, member.getJavaType());
this.joinType = type;
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java Tue Jun 30 13:40:17 2009
@@ -38,6 +38,7 @@
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.meta.ClassMetaData;
+import org.apache.openjpa.meta.FieldMetaData;
import org.apache.openjpa.persistence.meta.Members;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
import org.apache.openjpa.persistence.meta.Members.Member;
@@ -56,7 +57,7 @@
* @param <Z> type from which joining
* @param <X> type of the attribute being joined
*/
- public static class SingularJoin<Z,X> extends FromImpl<Z,X> implements Join<Z,X>{
+ public static class SingularJoin<Z,X> extends FromImpl<Z,X> implements Join<Z,X> {
private final JoinType joinType;
private boolean allowNull = false;
@@ -448,11 +449,7 @@
MetamodelImpl model, CriteriaQueryImpl<?> c) {
org.apache.openjpa.kernel.exps.Value path = toValue(factory, model, c);
- ClassMetaData meta = _member.fmd.isElementCollection()
- ? _member.fmd.getEmbeddedMetaData()
- : _member.fmd.getElement().getDeclaredTypeMetaData();
-
- Value var = factory.newBoundVariable(c.getAlias(this), meta.getDescribedType());
+ Value var = factory.newBoundVariable(c.getAlias(this), _member.fmd.getElement().getDeclaredType());
org.apache.openjpa.kernel.exps.Expression join = factory.bindValueVariable(var, path);
c.registerVariable(this, var, path);
return join;
Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java?rev=789723&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java Tue Jun 30 13:40:17 2009
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.criteria;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.persistence.criteria.Selection;
+
+import org.apache.openjpa.persistence.ResultItemImpl;
+
+/**
+ * A selection item that constructs new instance of a user-defined class with arguments specified as other selected
+ * items.
+ *
+ * @author Pinaki Poddar
+ *
+ * @param <X>
+ */
+public class NewInstanceSelection<X> extends ResultItemImpl<X>
+ implements Selection<X> {
+
+ private List<Selection<?>> _args;
+
+ public NewInstanceSelection(Class<X> cls, Selection<?>... selections) {
+ super(cls);
+ _args = Arrays.asList(selections);
+ }
+
+ public List<Selection<?>> getConstructorArguments() {
+ return _args;
+ }
+}
Propchange: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/NewInstanceSelection.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ParameterImpl.java Tue Jun 30 13:40:17 2009
@@ -36,7 +36,7 @@
*
* @param <T> the type of value held by this parameter.
*/
-public class ParameterImpl<T> extends ExpressionImpl<T> implements ParameterExpression<T>{
+public class ParameterImpl<T> extends ExpressionImpl<T> implements ParameterExpression<T> {
private String name;
private Integer position;
@@ -58,11 +58,9 @@
}
@Override
- public Value toValue(ExpressionFactory factory, MetamodelImpl model,
- CriteriaQueryImpl<?> q) {
+ public Value toValue(ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
q.registerParameter(this);
-
ClassMetaData meta = null;
Class<?> clzz = getJavaType();
Object paramKey = getKey();
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java Tue Jun 30 13:40:17 2009
@@ -29,6 +29,7 @@
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.Type;
+import javax.persistence.metamodel.Type.PersistenceType;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.Value;
@@ -43,8 +44,9 @@
* @param <X> Type referenced by the path
*/
/**
- * Path is an expression often representing a persistent member traversed
- * from another (parent) path.
+ * Path is an expression often representing a persistent attribute traversed from another (parent) path.
+ * The type of the path is the type of the persistent attribute.
+ * If the persistent attribute is bindable, then further path can be travesered from this path.
*
* @author Pinaki Poddar
* @author Fay Wang
@@ -59,8 +61,7 @@
protected PathImpl<?,?> _correlatedPath;
/**
- * Protected. use by root path which neither represent a member nor has a
- * parent.
+ * Protected constructor use by root path which neither represent a member nor has a parent.
*/
protected PathImpl(Class<X> cls) {
super(cls);
@@ -69,12 +70,10 @@
}
/**
- * Create a path from the given non-null parent representing the the given
- * non-null member. The given class denotes the type expressed by this
- * path.
+ * Create a path from the given non-null parent representing the given non-null member. The given class denotes
+ * the type expressed by this path.
*/
- public PathImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> member,
- Class<X> cls) {
+ public PathImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> member, Class<X> cls) {
super(cls);
_parent = parent;
if (_parent.isEmbedded) {
@@ -91,6 +90,9 @@
*
*/
public Bindable<X> getModel() {
+ if (_member instanceof Bindable<?> == false) {
+ throw new IllegalArgumentException(this + " represents a basic path and not a bindable");
+ }
return (Bindable<X>)_member;
}
@@ -101,6 +103,9 @@
return _parent;
}
+ /**
+ * Gets the path that originates this traversal. Can be itself if this itself is the origin.
+ */
public PathImpl<?,?> getInnermostParentPath() {
return (_parent == null) ? this : _parent.getInnermostParentPath();
}
@@ -115,13 +120,13 @@
}
protected Members.Member<?,?> getInnermostMember(PathImpl<?,?> parent, Members.Member<?,?> member) {
- return member != null ? member : getInnermostMember(parent._parent,
- parent._member);
+ return member != null ? member : getInnermostMember(parent._parent, parent._member);
}
public void setCorrelatedPath(PathImpl<?,?> correlatedPath) {
_correlatedPath = correlatedPath;
}
+
public PathImpl<?,?> getCorrelatedPath() {
return _correlatedPath;
}
@@ -130,8 +135,7 @@
* Convert this path to a kernel path.
*/
@Override
- public Value toValue(
- ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
+ public Value toValue(ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
if (q.isRegistered(this))
return q.getValue(this);
org.apache.openjpa.kernel.exps.Path path = null;
@@ -151,8 +155,7 @@
//path.setSchemaAlias(q.getAlias(_parent));
traversePath(_parent, path, _member.fmd);
} else if (_parent != null) {
- path = (org.apache.openjpa.kernel.exps.Path)
- _parent.toValue(factory, model, q);
+ path = (org.apache.openjpa.kernel.exps.Path)_parent.toValue(factory, model, q);
path.get(_member.fmd, allowNull);
} else if (_parent == null) {
path = factory.newPath();
@@ -206,48 +209,41 @@
}
/**
- * Return the path corresponding to the referenced
- * single-valued attribute.
- * @param atttribute single-valued attribute
- * @return path corresponding to the referenced attribute
- */
- /**
- * Create a new path with this path as parent.
+ * Gets a new path that represents the given single-valued attribute from this path.
*/
public <Y> Path<Y> get(SingularAttribute<? super X, Y> attr) {
- return new PathImpl<X,Y>(this, (Members.SingularAttributeImpl<? super X, Y>)attr,
- attr.getJavaType());
+ return new PathImpl<X,Y>(this, (Members.SingularAttributeImpl<? super X, Y>)attr, attr.getJavaType());
}
/**
- * Return the path corresponding to the referenced
- * collection-valued attribute.
- * @param collection collection-valued attribute
- * @return expression corresponding to the referenced attribute
+ * Gets a new path that represents the given multi-valued attribute from this path.
*/
public <E, C extends java.util.Collection<E>> Expression<C> get(PluralAttribute<X, C, E> coll) {
- return new PathImpl<X,C>(this, (Members.Member<? super X, C>)coll, coll.getJavaType());
+ return new PathImpl<X,C>(this, (Members.PluralAttributeImpl<? super X, C, E>)coll, coll.getJavaType());
}
/**
- * Return the path corresponding to the referenced
- * map-valued attribute.
- * @param map map-valued attribute
- * @return expression corresponding to the referenced attribute
+ * Gets a new path that represents the given map-valued attribute from this path.
*/
public <K, V, M extends java.util.Map<K, V>> Expression<M> get(MapAttribute<X, K, V> map) {
return new PathImpl<X,M>(this, (Members.MapAttributeImpl<? super X,K,V>)map, (Class<M>)map.getJavaType());
}
+ /**
+ * Gets a new path that represents the attribute of the given name from this path.
+ *
+ * @exception IllegalArgumentException if this path represents a basic attribute that is can not be traversed
+ * further.
+ */
public <Y> Path<Y> get(String attName) {
- Members.Member<? super X, Y> next = null;
Type<?> type = _member.getType();
- switch (type.getPersistenceType()) {
- case BASIC:
- throw new RuntimeException(attName + " not navigable from " + this);
- default: next = (Members.Member<? super X, Y>) ((ManagedType<?>)type).getAttribute(attName);
+ if (type.getPersistenceType() == PersistenceType.BASIC) {
+ throw new IllegalArgumentException(this + " is a basic path and can not be navigated to " + attName);
}
- return new PathImpl<X,Y>(this, next, (Class<Y>)type.getClass());
+
+ Members.Member<? super X, Y> next = (Members.Member<? super X, Y>)
+ ((ManagedType<? super X>)type).getAttribute(attName);
+ return new PathImpl<X,Y>(this, next, next.getJavaType());
}
/**
@@ -255,5 +251,5 @@
*/
public Expression<Class<? extends X>> type() {
return new Expressions.Type<X>(this);
- }
+}
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java Tue Jun 30 13:40:17 2009
@@ -27,10 +27,9 @@
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
-public class PredicateImpl extends ExpressionImpl<Boolean>
-implements Predicate {
+public class PredicateImpl extends ExpressionImpl<Boolean> implements Predicate {
List<Expression<Boolean>> _exps;
- BooleanOperator _op;
+ BooleanOperator _op = BooleanOperator.AND;
boolean _negated = false;
protected PredicateImpl() {
@@ -81,33 +80,36 @@
clone._exps = new ArrayList<Expression<Boolean>>(this._exps);
return clone;
}
-
+
@Override
- org.apache.openjpa.kernel.exps.Expression toKernelExpression(
- ExpressionFactory factory, MetamodelImpl model,
+ org.apache.openjpa.kernel.exps.Value toValue(ExpressionFactory factory, MetamodelImpl model,
+ CriteriaQueryImpl<?> q) {
+ throw new AbstractMethodError();
+ }
+
+ @Override
+ org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, MetamodelImpl model,
CriteriaQueryImpl<?> q) {
if (_exps == null || _exps.isEmpty())
return factory.emptyExpression();
+
if (_exps.size() == 1)
- return ((ExpressionImpl<?>)_exps.get(0))
- .toKernelExpression(factory, model, q);
+ return ((ExpressionImpl<?>)_exps.get(0)).toKernelExpression(factory, model, q);
+
ExpressionImpl<?> e1 = (ExpressionImpl<?>)_exps.get(0);
ExpressionImpl<?> e2 = (ExpressionImpl<?>)_exps.get(1);
- org.apache.openjpa.kernel.exps.Expression ke1 =
- e1.toKernelExpression(factory, model, q);
- org.apache.openjpa.kernel.exps.Expression ke2 =
- e2.toKernelExpression(factory, model, q);
- org.apache.openjpa.kernel.exps.Expression result =
- _op == BooleanOperator.AND
+ org.apache.openjpa.kernel.exps.Expression ke1 = e1.toKernelExpression(factory, model, q);
+ org.apache.openjpa.kernel.exps.Expression ke2 = e2.toKernelExpression(factory, model, q);
+ org.apache.openjpa.kernel.exps.Expression result = _op == BooleanOperator.AND
? factory.and(ke1,ke2) : factory.or(ke1, ke2);
- for (int i = 2; i < _exps.size(); i++) {
- ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
- result = _op == BooleanOperator.AND
- ? factory.and(result, e.toKernelExpression(factory, model, q))
- : factory.or(result, e.toKernelExpression(factory,model,q));
- }
- return _negated ? factory.not(result) : result;
+ for (int i = 2; i < _exps.size(); i++) {
+ ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
+ result = _op == BooleanOperator.AND
+ ? factory.and(result, e.toKernelExpression(factory, model, q))
+ : factory.or(result, e.toKernelExpression(factory,model,q));
+ }
+ return _negated ? factory.not(result) : result;
}
public static class And extends PredicateImpl {
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java Tue Jun 30 13:40:17 2009
@@ -41,12 +41,12 @@
super(cls);
}
- public SelectionImpl<X> setSelections(Selection<?>... selections) {
- _sels = Arrays.asList(selections);
- return this;
- }
-
- public List<Selection<?>> getSelections() {
- return _sels;
- }
+// public SelectionImpl<X> setSelections(Selection<?>... selections) {
+// _sels = Arrays.asList(selections);
+// return this;
+// }
+//
+// public List<Selection<?>> getSelections() {
+// return _sels;
+// }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java Tue Jun 30 13:40:17 2009
@@ -41,7 +41,6 @@
import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder;
import org.apache.openjpa.meta.ClassMetaData;
-import org.apache.openjpa.meta.FieldMetaData;
import org.apache.openjpa.meta.JavaTypes;
import org.apache.openjpa.persistence.meta.AbstractManagedType;
import org.apache.openjpa.persistence.meta.Members;
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java Tue Jun 30 13:40:17 2009
@@ -38,6 +38,7 @@
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.PluralAttribute.CollectionType;
+import org.apache.openjpa.kernel.Filters;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FieldMetaData;
@@ -850,8 +851,7 @@
* Selects if the attribute type matches the given Java class.
* null matches any type.
*/
- public static final class AttributeTypeFilter<X, Y> implements
- Filter<Attribute<? super X, ?>> {
+ public static final class AttributeTypeFilter<X, Y> implements Filter<Attribute<? super X, ?>> {
private final Class<Y> _type;
private final boolean _invert;
@@ -865,13 +865,13 @@
}
public boolean selects(Attribute<? super X, ?> attr) {
- boolean result = _type == null || attr.getJavaType() == _type;
+ boolean result = _type == null || Filters.canConvert(attr.getJavaType(), _type, false);
return _invert ? !result : result;
}
public AttributeTypeFilter<X, Y> inverse() {
return new AttributeTypeFilter<X, Y>(_type, !_invert);
- }
+ }
}
public static final class AttributeNameFilter<X> implements
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java Tue Jun 30 13:40:17 2009
@@ -98,8 +98,7 @@
private int generatedSourceVersion = 6;
private CompileTimeLogger logger;
private boolean addHeader = false;
- private static Localizer _loc =
- Localizer.forPackage(AnnotationProcessor6.class);
+ private static Localizer _loc = Localizer.forPackage(AnnotationProcessor6.class);
/**
* Category of members as per JPA 2.0 type system.
@@ -181,13 +180,12 @@
setSourceVersion();
setFileManager();
setNamingPolicy();
- addHeader = "true".equalsIgnoreCase(processingEnv.getOptions()
- .get("header"));
+ addHeader = "true".equalsIgnoreCase(processingEnv.getOptions().get("header"));
handler = new SourceAnnotationHandler(processingEnv, logger);
}
/**
- * The entry point for javac compiler.
+ * The entry point for java compiler.
*/
@Override
public boolean process(Set<? extends TypeElement> annos,
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java?rev=789723&r1=789722&r2=789723&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java Tue Jun 30 13:40:17 2009
@@ -370,9 +370,10 @@
*/
static class TransientFilter implements InclusiveFilter<Element> {
public boolean includes(Element obj) {
+ Set<Modifier> modifiers = obj.getModifiers();
boolean isTransient = isAnnotatedWith(obj, Transient.class)
- || obj.getModifiers().contains(Modifier.TRANSIENT);
- return !isTransient;
+ || modifiers.contains(Modifier.TRANSIENT);
+ return !isTransient && !modifiers.contains(Modifier.STATIC);
}
}