Author: tv
Date: Tue Jul 18 12:20:09 2006
New Revision: 423210

URL: http://svn.apache.org/viewvc?rev=423210&view=rev
Log:
Reworked limit and offset support.
Fixed MS-SQL failure in LargeSelect (fixes TORQUE-20).

Modified:
    
db/torque/runtime/trunk/src/java/org/apache/torque/adapter/AbstractDBAdapter.java
    db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DB.java
    db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DBSybase.java
    db/torque/runtime/trunk/src/java/org/apache/torque/util/BasePeer.java
    db/torque/runtime/trunk/src/java/org/apache/torque/util/LargeSelect.java

Modified: 
db/torque/runtime/trunk/src/java/org/apache/torque/adapter/AbstractDBAdapter.java
URL: 
http://svn.apache.org/viewvc/db/torque/runtime/trunk/src/java/org/apache/torque/adapter/AbstractDBAdapter.java?rev=423210&r1=423209&r2=423210&view=diff
==============================================================================
--- 
db/torque/runtime/trunk/src/java/org/apache/torque/adapter/AbstractDBAdapter.java
 (original)
+++ 
db/torque/runtime/trunk/src/java/org/apache/torque/adapter/AbstractDBAdapter.java
 Tue Jul 18 12:20:09 2006
@@ -21,6 +21,7 @@
 import java.sql.Timestamp;
 import java.util.Date;
 
+import org.apache.torque.TorqueException;
 import org.apache.torque.util.Query;
 
 /**
@@ -176,8 +177,11 @@
      * @param query The query to modify
      * @param offset the offset Value
      * @param limit the limit Value
+     * 
+     * @throws TorqueException if any error occurs when building the query
      */
     public void generateLimits(Query query, int offset, int limit)
+        throws TorqueException
     {
         if (supportsNativeLimit())
         {

Modified: db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DB.java
URL: 
http://svn.apache.org/viewvc/db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DB.java?rev=423210&r1=423209&r2=423210&view=diff
==============================================================================
--- db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DB.java 
(original)
+++ db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DB.java Tue Jul 
18 12:20:09 2006
@@ -21,6 +21,7 @@
 import java.sql.SQLException;
 import java.util.Date;
 
+import org.apache.torque.TorqueException;
 import org.apache.torque.util.Query;
 
 /**
@@ -199,8 +200,11 @@
      * @param query The query to modify
      * @param offset the offset Value
      * @param limit the limit Value
+     * 
+     * @throws TorqueException if any error occurs when building the query
      */
-    public void generateLimits(Query query, int offset, int limit);
+    public void generateLimits(Query query, int offset, int limit)
+        throws TorqueException;
 
     /**
     * This method is for the SqlExpression.quoteAndEscape rules.  The rule is,

Modified: 
db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DBSybase.java
URL: 
http://svn.apache.org/viewvc/db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DBSybase.java?rev=423210&r1=423209&r2=423210&view=diff
==============================================================================
--- db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DBSybase.java 
(original)
+++ db/torque/runtime/trunk/src/java/org/apache/torque/adapter/DBSybase.java 
Tue Jul 18 12:20:09 2006
@@ -19,10 +19,13 @@
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.util.Date;
 import java.text.SimpleDateFormat;
+import java.util.Date;
 
+import org.apache.torque.TorqueException;
+import org.apache.torque.util.Criteria;
 import org.apache.torque.util.Query;
+import org.apache.torque.util.SqlExpression;
 
 /**
  * This is used to connect to a Sybase database using Sybase's
@@ -154,10 +157,21 @@
      * @param query The query to modify
      * @param offset the offset Value
      * @param limit the limit Value
+     * 
+     * @throws TorqueException if any error occurs when building the query
      */
     public void generateLimits(Query query, int offset, int limit)
+        throws TorqueException
     {
-        query.setRowcount(String.valueOf(limit+offset));
+        if (limit + offset > 0)
+        {
+            query.setRowcount(String.valueOf(limit + offset));
+        }
+        else if (limit + offset == 0)
+        {
+            // This is necessary to create the empty result set that Torque 
expects
+            query.getWhereClause().add(SqlExpression.build("1", new 
Integer(0), Criteria.EQUAL));
+        }
     }
 
     /**

Modified: db/torque/runtime/trunk/src/java/org/apache/torque/util/BasePeer.java
URL: 
http://svn.apache.org/viewvc/db/torque/runtime/trunk/src/java/org/apache/torque/util/BasePeer.java?rev=423210&r1=423209&r2=423210&view=diff
==============================================================================
--- db/torque/runtime/trunk/src/java/org/apache/torque/util/BasePeer.java 
(original)
+++ db/torque/runtime/trunk/src/java/org/apache/torque/util/BasePeer.java Tue 
Jul 18 12:20:09 2006
@@ -999,14 +999,10 @@
                 results = new ArrayList(numberOfResults);
                 qds.fetchRecords(start, numberOfResults);
             }
-            if (qds.size() > 1 && singleRecord)
-            {
-                handleMultipleRecords(qds);
-            }
 
             int startRecord = 0;
 
-            //Offset the correct number of people
+            //Offset the correct number of records
             if (start > 0 && numberOfResults <= 0)
             {
                 startRecord = start;
@@ -1017,6 +1013,11 @@
             {
                 Record rec = qds.getRecord(i);
                 results.add(rec);
+            }
+
+            if (results.size() > 1 && singleRecord)
+            {
+                handleMultipleRecords(qds);
             }
         }
         catch (Exception e)

Modified: 
db/torque/runtime/trunk/src/java/org/apache/torque/util/LargeSelect.java
URL: 
http://svn.apache.org/viewvc/db/torque/runtime/trunk/src/java/org/apache/torque/util/LargeSelect.java?rev=423210&r1=423209&r2=423210&view=diff
==============================================================================
--- db/torque/runtime/trunk/src/java/org/apache/torque/util/LargeSelect.java 
(original)
+++ db/torque/runtime/trunk/src/java/org/apache/torque/util/LargeSelect.java 
Tue Jul 18 12:20:09 2006
@@ -671,10 +671,13 @@
     public void run()
     {
         boolean dbSupportsNativeLimit;
+        boolean dbSupportsNativeOffset;
         try
         {
             dbSupportsNativeLimit 
                     = (Torque.getDB(dbName).supportsNativeLimit());
+            dbSupportsNativeOffset 
+                    = (Torque.getDB(dbName).supportsNativeOffset());
         }
         catch (TorqueException e)
         {
@@ -685,7 +688,7 @@
         }
         
         int size;
-        if (dbSupportsNativeLimit)
+        if (dbSupportsNativeLimit && dbSupportsNativeOffset)
         {
             // retrieve one page at a time
             size = pageSize;
@@ -707,14 +710,21 @@
             // Add 1 to memory limit to check if the query ends on a page 
break.
             results = new ArrayList(memoryLimit + 1);
 
+            // Use the criteria to limit the rows that are retrieved to the
+            // block of records that fit in the predefined memoryLimit.
             if (dbSupportsNativeLimit)
             {
-                // Use the criteria to limit the rows that are retrieved to the
-                // block of records that fit in the predefined memoryLimit.
-                criteria.setOffset(blockBegin);
-                // Add 1 to memory limit to check if the query ends on a 
-                // page break.
-                criteria.setLimit(memoryLimit + 1);
+                if (dbSupportsNativeOffset)
+                {
+                    criteria.setOffset(blockBegin);
+                    // Add 1 to memory limit to check if the query ends on a 
+                    // page break.
+                    criteria.setLimit(memoryLimit + 1);
+                }
+                else
+                {
+                    criteria.setLimit(blockBegin + memoryLimit + 1);
+                }
             }
             query = BasePeer.createQueryString(criteria);
 
@@ -758,17 +768,17 @@
                 List tempResults
                         = BasePeer.getSelectResults(qds, size, false);
 
+                int startIndex = dbSupportsNativeOffset ? 0 : blockBegin;  
+
                 synchronized (results)
                 {
-                    for (int i = 0, n = tempResults.size(); i < n; i++)
+                    for (int i = startIndex, n = tempResults.size(); i < n; 
i++)
                     {
-                        if (dbSupportsNativeLimit
-                                || (i >= blockBegin))
                         results.add(tempResults.get(i));
                     }
                 }
 
-                if (dbSupportsNativeLimit)
+                if (dbSupportsNativeLimit && dbSupportsNativeOffset)
                 {
                     currentlyFilledTo += tempResults.size();
                 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to