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/07/13 20:35:29 UTC

svn commit: r676399 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/jdbc/ main/java/org/apache/cayenne/dba/postgres/ test/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/query/

Author: aadamchik
Date: Sun Jul 13 11:35:29 2008
New Revision: 676399

URL: http://svn.apache.org/viewvc?rev=676399&view=rev
Log:
CAY-1068 Add support for start index/offset of queries
(adding more unit tests; fixing a postgres glitch with LIMIT = max int)

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/main/java/org/apache/cayenne/dba/postgres/PostgresSelectTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.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=676399&r1=676398&r2=676399&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 Jul 13 11:35:29 2008
@@ -164,6 +164,10 @@
     }
 
     /**
+     * Returns a value of the offset that will be used to rewind the ResultSet before
+     * starting reading the result rows. If the adapter supports setting offset at the SQL
+     * level, this method must be overridden to return zero for no manual offset.
+     * 
      * @since 3.0
      */
     protected int getFetchOffset() {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectTranslator.java?rev=676399&r1=676398&r2=676399&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectTranslator.java Sun Jul 13 11:35:29 2008
@@ -32,17 +32,17 @@
     public String createSqlString() throws Exception {
         String sql = super.createSqlString();
         QueryMetadata metadata = getQuery().getMetaData(getEntityResolver());
-        
-     // limit results
+
+        // limit results
         int offset = metadata.getFetchOffset();
         int limit = metadata.getFetchLimit();
+
+        if (limit > 0) {
+            sql += " LIMIT " + limit;
+        }
         
-        if (offset > 0 || limit > 0) {
-            sql += " LIMIT ";
-            if (limit == 0) {
-                limit = Integer.MAX_VALUE;
-            }
-            sql += limit + " OFFSET " +  offset; 
+        if (offset > 0) {
+            sql += " OFFSET " + offset;
         }
         return sql;
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java?rev=676399&r1=676398&r2=676399&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java Sun Jul 13 11:35:29 2008
@@ -88,7 +88,7 @@
         assertEquals(2, array3.length);
         Object[] array4 = (Object[]) objects.get(3);
         assertEquals(2, array3.length);
-        
+
         assertEquals(new Integer(1), array1[1]);
         assertEquals(new Integer(1), array2[1]);
         assertEquals(new Integer(0), array3[1]);
@@ -442,6 +442,39 @@
         assertTrue(objects.get(0) instanceof Artist);
     }
 
+    public void testFetchOffset() throws Exception {
+        getAccessStack().createTestData(DataContextCase.class, "testArtists", null);
+
+        int fetchOffset = 3;
+
+        // sanity check
+        assertTrue(fetchOffset < DataContextCase.artistCount);
+        String template = "SELECT * FROM ARTIST ORDER BY ARTIST_ID";
+        SQLTemplate query = getSQLTemplateBuilder().createSQLTemplate(
+                Artist.class,
+                template);
+        query.setFetchOffset(fetchOffset);
+
+        List objects = context.performQuery(query);
+        assertEquals(DataContextCase.artistCount - fetchOffset, objects.size());
+        assertTrue(objects.get(0) instanceof Artist);
+    }
+
+    public void testFetchOffsetFetchLimit() throws Exception {
+        getAccessStack().createTestData(DataContextCase.class, "testArtists", null);
+
+        String template = "SELECT * FROM ARTIST ORDER BY ARTIST_ID";
+        SQLTemplate query = getSQLTemplateBuilder().createSQLTemplate(
+                Artist.class,
+                template);
+        query.setFetchOffset(1);
+        query.setFetchLimit(2);
+
+        List objects = context.performQuery(query);
+        assertEquals(2, objects.size());
+        assertTrue(objects.get(0) instanceof Artist);
+    }
+
     public void testPageSize() throws Exception {
         getAccessStack().createTestData(DataContextCase.class, "testArtists", null);
 

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=676399&r1=676398&r2=676399&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 Jul 13 11:35:29 2008
@@ -52,17 +52,13 @@
     }
 
     public void testFetchOffset() throws Exception {
-        query.setRoot(Artist.class);
+        SelectQuery query = new SelectQuery(Artist.class);
         query.setFetchOffset(5);
-        performQuery();
-        int size = opObserver.rowsForQuery(query).size();
+        List results = createDataContext().performQuery(query);
 
-        SelectQuery sizeQ = new SelectQuery();
-        sizeQ.setRoot(Artist.class);
-        query = sizeQ;
-        performQuery();
-        int sizeAll = opObserver.rowsForQuery(query).size();
-        assertEquals(size, sizeAll - 5);
+        SelectQuery sizeQ = new SelectQuery(Artist.class);
+        List allResults = createDataContext().performQuery(sizeQ);
+        assertEquals(allResults.size() - 5, results.size());
     }
 
     public void testFetchLimitWithOffset() throws Exception {