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/02/01 18:34:05 UTC

svn commit: r739796 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/

Author: ppoddar
Date: Sun Feb  1 17:34:04 2009
New Revision: 739796

URL: http://svn.apache.org/viewvc?rev=739796&view=rev
Log:
OPENJPA-703: Use Prepared Query for packed results.

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.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/PreparedQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryImpl.java?rev=739796&r1=739795&r2=739796&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 Sun Feb  1 17:34:04 2009
@@ -32,6 +32,7 @@
 import org.apache.openjpa.kernel.Broker;
 import org.apache.openjpa.kernel.PreparedQuery;
 import org.apache.openjpa.kernel.Query;
+import org.apache.openjpa.kernel.QueryImpl;
 import org.apache.openjpa.kernel.QueryLanguages;
 import org.apache.openjpa.lib.rop.ResultList;
 import org.apache.openjpa.util.ImplHelper;
@@ -125,23 +126,35 @@
      * {@link ResultList#getUserObject() user object}. 
      */
     public boolean initialize(Object result) {
-        boolean initialized = false;
-        if (result instanceof ResultList) {
-            Object provider = ((ResultList)result).getUserObject();
-            if (provider instanceof SelectResultObjectProvider) {
-                SelectResultObjectProvider rop = 
-                    (SelectResultObjectProvider)provider;
-                SelectExecutor selector = rop.getSelect();
-                SQLBuffer buffer = selector == null ? null : selector.getSQL();
-                if (buffer != null && !selector.hasMultipleSelects()) {
-                    setTargetQuery(buffer.getSQL());
-                    setParameters(buffer.getParameters());
-                    setUserParameterPositions(buffer.getUserParameters());
-                    initialized = true;
-                }
-            }
+        SelectExecutor selector = extractSelectExecutor(result);
+        if (selector == null)
+            return false;
+        SQLBuffer buffer = selector == null ? null : selector.getSQL();
+        if (buffer != null && !selector.hasMultipleSelects()) {
+            setTargetQuery(buffer.getSQL());
+            setParameters(buffer.getParameters());
+            setUserParameterPositions(buffer.getUserParameters());
+            return true;
         }
-        return initialized;
+        return false;
+    }
+    
+    /**
+     * Extract the underlying SelectExecutor from the given argument, if 
+     * possible.
+     */
+    private SelectExecutor extractSelectExecutor(Object result) {
+        if (result instanceof ResultList == false)
+            return null;
+        Object provider = ((ResultList)result).getUserObject();
+        if (provider instanceof QueryImpl.PackingResultObjectProvider) {
+            provider = ((QueryImpl.PackingResultObjectProvider)provider)
+                .getDelegate();
+        }
+        if (provider instanceof SelectResultObjectProvider) {
+            return ((SelectResultObjectProvider)provider).getSelect();
+        } 
+        return null;
     }
     
     /**

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java?rev=739796&r1=739795&r2=739796&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java Sun Feb  1 17:34:04 2009
@@ -1982,7 +1982,7 @@
     /**
      * Result object provider that packs results before returning them.
      */
-    private static class PackingResultObjectProvider
+    public static class PackingResultObjectProvider
         implements ResultObjectProvider {
 
         private final ResultObjectProvider _delegate;
@@ -2045,6 +2045,10 @@
         public void handleCheckedException(Exception e) {
             _delegate.handleCheckedException(e);
         }
+        
+        public ResultObjectProvider getDelegate() {
+            return _delegate;
+        }
     }
 
     /**

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=739796&r1=739795&r2=739796&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 Sun Feb  1 17:34:04 2009
@@ -416,6 +416,15 @@
 	}
 	
 	/**
+	 * Project results are returned with different types of ROP.
+	 */
+	public void testProjectionResult() {
+	    String jpql = "select e.name from Employee e where e.address.city=:city";
+        Object[] params = {"city", CITY_NAMES[0]};
+        compare(!IS_NAMED_QUERY, jpql, COMPANY_NAMES.length*DEPARTMENT_NAMES.length, params);
+	}
+	
+	/**
 	 * Compare the result of execution of the same query with and without
 	 * Prepared Query Cache.
 	 *