Author: faywang
Date: Thu Nov 4 21:03:23 2010
New Revision: 1031244
URL: http://svn.apache.org/viewvc?rev=1031244&view=rev
Log:
OPENJPA-1810: make QueryKey distinguishable for CriteriaQuery
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java?rev=1031244&r1=1031243&r2=1031244&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryCacheStoreQuery.java
Thu Nov 4 21:03:23 2010
@@ -331,9 +331,10 @@ public class QueryCacheStoreQuery
public ResultObjectProvider executeQuery(StoreQuery q, Object[] params,
Range range) {
QueryCacheStoreQuery cq = (QueryCacheStoreQuery) q;
+ Object parsed = cq.getDelegate().newCompilation();
QueryKey key = QueryKey.newInstance(cq.getContext(),
_ex.isPacking(q), params, _candidate, _subs, range.start,
- range.end);
+ range.end, parsed);
List<Object> cached = cq.checkCache(key);
if (cached != null)
return new ListResultObjectProvider(cached);
Modified:
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java?rev=1031244&r1=1031243&r2=1031244&view=diff
==============================================================================
---
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
(original)
+++
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/datacache/QueryKey.java
Thu Nov 4 21:03:23 2010
@@ -89,7 +89,7 @@ public class QueryKey
private String _candidateClassName;
private boolean _subclasses;
private Set _accessPathClassNames;
- private String _query;
+ private Object _query;
private boolean _ignoreChanges;
private Map _params;
private long _rangeStart;
@@ -117,7 +117,7 @@ public class QueryKey
// via API calls (candidate class, result class, etc)
q.compile();
return newInstance(q, false, args, q.getCandidateType(),
- q.hasSubclasses(), q.getStartRange(), q.getEndRange());
+ q.hasSubclasses(), q.getStartRange(), q.getEndRange(), null);
}
/**
@@ -128,15 +128,15 @@ public class QueryKey
// via API calls (candidate class, result class, etc)
q.compile();
return newInstance(q, false, args, q.getCandidateType(),
- q.hasSubclasses(), q.getStartRange(), q.getEndRange());
+ q.hasSubclasses(), q.getStartRange(), q.getEndRange(), null);
}
/**
* Return a key for the given query, or null if it is not cacheable.
*/
static QueryKey newInstance(QueryContext q, boolean packed, Object[] args,
- Class candidate, boolean subs, long startIdx, long endIdx) {
- QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx);
+ Class candidate, boolean subs, long startIdx, long endIdx, Object
parsed) {
+ QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx,
parsed);
if (key != null && setParams(key, q, args))
return key;
return null;
@@ -146,8 +146,8 @@ public class QueryKey
* Return a key for the given query, or null if it is not cacheable.
*/
static QueryKey newInstance(QueryContext q, boolean packed, Map args,
- Class candidate, boolean subs, long startIdx, long endIdx) {
- QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx);
+ Class candidate, boolean subs, long startIdx, long endIdx, Object
parsed) {
+ QueryKey key = createKey(q, packed, candidate, subs, startIdx, endIdx,
parsed);
if (key != null && (args == null || args.isEmpty() ||
setParams(key, q.getStoreContext(), new HashMap(args))))
return key;
@@ -160,7 +160,7 @@ public class QueryKey
* class, query filter, etc.
*/
private static QueryKey createKey(QueryContext q, boolean packed,
- Class candidateClass, boolean subclasses, long startIdx, long endIdx) {
+ Class candidateClass, boolean subclasses, long startIdx, long endIdx,
Object parsed) {
if (candidateClass == null)
return null;
@@ -245,6 +245,10 @@ public class QueryKey
key._accessPathClassNames = accessPathClassNames;
key._timeout = timeout;
key._query = q.getQueryString();
+ if (key._query == null) {
+ // this can be a criteria query
+ key._query = parsed;
+ }
key._ignoreChanges = q.getIgnoreChanges();
key._rangeStart = startIdx;
key._rangeEnd = endIdx;
@@ -408,7 +412,7 @@ public class QueryKey
&& _ignoreChanges == other._ignoreChanges
&& _rangeStart == other._rangeStart
&& _rangeEnd == other._rangeEnd
- && StringUtils.equals(_query, other._query)
+ && ObjectUtils.equals(_query, other._query)
&& ObjectUtils.equals(_params, other._params);
}
Modified:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java?rev=1031244&r1=1031243&r2=1031244&view=diff
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
(original)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCriteria.java
Thu Nov 4 21:03:23 2010
@@ -21,7 +21,12 @@ package org.apache.openjpa.persistence.c
import java.util.List;
+import javax.persistence.EntityManager;
import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.query.DomainObject;
@@ -57,6 +62,8 @@ public class TestCriteria extends Single
public void setUp() {
super.setUp(CLEAR_TABLES,
"openjpa.DynamicEnhancementAgent", "false",
+ "openjpa.DataCache","true",
+ "openjpa.QueryCache","true",
Account.class,
Address.class,
A.class,
@@ -233,6 +240,28 @@ public class TestCriteria extends Single
compare(jpql, d);
}
+ public void testCount() {
+
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+ for(int i = 0;i<50;i++)
+ em.persist(new Department());
+ em.getTransaction().commit();
+
+ CriteriaBuilder cb = em.getCriteriaBuilder();
+ CriteriaQuery<Department> q = cb.createQuery(Department.class);
+ Root<Department> book = q.from(Department.class);
+ TypedQuery<Department> dept = em.createQuery(q);
+ int size = dept.getResultList().size();
+
+ CriteriaQuery<Long> c = cb.createQuery(Long.class);
+ Root<?> from = c.from(Department.class);
+ c.select(cb.count(from));
+ TypedQuery<Long> query = em.createQuery(c);
+ long count = query.getSingleResult();
+ assertEquals(size, count);
+ }
+
public void testGeneralCase() {
DomainObject e = qb.createQueryDefinition(Employee.class);
e.where(e.get("department").get("name").equal("Engineering"));
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=1031244&r1=1031243&r2=1031244&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 Nov 4 21:03:23 2010
@@ -724,4 +724,10 @@ class CriteriaQueryImpl<T> implements Op
return super.toString();
}
}
+
+ public boolean equals(Object other) {
+ if (toString().equals(other.toString()))
+ return true;
+ return false;
+ }
}