From fd0142079156d8307b2d3414aeb5ed8e5a8fb8be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Wed, 20 Jul 2022 11:21:00 +0200
Subject: [PATCH] MAINT: refactor ResultSetIterator

---
 .../java/org/caosdb/server/query/Query.java   | 53 +---------------
 .../server/utils/ResultSetIterator.java       | 60 +++++++++++++++++++
 2 files changed, 61 insertions(+), 52 deletions(-)
 create mode 100644 src/main/java/org/caosdb/server/utils/ResultSetIterator.java

diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index 06345a9b..24be240b 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -40,7 +40,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.UUID;
 import org.antlr.v4.runtime.CharStreams;
@@ -57,7 +56,6 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.implementation.MySQL.ConnectionException;
 import org.caosdb.server.database.backend.implementation.MySQL.MySQLHelper;
 import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity;
-import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.misc.DBHelper;
 import org.caosdb.server.database.misc.TransactionBenchmark;
 import org.caosdb.server.entity.Entity;
@@ -72,6 +70,7 @@ import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.query.CQLParser.CqContext;
 import org.caosdb.server.query.CQLParsingErrorListener.ParsingError;
 import org.caosdb.server.transaction.TransactionInterface;
+import org.caosdb.server.utils.ResultSetIterator;
 import org.jdom2.Element;
 import org.slf4j.Logger;
 
@@ -213,56 +212,6 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
     }
   }
 
-  /**
-   * A class for iterating over {@link ResultSet}
-   *
-   * <p>{@link ResultSet} only provides a `next` function which moves the cursor. The behavior is
-   * here mapped onto the functions of the Iterator interface. TODO Move this generic function?
-   * Check again if an implementation is available from elsewhere.
-   */
-  public static class ResultSetIterator implements Iterator<IdVersionAclTriplet> {
-    public ResultSetIterator(final ResultSet resultset) {
-      this.resultSet = resultset;
-    }
-
-    private ResultSet resultSet;
-    private boolean cursorHasMoved = false;
-    private boolean currentIsValid = true;
-
-    public boolean hasNext() {
-      if (!this.cursorHasMoved) {
-        try {
-          this.currentIsValid = this.resultSet.next();
-        } catch (SQLException e) {
-          throw new TransactionException(e);
-        }
-        this.cursorHasMoved = true;
-      }
-      return this.currentIsValid;
-    };
-
-    public IdVersionAclTriplet next() {
-      if (!this.cursorHasMoved) {
-        try {
-          this.currentIsValid = this.resultSet.next();
-        } catch (SQLException e) {
-          throw new TransactionException(e);
-        }
-      }
-      this.cursorHasMoved = false;
-      if (!this.currentIsValid) {
-        throw new NoSuchElementException();
-      }
-      try {
-        final Integer id = resultSet.getInt("id");
-        final String acl_str = bytes2UTF8(resultSet.getBytes("ACL"));
-        return new IdVersionAclTriplet(id, "", acl_str);
-      } catch (SQLException e) {
-        throw new TransactionException(e);
-      }
-    }
-  }
-
   /** A data class for storing triplets of (Entity ID, version hash, ACL string) */
   public static class IdVersionAclTriplet {
     public IdVersionAclTriplet(final Integer id, final String version, final String acl) {
diff --git a/src/main/java/org/caosdb/server/utils/ResultSetIterator.java b/src/main/java/org/caosdb/server/utils/ResultSetIterator.java
new file mode 100644
index 00000000..0912d278
--- /dev/null
+++ b/src/main/java/org/caosdb/server/utils/ResultSetIterator.java
@@ -0,0 +1,60 @@
+package org.caosdb.server.utils;
+
+import static org.caosdb.server.database.DatabaseUtils.bytes2UTF8;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.query.Query.IdVersionAclTriplet;
+
+/**
+ * A class for iterating over {@link ResultSet}
+ *
+ * <p>{@link ResultSet} only provides a `next` function which moves the cursor. The behavior is here
+ * mapped onto the functions of the Iterator interface. TODO Move this generic function? Check again
+ * if an implementation is available from elsewhere.
+ */
+public class ResultSetIterator implements Iterator<IdVersionAclTriplet> {
+  public ResultSetIterator(final ResultSet resultset) {
+    this.resultSet = resultset;
+  }
+
+  private ResultSet resultSet;
+  private boolean cursorHasMoved = false;
+  private boolean currentIsValid = true;
+
+  public boolean hasNext() {
+    if (!this.cursorHasMoved) {
+      try {
+        this.currentIsValid = this.resultSet.next();
+      } catch (SQLException e) {
+        throw new TransactionException(e);
+      }
+      this.cursorHasMoved = true;
+    }
+    return this.currentIsValid;
+  };
+
+  public IdVersionAclTriplet next() {
+    if (!this.cursorHasMoved) {
+      try {
+        this.currentIsValid = this.resultSet.next();
+      } catch (SQLException e) {
+        throw new TransactionException(e);
+      }
+    }
+    this.cursorHasMoved = false;
+    if (!this.currentIsValid) {
+      throw new NoSuchElementException();
+    }
+    try {
+      final Integer id = resultSet.getInt("id");
+      final String acl_str = bytes2UTF8(resultSet.getBytes("ACL"));
+      return new IdVersionAclTriplet(id, "", acl_str);
+    } catch (SQLException e) {
+      throw new TransactionException(e);
+    }
+  }
+}
-- 
GitLab