You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/11/02 21:59:47 UTC
svn commit: r709930 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne:
access/jdbc/ dba/hsqldb/ dba/mysql/ dba/oracle/ dba/postgres/
Author: aadamchik
Date: Sun Nov 2 12:59:47 2008
New Revision: 709930
URL: http://svn.apache.org/viewvc?rev=709930&view=rev
Log:
Add LIMIT / OFFSET clause generation method to SelectTranslator lifecycle
fixing in-memory offset processing for DBs that do not support the OFFSET clause and are suppressing distinct
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/BaseSQLAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/LimitResultIterator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLSelectAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLSelectAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/BaseSQLAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/BaseSQLAction.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/BaseSQLAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/BaseSQLAction.java Sun Nov 2 12:59:47 2008
@@ -27,7 +27,6 @@
import org.apache.cayenne.DataRow;
import org.apache.cayenne.access.OperationObserver;
import org.apache.cayenne.access.QueryLogger;
-import org.apache.cayenne.access.ResultIterator;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.query.Query;
@@ -70,9 +69,7 @@
long t1 = System.currentTimeMillis();
QueryMetadata metadata = query.getMetaData(getEntityResolver());
- int i = getInitialCursorPosition(metadata.getFetchOffset());
- while (i-- > 0 && resultSet.next())
- ;
+
JDBCResultIterator resultReader = new JDBCResultIterator(
null,
@@ -80,7 +77,7 @@
resultSet,
descriptor);
- LimitResultIterator it = new LimitResultIterator(resultReader,metadata.getFetchLimit());
+ LimitResultIterator it = new LimitResultIterator(resultReader, getInMemoryOffset(metadata.getFetchOffset()), metadata.getFetchLimit());
if (!delegate.isIteratedResult()) {
List<DataRow> resultRows = it.dataRows(false);
@@ -116,7 +113,7 @@
*
* @since 3.0
*/
- protected int getInitialCursorPosition(int queryOffset) {
+ protected int getInMemoryOffset(int queryOffset) {
return queryOffset;
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/LimitResultIterator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/LimitResultIterator.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/LimitResultIterator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/LimitResultIterator.java Sun Nov 2 12:59:47 2008
@@ -39,21 +39,31 @@
protected Map<String, Object> nextDataObjectIds;
protected int fetchLimit;
+ protected int offset;
protected int fetchedSoFar ;
protected boolean nextRow;
- public LimitResultIterator (ResultIterator wrappedIterator,int fetchLimit)
+ public LimitResultIterator (ResultIterator wrappedIterator, int offset, int fetchLimit)
throws CayenneException{
if (wrappedIterator == null) {
throw new CayenneException("Null wrapped iterator.");
}
this.wrappedIterator = wrappedIterator;
+ this.offset = offset;
this.fetchLimit = fetchLimit;
+
+ checkOffset();
checkNextRow();
}
+
+ private void checkOffset() throws CayenneException {
+ for (int i = 0; i < offset && wrappedIterator.hasNextRow(); i++) {
+ wrappedIterator.nextDataRow();
+ }
+ }
private void checkNextRow() throws CayenneException {
nextRow = false;
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java Sun Nov 2 12:59:47 2008
@@ -216,10 +216,6 @@
long startTime) throws Exception {
boolean iteratedResult = callback.isIteratedResult();
-
- int i = getFetchOffset();
- while (i-- > 0 && resultSet.next())
- ;
ExtendedTypeMap types = adapter.getExtendedTypes();
RowDescriptorBuilder builder = configureRowDescriptorBuilder(compiled, resultSet);
@@ -230,7 +226,7 @@
resultSet,
builder.getDescriptor(types));
- LimitResultIterator it = new LimitResultIterator(result,query.getFetchLimit());
+ LimitResultIterator it = new LimitResultIterator(result, getFetchOffset(), query.getFetchLimit());
if (!iteratedResult) {
List<DataRow> resultRows = it.dataRows(false);
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java Sun Nov 2 12:59:47 2008
@@ -72,10 +72,6 @@
PreparedStatement prepStmt = translator.createStatement();
ResultSet rs = prepStmt.executeQuery();
- int i = getInitialCursorPosition(query.getFetchOffset());
- while (i-- > 0 && rs.next())
- ;
-
RowDescriptor descriptor = new RowDescriptorBuilder().setColumns(
translator.getResultColumns()).getDescriptor(
getAdapter().getExtendedTypes());
@@ -143,11 +139,10 @@
// result count does not directly correspind to the number of objects returned
// from Cayenne.
- // TODO: andrus, 11/2/2008 - shoudn't we apply the same rules to OFFSET
- // processing?
int fetchLimit = query.getFetchLimit();
- if (fetchLimit > 0) {
- it = new LimitResultIterator(it, fetchLimit);
+ int offset = getInMemoryOffset(query.getFetchOffset());
+ if (fetchLimit > 0 || offset > 0) {
+ it = new LimitResultIterator(it, offset, fetchLimit);
}
// TODO: Should do something about closing ResultSet and PreparedStatement in this
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLSelectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLSelectAction.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLSelectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLSelectAction.java Sun Nov 2 12:59:47 2008
@@ -36,7 +36,7 @@
}
@Override
- protected int getInitialCursorPosition(int queryOffset) {
+ protected int getInMemoryOffset(int queryOffset) {
return 0;
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLSelectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLSelectAction.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLSelectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLSelectAction.java Sun Nov 2 12:59:47 2008
@@ -36,7 +36,7 @@
}
@Override
- protected int getInitialCursorPosition(int queryOffset) {
+ protected int getInMemoryOffset(int queryOffset) {
return 0;
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectAction.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectAction.java Sun Nov 2 12:59:47 2008
@@ -49,7 +49,7 @@
}
@Override
- protected int getInitialCursorPosition(int queryOffset) {
+ protected int getInMemoryOffset(int queryOffset) {
return 0;
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java?rev=709930&r1=709929&r2=709930&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java Sun Nov 2 12:59:47 2008
@@ -37,7 +37,7 @@
}
@Override
- protected int getInitialCursorPosition(int queryOffset) {
+ protected int getInMemoryOffset(int queryOffset) {
return 0;
}