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/11 15:41:26 UTC

svn commit: r675950 - in /cayenne/main/trunk: docs/doc/src/main/resources/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/ framework/ca...

Author: aadamchik
Date: Fri Jul 11 06:41:25 2008
New Revision: 675950

URL: http://svn.apache.org/viewvc?rev=675950&view=rev
Log:
CAY-1068 Add support for start index/offset of queries (patch 2)

Added:
    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/postgres/PostgresSelectAction.java
Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.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/HSQLActionBuilder.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.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/PostgresActionBuilder.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/JDBCResultIteratorTest.java

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=675950&r1=675949&r2=675950&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Fri Jul 11 06:41:25 2008
@@ -23,6 +23,7 @@
 CAY-1058 Add a maven plugin for starting up the modeler.
 CAY-1060 CM: Allow multiple item selections
 CAY-1061 ResourceFinder: abstract API for looking up resources, including multiple resources for a given name
+CAY-1068 Add support for start index/offset of queries
 CAY-1085 Use standard JDBC API for writing Oracle LOBs
 
 Bug fixes since M4:

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java?rev=675950&r1=675949&r2=675950&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java Fri Jul 11 06:41:25 2008
@@ -66,54 +66,12 @@
     protected boolean nextRow;
     protected int fetchedSoFar;
     protected int fetchLimit;
-    protected int fetchOffset;
 
     private String[] labels;
     private int[] types;
 
     /**
      * Creates new JDBCResultIterator that reads from provided ResultSet.
-     * 
-     * @since 3.0
-     */
-    public JDBCResultIterator(Connection connection, Statement statement,
-            ResultSet resultSet, RowDescriptor descriptor, int fetchLimit, int fetchOffset)
-            throws CayenneException {
-        
-        this.fetchOffset = fetchOffset;
-        this.connection = connection;
-        this.statement = statement;
-        this.resultSet = resultSet;
-        this.rowDescriptor = descriptor;
-        this.fetchLimit = fetchLimit;
-        this.mapCapacity = (int) Math.ceil((descriptor.getWidth()) / 0.75);
-        
-        try {
-            int i = 0;
-            while (i++ < fetchOffset && resultSet.next());
-        }
-        catch (SQLException e) {
-            throw new CayenneException("Error rewinding ResultSet", e);
-        }
-        
-        checkNextRow();
-
-        if (nextRow) {
-            // extract column parameters to speed up processing...
-            ColumnDescriptor[] columns = descriptor.getColumns();
-            int width = columns.length;
-            labels = new String[width];
-            types = new int[width];
-
-            for (int i = 0; i < width; i++) {
-                labels[i] = columns[i].getLabel();
-                types[i] = columns[i].getJdbcType();
-            }
-        }
-    }
-
-    /**
-     * Creates new JDBCResultIterator that reads from provided ResultSet.
      */
     public JDBCResultIterator(Connection connection, Statement statement,
             ResultSet resultSet, RowDescriptor descriptor, int fetchLimit)
@@ -244,10 +202,9 @@
             throw new CayenneException(
                     "An attempt to read uninitialized row or past the end of the iterator.");
         }
-
         checkNextRow();
     }
-
+    
     /**
      * Closes ResultIterator and associated ResultSet. This method must be called
      * explicitly when the user is finished processing the records. Otherwise unused

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=675950&r1=675949&r2=675950&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 Fri Jul 11 06:41:25 2008
@@ -25,22 +25,18 @@
 import java.sql.SQLException;
 import java.util.List;
 
+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.access.trans.SelectTranslator;
 import org.apache.cayenne.access.util.DistinctResultIterator;
 import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dba.hsqldb.HSQLSelectTranslator;
-import org.apache.cayenne.dba.mysql.MySQLSelectTranslator;
-import org.apache.cayenne.dba.oracle.OracleSelectTranslator;
-import org.apache.cayenne.dba.postgres.PostgresSelectTranslator;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.PrefetchProcessor;
 import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.DataRow;
 
 /**
  * A SQLAction that handles SelectQuery execution.
@@ -76,34 +72,20 @@
         PreparedStatement prepStmt = translator.createStatement();
         ResultSet rs = prepStmt.executeQuery();
 
+        int i = getInitialCursorPosition();
+        while (i-- > 0 && rs.next())
+            ;
+
         RowDescriptor descriptor = new RowDescriptorBuilder().setColumns(
                 translator.getResultColumns()).getDescriptor(
                 getAdapter().getExtendedTypes());
 
-        JDBCResultIterator workerIterator;
-        
-        if (translator instanceof MySQLSelectTranslator
-                || translator instanceof OracleSelectTranslator
-                || translator instanceof PostgresSelectTranslator
-                || translator instanceof HSQLSelectTranslator) {
-            
-            workerIterator = new JDBCResultIterator(
-                    connection,
-                    prepStmt,
-                    rs,
-                    descriptor,
-                    query.getFetchLimit());
-            
-        }
-        else {
-            workerIterator = new JDBCResultIterator(
-                    connection,
-                    prepStmt,
-                    rs,
-                    descriptor,
-                    query.getFetchLimit(),
-                    query.getFetchOffset());
-        }
+        JDBCResultIterator workerIterator = new JDBCResultIterator(
+                connection,
+                prepStmt,
+                rs,
+                descriptor,
+                query.getFetchLimit());
 
         workerIterator.setPostProcessor(DataRowPostProcessor
                 .createPostProcessor(translator));
@@ -180,4 +162,8 @@
             }
         }
     }
+
+    protected int getInitialCursorPosition() {
+        return query.getFetchOffset();
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java?rev=675950&r1=675949&r2=675950&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java Fri Jul 11 06:41:25 2008
@@ -22,7 +22,6 @@
 import java.sql.Connection;
 
 import org.apache.cayenne.access.jdbc.ProcedureAction;
-import org.apache.cayenne.access.jdbc.SelectAction;
 import org.apache.cayenne.access.trans.ProcedureTranslator;
 import org.apache.cayenne.access.trans.SelectTranslator;
 import org.apache.cayenne.dba.JdbcActionBuilder;
@@ -40,7 +39,7 @@
 
     @Override
     public SQLAction objectSelectAction(SelectQuery query) {
-        return new SelectAction(query, adapter, entityResolver) {
+        return new HSQLSelectAction(query, adapter, entityResolver) {
 
             @Override
             protected SelectTranslator createTranslator(Connection connection) {

Added: 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=675950&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLSelectAction.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLSelectAction.java Fri Jul 11 06:41:25 2008
@@ -0,0 +1,40 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.dba.hsqldb;
+
+import org.apache.cayenne.access.jdbc.SelectAction;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.SelectQuery;
+
+/**
+ * @since 3.0
+ */
+class HSQLSelectAction extends SelectAction {
+
+    HSQLSelectAction(SelectQuery query, DbAdapter adapter, EntityResolver entityResolver) {
+        super(query, adapter, entityResolver);
+    }
+
+    @Override
+    protected int getInitialCursorPosition() {
+        return 0;
+    }
+
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java?rev=675950&r1=675949&r2=675950&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java Fri Jul 11 06:41:25 2008
@@ -42,7 +42,7 @@
 
     @Override
     public SQLAction objectSelectAction(SelectQuery query) {
-        return new SelectAction(query, adapter, entityResolver) {
+        return new MySQLSelectAction(query, adapter, entityResolver) {
 
             @Override
             protected SelectTranslator createTranslator(Connection connection) {

Added: 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=675950&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLSelectAction.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLSelectAction.java Fri Jul 11 06:41:25 2008
@@ -0,0 +1,39 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.dba.mysql;
+
+import org.apache.cayenne.access.jdbc.SelectAction;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.SelectQuery;
+
+/**
+ * @since 3.0
+ */
+class MySQLSelectAction extends SelectAction {
+
+    MySQLSelectAction(SelectQuery query, DbAdapter adapter, EntityResolver entityResolver) {
+        super(query, adapter, entityResolver);
+    }
+
+    @Override
+    protected int getInitialCursorPosition() {
+        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=675950&r1=675949&r2=675950&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 Fri Jul 11 06:41:25 2008
@@ -47,4 +47,9 @@
         translator.setConnection(connection);
         return translator;
     }
+
+    @Override
+    protected int getInitialCursorPosition() {
+        return 0;
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java?rev=675950&r1=675949&r2=675950&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java Fri Jul 11 06:41:25 2008
@@ -21,7 +21,6 @@
 
 import java.sql.Connection;
 
-import org.apache.cayenne.access.jdbc.SelectAction;
 import org.apache.cayenne.access.trans.SelectTranslator;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.dba.JdbcAdapter;
@@ -47,7 +46,7 @@
 
     @Override
     public SQLAction objectSelectAction(SelectQuery query) {
-        return new SelectAction(query, adapter, entityResolver) {
+        return new PostgresSelectAction(query, adapter, entityResolver) {
 
             @Override
             protected SelectTranslator createTranslator(Connection connection) {

Added: 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=675950&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/postgres/PostgresSelectAction.java Fri Jul 11 06:41:25 2008
@@ -0,0 +1,40 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.dba.postgres;
+
+import org.apache.cayenne.access.jdbc.SelectAction;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.SelectQuery;
+
+/**
+ * @since 3.0
+ */
+class PostgresSelectAction extends SelectAction {
+
+    PostgresSelectAction(SelectQuery query, DbAdapter adapter,
+            EntityResolver entityResolver) {
+        super(query, adapter, entityResolver);
+    }
+
+    @Override
+    protected int getInitialCursorPosition() {
+        return 0;
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/JDBCResultIteratorTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/JDBCResultIteratorTest.java?rev=675950&r1=675949&r2=675950&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/JDBCResultIteratorTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/jdbc/JDBCResultIteratorTest.java Fri Jul 11 06:41:25 2008
@@ -82,41 +82,6 @@
         assertFalse(c.isClosed());
     }
 
-    public void testOffsetConstructorFail() throws Exception {
-        MockConnection c = new MockConnection();
-        MockStatement s = new MockStatement(c);
-        MockResultSet rs = new MockResultSet("rs");
-        rs.addColumn("a", new Object[] {
-                "1", "2", "3"
-        });
-        RowDescriptor descriptor = new RowDescriptorBuilder()
-                .setResultSet(rs)
-                .getDescriptor(new ExtendedTypeMap());
-        JDBCResultIterator it = new JDBCResultIterator(c, s, rs, descriptor, 0, 5);
-        try {
-            it.nextDataRow();
-            fail("Exception expected");
-        }
-        catch (CayenneException e) {
-            System.out.println("ok");
-        }
-    }
-    
-    public void testOffsetConstructorSuccess() throws Exception {
-        MockConnection c = new MockConnection();
-        MockStatement s = new MockStatement(c);
-        MockResultSet rs = new MockResultSet("rs");
-        rs.addColumn("a", new Object[] {
-                "1", "2", "3"
-        });
-        RowDescriptor descriptor = new RowDescriptorBuilder()
-                .setResultSet(rs)
-                .getDescriptor(new ExtendedTypeMap());
-        JDBCResultIterator it = new JDBCResultIterator(c, s, rs, descriptor, 1, 2);
-        Map<String, Object> row = it.nextDataRow();
-        assertNotNull(row);
-    }
-
     JDBCResultIterator makeIterator() throws Exception {
 
         Connection c = new MockConnection();