Author: aadamchik
Date: Sun Nov 2 12:58:46 2008
New Revision: 709929
URL: http://svn.apache.org/viewvc?rev=709929&view=rev
Log:
Add LIMIT / OFFSET clause generation method to SelectTranslator lifecycle
fixing in-memory fetch limit processing for DBs that do not support the LIMIT
clause
Modified:
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/test/java/org/apache/cayenne/query/SelectQueryTest.java
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=709929&r1=709928&r2=709929&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:58:46 2008
@@ -136,12 +136,19 @@
workerIterator,
translator.getRootDbEntity(),
compareFullRows[0]);
-
-
- it = new LimitResultIterator(it,query.getFetchLimit());
}
-
-
+
+ // wrap iterator in a fetch limit checker ... there are a few cases
when in-memory
+ // fetch limit is a noop, however in a geberal case this is needed, as
teh SQL
+ // 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);
+ }
// TODO: Should do something about closing ResultSet and
PreparedStatement in this
// method, instead of relying on DefaultResultIterator to do that later
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java?rev=709929&r1=709928&r2=709929&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
Sun Nov 2 12:58:46 2008
@@ -69,15 +69,13 @@
public void testFetchLimitWithOffset() throws Exception {
ObjectContext context = createDataContext();
- int totalRows = context.performQuery(new
SelectQuery(Artist.class)).size();
-
SelectQuery query = new SelectQuery(Artist.class);
query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, true);
- query.setFetchOffset(totalRows - 5);
- query.setFetchLimit(5);
+ query.setFetchOffset(15);
+ query.setFetchLimit(4);
List<Artist> results = context.performQuery(query);
- assertEquals(5, results.size());
+ assertEquals(4, results.size());
assertEquals("artist16", results.get(0).getArtistName());
}