]> source.dussan.org Git - jackcess.git/commitdiff
make iterator with no reset return current row first
authorJames Ahlborn <jtahlborn@yahoo.com>
Sun, 7 Apr 2013 00:54:19 +0000 (00:54 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Sun, 7 Apr 2013 00:54:19 +0000 (00:54 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/jackcess-2@703 f203690c-595d-4dc9-a70b-905162fa7fd2

src/java/com/healthmarketscience/jackcess/impl/CursorImpl.java
test/src/java/com/healthmarketscience/jackcess/CursorTest.java

index b0c228a873dd65db246967c15381e4a199129bec..06cda47cf6cfa1c26a90a6bcf0749c340b4405f1 100644 (file)
@@ -675,6 +675,14 @@ public abstract class CursorImpl implements Cursor
     return _rowState.isUpToDate();
   }
 
+  /**
+   * Returns {@code true} of the current row is valid, {@code false} otherwise.
+   */
+  protected boolean isCurrentRowValid() throws IOException {
+    return(_curPos.getRowId().isValid() && !isCurrentRowDeleted() &&
+           !isBeforeFirst() && !isAfterLast());
+  }
+  
   @Override
   public String toString() {
     return getClass().getSimpleName() + " CurPosition " + _curPos +
@@ -717,9 +725,15 @@ public abstract class CursorImpl implements Cursor
       _columnNames = columnNames;
       _moveForward = moveForward;
       _colMatcher = ((columnMatcher != null) ? columnMatcher : _columnMatcher);
-      if(reset) {
-        reset(_moveForward);
-      } 
+      try {
+        if(reset) {
+          reset(_moveForward);
+        } else if(isCurrentRowValid()) {
+          _hasNext = _validRow = true;
+        }
+      } catch(IOException e) {
+        throw new RuntimeIOException(e);
+      }
     }
 
     public boolean hasNext() {
index 0a5e551cbf2a7d224f254338b3cc03e6c2580281..59de129dda145c2a33c2257af95a9530cffcb584 100644 (file)
@@ -287,6 +287,49 @@ public class CursorTest extends TestCase {
     assertEquals(expectedRow, cursor.getCurrentRow());    
   }
 
+  public void testMoveNoReset() throws Exception {
+    for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
+      Database db = createTestTable(fileFormat);
+
+      Table table = db.getTable("test");
+      Cursor cursor = CursorBuilder.createCursor(table);
+      doTestMoveNoReset(cursor);
+
+      db.close();
+    }
+  }
+
+  private static void doTestMoveNoReset(Cursor cursor)
+    throws Exception
+  {
+    List<Map<String, Object>> expectedRows = createTestTableData();
+    List<Map<String, Object>> foundRows = new ArrayList<Map<String, Object>>();
+    
+    Iterator<Row> iter = cursor.newIterable().iterator();
+
+    for(int i = 0; i < 6; ++i) {
+      foundRows.add(iter.next());
+    }    
+
+    iter = cursor.newIterable().reset(false).reverse().iterator();
+    iter.next();
+    Map<String, Object> row = iter.next();
+    assertEquals(expectedRows.get(4), row);
+    
+    iter = cursor.newIterable().reset(false).iterator();
+    iter.next();
+    row = iter.next();
+    assertEquals(expectedRows.get(5), row);
+    iter.next();
+
+    iter = cursor.newIterable().reset(false).iterator();
+    for(int i = 6; i < 10; ++i) {
+      foundRows.add(iter.next());
+    }    
+
+    assertEquals(expectedRows, foundRows);
+  }
+  
   public void testSearch() throws Exception {
     for (final FileFormat fileFormat : JetFormatTest.SUPPORTED_FILEFORMATS) {
       Database db = createTestTable(fileFormat);