OPENJPA-703: Use Prepared Query for packed results.

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@739796 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Pinaki Poddar 2009-02-01 17:34:04 +00:00
parent 4ed05803e1
commit 2065e905dd
3 changed files with 43 additions and 17 deletions

View File

@ -32,6 +32,7 @@ import org.apache.openjpa.jdbc.sql.SelectExecutor;
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 @@ public class PreparedQueryImpl implements PreparedQuery {
* {@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;
}
/**

View File

@ -1982,7 +1982,7 @@ public class QueryImpl
/**
* 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 class QueryImpl
public void handleCheckedException(Exception e) {
_delegate.handleCheckedException(e);
}
public ResultObjectProvider getDelegate() {
return _delegate;
}
}
/**

View File

@ -415,6 +415,15 @@ public class TestPreparedQueryCache extends SQLListenerTestCase {
compare(!IS_NAMED_QUERY, jpql, EMPLOYEE_NAMES.length*DEPARTMENT_NAMES.length, params);
}
/**
* 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.