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 2010/10/28 19:18:09 UTC
svn commit: r1028393 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/
openjpa-kernel/src/main/ja...
Author: ppoddar
Date: Thu Oct 28 17:18:09 2010
New Revision: 1028393
URL: http://svn.apache.org/viewvc?rev=1028393&view=rev
Log:
OPENJPA-1845: Detect query using IN expression with parameters and exclude from query cache
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java
openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java?rev=1028393&r1=1028392&r2=1028393&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java Thu Oct 28 17:18:09 2010
@@ -188,8 +188,8 @@ public class PreparedQueryCacheImpl impl
lock(false);
try {
if (_uncachables.put(id, exclusion) == null) {
- if (_log != null && _log.isTraceEnabled())
- _log.trace(_loc.get("prepared-query-uncache", id, exclusion));
+ if (_log != null && _log.isWarnEnabled())
+ _log.warn(_loc.get("prepared-query-uncache", id, exclusion));
}
PreparedQuery pq = _delegate.remove(id);
if (_statsEnabled && pq != null) {
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java?rev=1028393&r1=1028392&r2=1028393&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java Thu Oct 28 17:18:09 2010
@@ -215,7 +215,10 @@ public class PreparedQueryImpl implement
return new Object[]{null, _loc.get("exclude-not-executor", _id)};
_exps = ((StoreQuery.Executor)executor).getQueryExpressions();
for (int i = 0; i < _exps.length; i++) {
- if (isUsingExternalizedParameter(_exps[i])) {
+ QueryExpressions exp = _exps[i];
+ if (exp.hasInExpression)
+ return new Object[]{null, _loc.get("exclude-in-expression", _id)};
+ if (isUsingExternalizedParameter(exp)) {
return new Object[]{null, _loc.get("exclude-externalized-param", _id)};
}
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties?rev=1028393&r1=1028392&r2=1028393&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties Thu Oct 28 17:18:09 2010
@@ -167,7 +167,9 @@ exclude-not-executor: Query "{0}" is not
data store.
exclude-externalized-param: Query "{0}" is not cached because some parameterized \
field values are externalized.
-exclude-user-strategy: This query "{0}" is not cached because some parameterized \
+exclude-in-expression: Query "{0}" is not cached because it uses IN expression with \
+ variable-length parameter.
+exclude-user-strategy: Query "{0}" is not cached because some parameterized \
field value depends on user-defined field strategy.
-exclude-pagination: This query "{0}" involves pagination and is not cached.
+exclude-pagination: Query "{0}" is not cached because it uses pagination.
\ No newline at end of file
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java?rev=1028393&r1=1028392&r2=1028393&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/QueryExpressions.java Thu Oct 28 17:18:09 2010
@@ -78,6 +78,7 @@ public class QueryExpressions
private Stack<Context> _contexts = null;
public Object state;
public ResultShape<?> shape;
+ public boolean hasInExpression;
/**
* Set reference to the JPQL query contexts.
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=1028393&r1=1028392&r2=1028393&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Thu Oct 28 17:18:09 2010
@@ -45,6 +45,7 @@ import org.apache.openjpa.kernel.QueryOp
import org.apache.openjpa.kernel.ResultShape;
import org.apache.openjpa.kernel.StoreContext;
import org.apache.openjpa.kernel.exps.AbstractExpressionBuilder;
+import org.apache.openjpa.kernel.exps.Constant;
import org.apache.openjpa.kernel.exps.Context;
import org.apache.openjpa.kernel.exps.Expression;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
@@ -91,6 +92,7 @@ public class JPQLExpressionBuilder
private OrderedMap<Object, Class<?>> parameterTypes;
private int aliasCount = 0;
private boolean inAssignSubselectProjection = false;
+ private boolean hasParameterizedInExpression = false;
/**
* Constructor.
@@ -308,7 +310,8 @@ public class JPQLExpressionBuilder
exps.parameterTypes = parameterTypes;
exps.accessPath = getAccessPath();
-
+ exps.hasInExpression = this.hasParameterizedInExpression;
+
return exps;
}
@@ -1130,14 +1133,15 @@ public class JPQLExpressionBuilder
// the first child is the path
JPQLNode first = inIterator.next();
val1 = getValue(first);
-
while (inIterator.hasNext()) {
JPQLNode next = inIterator.next();
if (first.id == JJTTYPE && next.id == JJTTYPELITERAL)
val2 = getTypeLiteral(next);
else
val2 = getValue(next);
-
+ if (val2 instanceof Parameter) {
+ hasParameterizedInExpression = true;
+ }
// special case for <value> IN (<subquery>) or
// <value> IN (<single value>)
if (useContains(not, val1, val2, node))
@@ -1158,6 +1162,7 @@ public class JPQLExpressionBuilder
inExp = factory.or(inExp, factory.equal(val1, val2));
}
}
+
// we additionally need to add in a "NOT NULL" clause, since
// the IN behavior that is expected by the CTS also expects
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java?rev=1028393&r1=1028392&r2=1028393&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java Thu Oct 28 17:18:09 2010
@@ -50,7 +50,7 @@ import org.apache.openjpa.persistence.jd
import org.apache.openjpa.persistence.test.AbstractPersistenceTestCase;
/**
- * Tests correctness and performance of queries with and without Prepared Query Cacheing.
+ * Tests correctness and performance of queries with and without Prepared Query Cache.
*
* This test uses a single EntityManagerFactory initialized with fixed set of entity classes
* and appropriate configuration parameters for Prepared Query Cache.
@@ -322,10 +322,13 @@ public class TestPreparedQueryCache exte
em.clear();
String jpql4 = "select p from Parent p where p.id < 3";
- String jpql5 = "select p from Parent p where p.id > 6";
+ String jpql5 = "select p from Parent p where p.id > 4";
List<Parent> parm1 = em.createQuery(jpql4).getResultList();
List<Parent> parm2 = em.createQuery(jpql5).getResultList();
+ assertTrue("Size of two result list " + parm1.size() + " and " + parm2.size() +
+ " must not be same", parm1.size() != parm2.size());
+
em.clear();
String jpql6 = "select c from Child c where c.parent in ?1";
Query qry = em.createQuery(jpql6);
@@ -342,11 +345,12 @@ public class TestPreparedQueryCache exte
List<Child> c2 = qry.getResultList();
for (int i = 0; i < c2.size(); i++) {
Child child = (Child) c2.get(i);
- assertTrue(child.getParent().getId() > 6);
+ assertTrue(child.getParent().getId() > 4);
}
}
+
public void testRepeatedParameterInSubqueryInDifferentOrderSubQLast() {
OpenJPAEntityManager em = emf.createEntityManager();