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