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();