From be484c39bfb5666a20578ed3fe3371aa02d256e0 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 4 Feb 2013 19:08:07 +0100 Subject: [PATCH] [#1974] Optimise various Executor.fetchOne() methods, which consume the whole ResultSet before throwing an InvalidResultException --- .../org/jooq/impl/AbstractResultQuery.java | 12 +---------- .../src/main/java/org/jooq/impl/Executor.java | 12 +++++------ jOOQ/src/main/java/org/jooq/impl/Utils.java | 20 +++++++++++++++++++ 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index 664b24e3f4..6fda7ce90b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -70,7 +70,6 @@ import org.jooq.ResultQuery; import org.jooq.SQLDialect; import org.jooq.Table; import org.jooq.exception.DataTypeException; -import org.jooq.exception.InvalidResultException; import org.jooq.tools.Convert; import org.jooq.tools.JooqLogger; @@ -409,16 +408,7 @@ abstract class AbstractResultQuery extends AbstractQuery imple @Override public final R fetchOne() { - Result r = fetch(); - - if (r.size() == 1) { - return r.get(0); - } - else if (r.size() > 1) { - throw new InvalidResultException("Query returned more than one result"); - } - - return null; + return Utils.fetchOne(fetchLazy()); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Executor.java b/jOOQ/src/main/java/org/jooq/impl/Executor.java index 8fa20f41d5..a205f8047d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Executor.java +++ b/jOOQ/src/main/java/org/jooq/impl/Executor.java @@ -1316,7 +1316,7 @@ public class Executor implements Configuration { */ @Support public final Record fetchOne(ResultSet rs) throws DataAccessException, InvalidResultException { - return Utils.filterOne(fetchLazy(rs).fetch()); + return Utils.fetchOne(fetchLazy(rs)); } /** @@ -1335,7 +1335,7 @@ public class Executor implements Configuration { */ @Support public final Record fetchOne(ResultSet rs, Field... fields) throws DataAccessException, InvalidResultException { - return Utils.filterOne(fetchLazy(rs, fields).fetch()); + return Utils.fetchOne(fetchLazy(rs, fields)); } /** @@ -1354,7 +1354,7 @@ public class Executor implements Configuration { */ @Support public final Record fetchOne(ResultSet rs, DataType... types) throws DataAccessException, InvalidResultException { - return Utils.filterOne(fetchLazy(rs, types).fetch()); + return Utils.fetchOne(fetchLazy(rs, types)); } /** @@ -1373,7 +1373,7 @@ public class Executor implements Configuration { */ @Support public final Record fetchOne(ResultSet rs, Class... types) throws DataAccessException, InvalidResultException { - return Utils.filterOne(fetchLazy(rs, types).fetch()); + return Utils.fetchOne(fetchLazy(rs, types)); } /** @@ -4163,7 +4163,7 @@ public class Executor implements Configuration { */ @Support public final R fetchOne(Table table) throws DataAccessException, InvalidResultException { - return Utils.filterOne(fetch(table)); + return Utils.fetchOne(fetchLazy(table)); } /** @@ -4180,7 +4180,7 @@ public class Executor implements Configuration { */ @Support public final R fetchOne(Table table, Condition condition) throws DataAccessException, InvalidResultException { - return Utils.filterOne(fetch(table, condition)); + return Utils.fetchOne(fetchLazy(table, condition)); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Utils.java b/jOOQ/src/main/java/org/jooq/impl/Utils.java index ec4d2cfd5a..2422184928 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Utils.java +++ b/jOOQ/src/main/java/org/jooq/impl/Utils.java @@ -84,6 +84,7 @@ import org.jooq.AttachableInternal; import org.jooq.BindContext; import org.jooq.Configuration; import org.jooq.Converter; +import org.jooq.Cursor; import org.jooq.DataType; import org.jooq.EnumType; import org.jooq.ExecuteContext; @@ -450,6 +451,25 @@ final class Utils { return null; } + /** + * Get the only element from a cursor or null, or throw an + * exception + * + * @param cursor The cursor + * @return The only element from the cursor or null + * @throws InvalidResultException Thrown if the cursor returns more than one + * element + */ + static R fetchOne(Cursor cursor) throws InvalidResultException { + R record = cursor.fetchOne(); + + if (cursor.hasNext()) { + throw new InvalidResultException("Cursor returned more than one result"); + } + + return record; + } + /** * Render and bind a list of {@link QueryPart} to plain SQL *