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());
     }
 


Reply via email to