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.
         * 


Reply via email to