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